连接被拒绝在python套接字上(端口打开,我可以连接到nc)

时间:2017-05-09 00:11:58

标签: python sockets telnetlib

因此,出于个人原因,我想连接到我通过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()之后加上无限循环)

1 个答案:

答案 0 :(得分:1)

你有一个经典的race condition

包含启动nc的命令的数据包仅在s.connect的连接请求(TCP SYN数据包)之前的纳秒发送。甚至可能发生SYN在命令启动nc之前到达远程主机。

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

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

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

另请注意,您的代码有三种不同的安全漏洞:

  1. 您正在使用telnetlib,它既不保证命令,输出和密码的机密性,也不保证其完整性。改为使用ssh。
  2. 您正在连接到普通的端口3333,它既不保证命令和输出的机密性,也不保证其完整性。改为使用ssh。
  3. 在nc启动和连接到它的程序之间,任何人都可以连接到端口3333并运行任意命令。改为使用ssh。