DDOS攻击模拟复现

发布于 2020-06-05  433 次阅读


首发地址:https://xianzhi.aliyun.com/forum/read/2079.html

0X00 前言

我在上一篇文章中,总结了大多数 DDOS 攻击的原理和防御。这篇文章,我将分享大部分 DDOS 攻击的实现以及每个实验环境的搭建步骤。严格来说我做的实验应该叫做 DOS 攻击,但毕竟资源有限,如果多台主机使用同种方式攻击服务器,同样会产生 DDOS 的效果,所以我还是把本次实验都叫做 DDOS 吧。下面所编写的脚本基于 python2.7 环境运行,文章仅供参考研究,切勿用于非法用途。

0X01SYN FLOOD 攻击

环境准备

我们选取 metasploitable2 作为被攻击服务器,在 SYN FLOOD 攻击发起之前,可以正常访问服务器上的 web 服务

模拟攻击

SYN FLOOD 攻击的原理就是阻断 TCP 三次握手的第三次 ACK 包,即不对服务器发送的 SYN+ACK 数据包做出应答。由于服务器没有收到客户端发来的确认响应,就会一直保持连接直到超时,当有大量这种半开连接建立时,即造成 SYN Flood 攻击。所以我们就可以按照这个思路进行数据包构造,这里我使用 python 的 scapy 模块来模拟发包

在发送数据包的同时,我们打开 wireshark 抓包,可以看到目标服务器成功给我们返回 SYN+ACK 数据包,但是第三个数据包确实 RST 数据包而不是 ACK 数据包,这是怎么回事?其实这个 RST 数据包是系统自己发送的,原因在于一开始的 SYN 数据包是我们使用 scapy 发出的,并不是操作系统自己主动发出的,所以当操作系统收到一个 SYN+ACK 数据包时,它会认为这个连接不是我发出的,就会主动拒绝连接,并返回 RST 数据包。既然这样,我们可以使用 linux 下的 iptables 命令禁止系统自动给目标发送 RST 数据包,从而达到建立半开连接的效果,命令如下

接下来我们就可以把刚刚构造数据包的思路加上多线程模块写成一个 SYN FLOOD 攻击脚本,代码如下

脚本使用方法在第 15 行,执行我们的 syn_flood.py 脚本后,发现目标服务器的 web 应用已经无法访问

打开 wireshark 抓包,可以看到抓取到大量的 SYN 请求数据包,而且已经没有 RST 数据包了


我们再登录服务器 (metasploitable2) 上,查看服务器所建立的连接。使用命令 netstat -pantu | grep SYN 查看已建立的 SYN 连接数,可发现此时已建立了大量连接

0X02DNS 放大攻击复现

数据包构造思路

首先,我们需要观察一下 DNS 递归查询数据包的报文格式。使用 dig 命令发送 DNS 查询报文,并同时开启 wireshark 抓包分析

通过 wireshark 可以看到返回的数据包大约是请求数据包的 7 倍。不同域名,dig 命令查询所返回的数据包大小不一样

模拟攻击

接下来,我们使用 scapy 伪造源地址为被攻击目标 IP 向 DNS 服务器发起递归查询,如果向大量的 DNS 服务器发起递归查询,则 DDOS 攻击效果更明显。
d.rd=1 rd:Recursion desired,当 rd=1 时表示进行递归查询

使用 wireshark 抓包查看效果,并验证构造的数据包是否正确

确认数据包构造无误后,就可以开始编写脚本进行 DNS 放大攻击,代码如下

攻击示例

在受害主机上用 wireshark 抓取数据包查看效果,可以看到 DNS 服务器返回了大量的查询响应包

0X03TFTP 放大攻击复现

环境准备

选择 ubuntu 安装 TFTP 服务,并上传一个文件到 TFTP 服务器的根目录

客户端与服务器建立连接过程

模拟攻击

在攻击机 (kali) 上使用 scapy 构造 TFTP 数据包,并同时打开 wireshark 抓包分析构造的数据包是否正确


同时 TFTP 服务器上也使用 wireshark 抓包,可以看到 TFTP 服务器将数据包的第一个分块返回了 6 次,原因在于受害主机并未对 TFTP 发出的数据包做出 ACK 响应,TFTP 由于未收到确认应答,就启动它的重传机制直至超时,返回数据包的大小取决于 TFTP 所传送的文件大小。

受害主机 (ubuntu) 上使用 wireshark 抓包,发现接受到 UDP 协议传来的 6 个数据包

这里计算一下一个数据包的放大倍数:558*6/62=54,如果在加上多线程模块,配合多个主机发包,放大倍数可想而知。

0X04NTP 放大攻击复现

环境准备

我们准备一个 BodhiLinux 模拟公网上开启了 NTP 服务的服务器
打开 BodhiLinux,安装 NTP 服务

