使用 C++ 基于 Libnet 编写的 SYN 洪水拒绝服务攻击工具,支持多线程。
原理
以上两个链接分别是 SYN 洪水攻击和拒绝服务攻击的维基百科。基本原理就是在 TCP 建立连接的三次握手过程中,伪造其它 IP 地址,并向服务器发送 SYN,消耗服务器带宽和 CPU 资源。攻击效果取决于参与攻击的肉鸡数量、网络状况、受攻击方的防范能力。
Libnet 环境配置
工具基于 Libnet 编写,Windows下的环境配置较复杂,英文版配置说明可参考托管在 GitHub 上的 README。具体配置如下:
- 从这里下载 LibNET 源代码,从这里下载 WinPcap 的安装包。之后,从这里下载 WpdPack 源代码。
- 假设你将 LibNET 源代码包解压到
E:\libnet-1.2-rc3
,将 WpdPack 包解压到E:\WpdPack
。E:\libnet-1.2-rc3\libnet
下有一个文件夹win32
。你需要使用该目录下的代码建立一个 VS 工程。 - 配置这个工程:在
E:\libnet-1.2-rc3\libnet
和E:\WpdPack
下均有一个名为include
的文件夹,如果你解压的位置和我上一步教程中相同,则这两个文件夹的路径分别为E:\libnet-1.2-rc3\libnet\include
和E:\WpdPack\include
。 将这两个路径添加到工程的 VC++Include
目录。 - 将 WpdPack 的 Lib 目录添加到工程的 VC++
Lib
目录,这里是E:\WpdPack\Lib
. - 编辑
E:\libnet-1.2-rc3\libnet\win32
下的in_systm.h
,在其末尾添加
1 | typedef char int8_t; |
- 现在你可以生成解决方案,如果生成成功,你将在
E:\libnet-1.2-rc3\libnet\win32\Debug
下生成Libnet.dll
和Libnet.lib
。将它们复制到C:\Windows\System32
和C:\Windows\SysWOW64
。至此,LibNET 环境配置完成。
工程环境配置
- 新建一个 VS 工程,目前工程为空。你可以从我托管在 GitHub 上的 仓库 下载源代码:
SYNFlood.cpp
和wingetopt.h
。 - 设置工程:将
E:\libnet-1.2-rc3\libnet\include
、E:\libnet-1.2-rc3\libnet\src
、E:\libnet-1.2-rc3\libnet\include\libnet
、E:\WpdPack\Include
、E:\WpdPack\Include\pcap
添加到工程的 VC++ 目录。 - 添加
E:\WpdPack\Lib
、E:\WpdPack\Lib\x64
、E:\libnet-1.2-rc3\libnet\win32\Debug
添加到工程的 VC++ 链接目录。 - 在工程的链接器输入附加项中添加
libnet.lib
。 - 将
E:\libnet-1.2-rc3\libnet\win32\Debug
添加到链接器附加目录。 - 生成可执行文件。
头文件和宏定义
工程使用到的头文件、宏定义、全局变量和结构体定义如下,其中:
wingetopt.h
是为 Windows 平台编写的 POSIX 系统下的getopt.h
libnet_timersub
宏用于延时gettimeofday
是模仿 POSIX 系统下的gettimeofday
函数编写的 Windows 版本usage
生成提示信息
1 | #include <sys/utime.h> |
选择网卡
函数 select_adapter
用于选择发送 SYN 数据包的网卡,它将列出检测到的所有网卡并由用户输入选择。
1 | int select_adapter(pcap_t **handle) { |
发送线程函数
此函数用于构造并发送 SYN 数据包:
- 根据用户指定参数生成的 speed 的不同,默认全速发送(speed = 0),否则根据 speed 的值在每次发送后延时
- 构造的 SYN 包中,IP 包中的源 IP 和 TCP 包头中的源端口均为随机数
libnet_write
用于发送数据包l
是libnet
中的上下文
1 | unsigned int __stdcall send_syn(PVOID argv){ |
主函数
主函数主要处理用户输入参数并将其格式化,之后根据用户输入参数启动发送线程,线程启动间隔 1s,整个攻击默认持续 12 分钟结束,可以通过 CTRL+C
结束。getopt
按照 ip.port
的格式对输入参数 -t
做划分,例如用户指定攻击的目标 IP 为 10.3.8.211
,端口 80,则输入参数 -t
对应 10.3.8.211.80
。
1 | int main(int argc, char **argv) { |
运行
生成程序支持三个参数:
-t
:设置目标的 IP 地址和端口-s
:设置每个线程每秒钟发送的 SYN 数据包数量,若未指定则默认为 0,即全速发送-p
:设置同时发送 SYN 数据包的线程数
例如,同时启动 4 个攻击线程,每个线程每秒发送 200 个伪造 SYN 数据包,攻击目标为 10.3.8.211:80
:synFlood.exe -t 10.3.8.211.80 -s 200 -p 4
。
启动程序并开始发送后,使用 wireshark 可以捕获到伪造的 SYN 数据包,其中攻击我的 CVM 截图如下,因为 CVM 供应商提供了 DDOS 防护措施,CVM 上的 Web 服务器未收到明显影响。
原创作品,允许转载,转载时无需告知,但请务必以超链接形式标明文章原始出处(http://blog.forec.cn/2016/11/20/ddos-syn-attack/) 、作者信息(Forec)和本声明。