python 个套接字上的连接被拒绝(端口已打开,我可以使用 nc 连接)

Connection refused on python sockets (port is open, I can connect with nc)

所以出于个人原因,我想连接到我通过 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() 之后放置例如和无限循环)

你有经典race condition:

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

之前到达远程主机

您需要添加适当的同步。从您显示的代码来看,首先确实没有必要使用两个通道,那么为什么不通过现有的 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 启动和您的程序连接到它之间,任何人都可以连接到端口 3333 和 运行 任意命令。请改用 ssh。