2017-05-09 15 views
0

,我想连接到我通过telnetlib创建一个套接字,我可以从netcat的连接到它,但是当我从蟒蛇尝试拒绝连接。连接被拒绝对蟒蛇插座(端口是开放的,我可以用NC连接),所以因个人原因

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

这样真的是'/ bin/sh的'在你的代码已经证明? –

+0

如果我在远程机器上运行/ usr/bin/nc -l -p 3333 -e/bin/sh,那么这不是问题,我可以通过netcat连接到它 –

+0

您可能会注意到,您从python启动的命令有反引用最后根据你在远程机器上运行的命令显示的代码不会。 –

回答

1

你有一个经典race condition:包含命令

分组在连接请求(TCP SYN数据包)为s.connect之前仅在毫微秒发送一个nc。在启动nc的命令之前,甚至可能发生SYN到达远程主机的情况。

您需要添加适当的同步。从您显示的代码中,实际上并不需要首先使用两个通道,那么为什么不通过现有的Telnet通道将ls发送到远程主机?

如果你绝对必须使用第二通道,请尝试以下选项之一:

  • 只是打电话s.connect之前添加import timetime.sleep(5)。这样,连接尝试将延迟5秒。但是,一般来说,不能保证5秒就够了。
  • 发送额外的命令到wait for the port to be taken,作为nc已准备好的标志。
  • 重试多次(并在两者之间等待)。

另外请注意,你的代码有三个不同的安全漏洞:

  1. 您正在使用telnetlib,既不保证保密性,也没有命令的输出和密码的完整性。改用ssh。
  2. 您正在以纯文本方式连接到端口3333,这既不能确保命令和输出的机密性也不完整。改用ssh。
  3. 在nc starting和连接到它的程序之间,任何人都可以连接到端口3333并运行任意命令。改用ssh。
+0

谢谢你的解释!我设法修复它,我知道它有安全漏洞,但我正在为此进行研究。再次感谢! –

相关问题