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 time
和 time.sleep(5)
。这样,连接尝试将延迟 5 秒。但是,一般来说,不能保证 5 秒就足够了。
- 向 wait for the port to be taken 发送附加命令,作为 nc 准备就绪的标志。
- 重试多次(中间等待)。
另请注意,您的代码存在三个不同的安全漏洞:
- 您正在使用 telnetlib,它既不能确保命令、输出和密码的机密性,也不能保证其完整性。请改用 ssh。
- 您正在以普通方式连接到端口 3333,这既不能确保命令和输出的机密性,也不能确保其完整性。请改用 ssh。
- 在 nc 启动和您的程序连接到它之间,任何人都可以连接到端口 3333 和 运行 任意命令。请改用 ssh。
所以出于个人原因,我想连接到我通过 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 time
和time.sleep(5)
。这样,连接尝试将延迟 5 秒。但是,一般来说,不能保证 5 秒就足够了。 - 向 wait for the port to be taken 发送附加命令,作为 nc 准备就绪的标志。
- 重试多次(中间等待)。
另请注意,您的代码存在三个不同的安全漏洞:
- 您正在使用 telnetlib,它既不能确保命令、输出和密码的机密性,也不能保证其完整性。请改用 ssh。
- 您正在以普通方式连接到端口 3333,这既不能确保命令和输出的机密性,也不能确保其完整性。请改用 ssh。
- 在 nc 启动和您的程序连接到它之间,任何人都可以连接到端口 3333 和 运行 任意命令。请改用 ssh。