Wild Pointer 程序员问答社区

基于 LibNET 的 SYN Flood 攻击

使用 C++ 基于 Libnet 编写的 SYN 洪水拒绝服务攻击工具,支持多线程。

原理

以上两个链接分别是 SYN 洪水攻击和拒绝服务攻击的维基百科。基本原理就是在 TCP 建立连接的三次握手过程中,伪造其它 IP 地址,并向服务器发送 SYN,消耗服务器带宽和 CPU 资源。攻击效果取决于参与攻击的肉鸡数量、网络状况、受攻击方的防范能力。

Libnet 环境配置

工具基于 Libnet 编写,Windows下的环境配置较复杂,英文版配置说明可参考托管在 GitHub 上的 README。具体配置如下: 这里下载 LibNET 源代码,从这里下载 WinPcap 的安装包。之后,从这里下载 WpdPack 源代码。 假设你将 LibNET 源代码包解压到 E:\libnet-1.2-rc3,将 WpdPack 包解压到 E:\WpdPackE:\libnet-1.2-rc3\libnet 下有一个文件夹 win32。你需要使用该目录下的代码建立一个 VS 工程。 配置这个工程:在 E:\libnet-1.2-rc3\libnetE:\WpdPack 下均有一个名为 include 的文件夹,如果你解压的位置和我上一步教程中相同,则这两个文件夹的路径分别为 E:\libnet-1.2-rc3\libnet\includeE:\WpdPack\include。 将这两个路径添加到工程的 VC++ Include 目录。 将 WpdPack 的 Lib 目录添加到工程的 VC++ Lib 目录,这里是 E:\WpdPack\Lib. * 编辑 E:\libnet-1.2-rc3\libnet\win32 下的 in_systm.h,在其末尾添加

C typedef char int8_t; typedef short int16_t; typedef int int32_t; * 现在你可以生成解决方案,如果生成成功,你将在 E:\libnet-1.2-rc3\libnet\win32\Debug 下生成 Libnet.dllLibnet.lib。将它们复制到 C:\Windows\System32C:\Windows\SysWOW64。至此,LibNET 环境配置完成。

工程环境配置

  • 新建一个 VS 工程,目前工程为空。你可以从我托管在 GitHub 上的 仓库 下载源代码:SYNFlood.cppwingetopt.h
  • 设置工程:将 E:\libnet-1.2-rc3\libnet\includeE:\libnet-1.2-rc3\libnet\srcE:\libnet-1.2-rc3\libnet\include\libnetE:\WpdPack\IncludeE:\WpdPack\Include\pcap 添加到工程的 VC++ 目录。
  • 添加 E:\WpdPack\LibE:\WpdPack\Lib\x64E:\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 生成提示信息

选择网卡

函数 select_adapter 用于选择发送 SYN 数据包的网卡,它将列出检测到的所有网卡并由用户输入选择。

发送线程函数

此函数用于构造并发送 SYN 数据包: 根据用户指定参数生成的 speed 的不同,默认全速发送(speed = 0),否则根据 speed 的值在每次发送后延时 构造的 SYN 包中,IP 包中的源 IP 和 TCP 包头中的源端口均为随机数 libnet_write 用于发送数据包 llibnet 中的上下文

主函数

主函数主要处理用户输入参数并将其格式化,之后根据用户输入参数启动发送线程,线程启动间隔 1s,整个攻击默认持续 12 分钟结束,可以通过 CTRL+C 结束。getopt 按照 ip.port 的格式对输入参数 -t 做划分,例如用户指定攻击的目标 IP 为 10.3.8.211,端口 80,则输入参数 -t 对应 10.3.8.211.80

运行

生成程序支持三个参数: -t:设置目标的 IP 地址和端口 -s:设置每个线程每秒钟发送的 SYN 数据包数量,若未指定则默认为 0,即全速发送 * -p:设置同时发送 SYN 数据包的线程数

例如,同时启动 4 个攻击线程,每个线程每秒发送 200 个伪造 SYN 数据包,攻击目标为 10.3.8.211:80synFlood.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)和本声明。


你需要先登录并激活账号后才可以发表评论。