这里有个小问题,默认 apt-get install ntp 会安装 ntp-4.2.8p6,然而这个版本无法用于本次实验,因为 ntp4.2.7 及以上的版本中已经禁止了 monlist 功能,所以需要安装 ntp-4.2.6p5,解决方法换 Ubuntu14.04.4 默认更新源,再用 apt-get install ntp 即可。
Ubuntu14.04.4 默认更新 (http://www.cnblogs.com/zlslch/p/6860229.html)
查看 UDP123 端口是否开放:

编辑 / etc/ntp.conf 文件,开启 NTP 服务器 monlist 查询功能:

重启 ntp 服务,配置文件才会生效:

模拟攻击

此时开启 kali 模拟黑客扫描公网上可用的 NTP 服务器,使用 nmap 可完成该目的

当黑客确定目标后,会扫描目标的 UDP123 端口服务,确认其 UDP123 端口是否为 NTP 服务

查看对方 NTP 服务器是否开启 monlist 查询功能

运行上面命令的同时,开启 wireshark 抓包,可抓取 NTP 数据包,用于之后的数据包构造

通过 scapy 按照 NTP 数据包格式构造发包

再次在 kali(攻击机) 上用 wireshark 抓包,验证构造的 NTP 数据包是否有误

Ubuntu(受害主机) 上也用 wireshark 抓包,验证是否收到 NTP 服务器返回的数据包

可以看到,受害主机成功接受从 NTP 服务器返回的查询报文。这里发送一个 NTP 数据包,收到也只有一个 NTP 数据包。理论上应该会收到 100 个数据包,每 6 个 IP 封装在 1 个数据包内,因为开头我们查询的时候,发现就只有 6 个 IP 与我们的 NTP 服务器进行了交互,所以就只能收到一个数据包。所以,现在的思路就是增加 NTP 服务器保存的 IP 表长度。使用 ntpdate NTP 服务器 IP 这条命令可以与 NTP 服务器进行交互,并且 NTP 服务器的 IP 列表中会多一个运行这条命令主机的 IP。图忘记截了,大家自己试一下,运行这条命令的同时,打开 wireshark 抓包观察数据包结构。使用 scapy 如下构造包

可以看到我们成功将 192.168.100.101 添加至 NTP 服务器的 IP 列表里

既然这样,我们就可以写一个脚本,将 NTP 服务器的 IP 列表增大到 600,脚本如下

脚本运行情况

再次查看 NTP 服务器的 IP 列表,已成功增大 IP 列表长度

去掉开头两行非 IP 行,刚好是 600 个 IP

下面我们再来试一下发送一个 NTP 查询包,是否能返回 100 个数据包 (总共 600 个 IP,每 6 个 IP 封装在一个数据包中)
攻击机 (kali) 使用 scapy 构造数据包,并打开 wireshark 抓包观察数据包正确性

受害主机 (ubuntu)wireshark 抓包截图,可以看到刚好收到 100 个数据包

我们可以计算一下放大倍数:482*100/90=535,哇!瞬间变得有趣多了。

0X05SNMP 放大攻击复现

环境准备

在 windows2003 上安装 SNMP 服务



先插入 iso 文件,在点击确定


对安装好的 SNMP 进行配置

模拟攻击

开启 scapy 开始构造 SNMP GetBulk 请求

使用 wireshark 抓包分析

如果需要返回更多的数据,我们可以修改 SNMPbulk 函数里的 max_repetitions 属性的值,至于攻击脚本,按照上面其他类型的放大攻击依葫芦画瓢即可。

0X06XSS-DOS

环境准备

准备一个开启了 web 服务的主机,这里选择 Ubuntu 做演示

WebSocket 协议是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工 (full-duplex) 通信(允许服务器主动发送信息给客户端)。

模拟攻击

这里只是演示攻击,为了方便就不利用存储型 XSS 插入恶意代码,直接在 Ubuntu 的 / var/www/html / 目录下添加 XSS-DOS.php,代码如下

然后使用我们的主机访问 http://190.168.100.102/XSS-DOS.php。192.168.100.102 是 Ubuntu 的 IP,192.168.100.105 是我本机的 IP,由下图可看到,当我本机访问目标服务器时,两者之间建立了大量的连接如果这时有大量的主机访问 http://190.168.100.102/XSS-DOS.php,服务器的 tcp 连接池就会被占满,最终导致拒绝服务。

大家可以观察到,在我们浏览器访问目标服务器一段时间后,我们的浏览器崩溃了,这是因为我们与目标建立的大量的 TCP 连接,这对我们自己主机也是非常消耗内存的,所以说这种攻击属于拼资源型攻击。

0X07HTTP 慢速攻击

环境准备

在攻击端安装 slowhttptest 工具用于 HTTP 慢速攻击:

可以使用 - h 选项来查看使用说明:

这个工具提供了多种方式攻击,细节如下

Slowloris 攻击方式



查看服务端建立的连接数:


此时服务器上的 web 服务已经完全不能访问了。
抓包验证攻击手法:

结尾添加了一个 X-***,这样看我们可能看不出什么,我们将这组数据转换成原始数据看看:

我们看到结尾是 0d0a,0d 表示 \ r,0a 表示 \ n,也就是说结尾是 \ r\n。而正常的请求头结尾应该是 \ r\n\r\n,如果以 \ r\n 结尾,服务器就会认为客户端的数据还没传输完,就需要一直保持连接直到超时。

Slow post 攻击方式


Slow read 攻击方式


我们通过设置 TCP 接收窗口大小为 32(-z 32) 来限制每次服务器给我们发送的数据大小。通过抓包分析,我们可以观察到目标服务器每次只给我们返回 32 字节的数据:

Apache range header 攻击


虽然实验没有成功将服务器宕机,但是还是有必要了解这种攻击方式,我们还是来抓包看一下:


可以看到客户端发送的 HTTP 请求头中添加了 range 字段,大文件分成好多个小段进行传输,这就会消耗服务器大量 CPU 和内存资源。

0X08 总结

终于把大部分的 DDOS 攻击实现了,在这过程中,自己本身也查阅了大量的书籍、博文。从原理到实践,当中有些东西还需要继续深入下去,还有很多实验还没实现,对于 DDOS 的研究还将继续,后续会更新在个人博客,如果大家有什么好的书籍或关于这方面的资料,欢迎推荐交流。文章仅用于研究,切勿用在非法用途。


或许明日太阳西下倦鸟已归时