我必须调试一个通过 ssh 通信的软件。由于我需要确切地知道软件在通信中发送了什么并且解密 ssh 通信并不容易,我想制作一个 python ssh 服务器客户端,它接受来自软件的通信,将其所有消息传输到实际服务器并在我的终端打印它们。
我得到了这段代码我设法执行从paramiko github页面获取rsa密钥:
import os
import paramiko
import socket
import sys
import threading
CWD = os.path.dirname(os.path.realpath(__file__))
HOSTKEY = paramiko.RSAKey(filename=os.path.join(CWD, '.test_rsa.key'))
class Server (paramiko.ServerInterface):
def __init__(self):
self.event = threading.Event()
def check_channel_request(self, kind, chanid):
if kind == 'session':
return paramiko.OPEN_SUCCEEDED
return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
def check_auth_password(self, username, password):
if (username == 'tim') and (password == 'sekret'):
return paramiko.AUTH_SUCCESSFUL
if __name__ == '__main__':
server = '127.0.0.1'
ssh_port = 22
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((server, ssh_port))
sock.listen(100)
print('[+] Listening for connection ...')
client, addr = sock.accept()
except Exception as e:
print('[-] Listen failed: ' + str(e))
sys.exit(1)
else:
print(f'[+] Got a connection! from {addr}')
bhSession = paramiko.Transport(client)
bhSession.add_server_key(HOSTKEY)
server = Server()
bhSession.start_server(server=server)
chan = bhSession.accept(20)
if chan is None:
print('*** No channel.')
sys.exit(1)
print('[+] Authenticated!')
print(chan.recv(1024).decode())
chan.send('Welcome to bh_ssh')
try:
while True:
command = input("Enter command: ")
if command != 'exit':
chan.send(command)
r = chan.recv(8192)
print(r.decode())
else:
chan.send('exit')
print('exiting')
bhSession.close()
break
except KeyboardInterrupt:
bhSession.close()
但是当我尝试时:
ssh [email protected]
然后输入密码,我进入客户端:
PTY allocation request failed on channel 0
shell request failed on channel 0
在服务器端:
[+] Listening for connection ...
[+] Got a connection! from ('127.0.0.1', 53674)
[+] Authenticated!
Traceback (most recent call last):
File "/home/marco/ssh_man_in_the_middle/./sshserver.py", line 52, in <module>
chan.send('Welcome to bh_ssh')
File "/usr/lib/python3/dist-packages/paramiko/channel.py", line 801, in send
return self._send(s, m)
File "/usr/lib/python3/dist-packages/paramiko/channel.py", line 1198, in _send
raise socket.error("Socket is closed")
OSError: Socket is closed
lsof /dev/pts 似乎并不表示我达到了 256 个已用终端的限制。我也不能卸载 /dev/pts 因为我总是得到“目标很忙”。
我该怎么做才能继续?
这是因为你实际上没有在你的服务器中实现PTY。
ServerInterface.check_channel_pty_request
。默认实现只返回True
。这就是 SSH 客户端失败的原因。
虽然我不确定你是否真的需要这样做。当您的软件“通过ssh通信”时,您的软件甚至使用PTY吗?