DDOS总结

DDOS

DDOS攻击模拟复现

0X00前言

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

0X01SYN FLOOD攻击

环境准备

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

模拟攻击

SYN FLOOD攻击的原理就是阻断TCP三次握手的第三次ACK包,即不对服务器发送的SYN+ACK数据包做出应答。由于服务器没有收到客户端发来的确认响应,就会一直保持连接直到超时,当有大量这种半开连接建立时,即造成SYN Flood攻击。所以我们就可以按照这个思路进行数据包构造,这里我使用python的scapy模块来模拟发包
img
在发送数据包的同时,我们打开wireshark抓包,可以看到目标服务器成功给我们返回SYN+ACK数据包,但是第三个数据包确实RST数据包而不是ACK数据包,这是怎么回事?其实这个RST数据包是系统自己发送的,原因在于一开始的SYN数据包是我们使用scapy发出的,并不是操作系统自己主动发出的,所以当操作系统收到一个SYN+ACK数据包时,它会认为这个连接不是我发出的,就会主动拒绝连接,并返回RST数据包。既然这样,我们可以使用linux下的iptables命令禁止系统自动给目标发送RST数据包,从而达到建立半开连接的效果,命令如下
img
接下来我们就可以把刚刚构造数据包的思路加上多线程模块写成一个SYN FLOOD攻击脚本,代码如下
img
脚本使用方法在第15行,执行我们的syn_flood.py脚本后,发现目标服务器的web应用已经无法访问
img
打开wireshark抓包,可以看到抓取到大量的SYN请求数据包,而且已经没有RST数据包了
img
img
我们再登录服务器(metasploitable2)上,查看服务器所建立的连接。使用命令netstat -pantu | grep SYN查看已建立的SYN连接数,可发现此时已建立了大量连接
img

0X02DNS放大攻击复现

数据包构造思路

首先,我们需要观察一下DNS递归查询数据包的报文格式。使用dig命令发送DNS查询报文,并同时开启wireshark抓包分析
img
通过wireshark可以看到返回的数据包大约是请求数据包的7倍。不同域名,dig命令查询所返回的数据包大小不一样
img

模拟攻击

接下来,我们使用scapy伪造源地址为被攻击目标IP 向DNS服务器发起递归查询,如果向大量的DNS服务器发起递归查询,则DDOS攻击效果更明显。
d.rd=1 rd:Recursion desired,当rd=1时表示进行递归查询
img
使用wireshark抓包查看效果,并验证构造的数据包是否正确
img
确认数据包构造无误后,就可以开始编写脚本进行DNS放大攻击,代码如下
img
攻击示例
img
在受害主机上用wireshark抓取数据包查看效果,可以看到DNS服务器返回了大量的查询响应包
img

0X03TFTP放大攻击复现

环境准备

选择ubuntu安装TFTP服务,并上传一个文件到TFTP服务器的根目录
img
客户端与服务器建立连接过程
img

模拟攻击

在攻击机(kali)上使用scapy构造TFTP数据包,并同时打开wireshark抓包分析构造的数据包是否正确
img
img
同时TFTP服务器上也使用wireshark抓包,可以看到TFTP服务器将数据包的第一个分块返回了6次,原因在于受害主机并未对TFTP发出的数据包做出ACK响应,TFTP由于未收到确认应答,就启动它的重传机制直至超时,返回数据包的大小取决于TFTP所传送的文件大小。
img
受害主机(ubuntu)上使用wireshark抓包,发现接受到UDP协议传来的6个数据包
img
这里计算一下一个数据包的放大倍数:558*6/62=54,如果在加上多线程模块,配合多个主机发包,放大倍数可想而知。

0X04NTP放大攻击复现

环境准备

我们准备一个BodhiLinux模拟公网上开启了NTP服务的服务器
打开BodhiLinux,安装NTP服务
img
这里有个小问题,默认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端口是否开放:
img
编辑/etc/ntp.conf文件,开启NTP服务器monlist查询功能:
img
重启ntp服务,配置文件才会生效:
img

模拟攻击

此时开启kali模拟黑客扫描公网上可用的NTP服务器,使用nmap可完成该目的
img
当黑客确定目标后,会扫描目标的UDP123端口服务,确认其UDP123端口是否为NTP服务
img
查看对方NTP服务器是否开启monlist查询功能
img
运行上面命令的同时,开启wireshark抓包,可抓取NTP数据包,用于之后的数据包构造
img
通过scapy按照NTP数据包格式构造发包
img
再次在kali(攻击机)上用wireshark抓包,验证构造的NTP数据包是否有误
img
Ubuntu(受害主机)上也用wireshark抓包,验证是否收到NTP服务器返回的数据包
img
可以看到,受害主机成功接受从NTP服务器返回的查询报文。这里发送一个NTP数据包,收到也只有一个NTP数据包。理论上应该会收到100个数据包,每6个IP封装在1个数据包内,因为开头我们查询的时候,发现就只有6个IP与我们的NTP服务器进行了交互,所以就只能收到一个数据包。所以,现在的思路就是增加NTP服务器保存的IP表长度。使用ntpdate NTP服务器IP 这条命令可以与NTP服务器进行交互,并且NTP服务器的IP列表中会多一个运行这条命令主机的IP。图忘记截了,大家自己试一下,运行这条命令的同时,打开wireshark抓包观察数据包结构。使用scapy如下构造包
img
可以看到我们成功将192.168.100.101添加至NTP服务器的IP列表里
img
既然这样,我们就可以写一个脚本,将NTP服务器的IP列表增大到600,脚本如下
img
脚本运行情况
img
再次查看NTP服务器的IP列表,已成功增大IP列表长度
img
去掉开头两行非IP行,刚好是600个IP
img
下面我们再来试一下发送一个NTP查询包,是否能返回100个数据包(总共600个IP,每6个IP封装在一个数据包中)
攻击机(kali)使用scapy构造数据包,并打开wireshark抓包观察数据包正确性
img
受害主机(ubuntu)wireshark抓包截图,可以看到刚好收到100个数据包
img
我们可以计算一下放大倍数:482*100/90=535,哇!瞬间变得有趣多了。

0X05SNMP放大攻击复现

环境准备

在windows2003上安装SNMP服务
img
img
img
先插入iso文件,在点击确定
img
img
对安装好的SNMP进行配置
img

模拟攻击

开启scapy开始构造SNMP GetBulk请求
img
使用wireshark抓包分析
img
如果需要返回更多的数据,我们可以修改SNMPbulk函数里的max_repetitions属性的值,至于攻击脚本,按照上面其他类型的放大攻击依葫芦画瓢即可。

0X06XSS-DOS

环境准备

准备一个开启了web服务的主机,这里选择Ubuntu做演示
img
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信(允许服务器主动发送信息给客户端)。

模拟攻击

这里只是演示攻击,为了方便就不利用存储型XSS插入恶意代码,直接在Ubuntu的/var/www/html/目录下添加XSS-DOS.php,代码如下
img
然后使用我们的主机访问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连接池就会被占满,最终导致拒绝服务。
img
大家可以观察到,在我们浏览器访问目标服务器一段时间后,我们的浏览器崩溃了,这是因为我们与目标建立的大量的TCP连接,这对我们自己主机也是非常消耗内存的,所以说这种攻击属于拼资源型攻击。
img

0X07HTTP慢速攻击

环境准备

在攻击端安装slowhttptest工具用于HTTP慢速攻击:
img
可以使用-h选项来查看使用说明:
img
这个工具提供了多种方式攻击,细节如下

Slowloris攻击方式
img
img
img
查看服务端建立的连接数:
img
img
此时服务器上的web服务已经完全不能访问了。
抓包验证攻击手法:
img
结尾添加了一个X-***,这样看我们可能看不出什么,我们将这组数据转换成原始数据看看:
img
我们看到结尾是0d0a,0d表示\r,0a表示\n,也就是说结尾是\r\n。而正常的请求头结尾应该是\r\n\r\n,如果以\r\n结尾,服务器就会认为客户端的数据还没传输完,就需要一直保持连接直到超时。

Slow post攻击方式
img
img
img

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

Apache range header攻击
img
img
虽然实验没有成功将服务器宕机,但是还是有必要了解这种攻击方式,我们还是来抓包看一下:
img
img
可以看到客户端发送的HTTP请求头中添加了range字段,大文件分成好多个小段进行传输,这就会消耗服务器大量CPU和内存资源。

0X08总结

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

DNS知识科普:

1.递归查询和迭代查询

递归查询:A问B一个问题,B问C,C问D… 然后D告诉C,C告诉B,B告诉A

迭代查询:A问B一个问题,B不知道答案说你可以问C,然后A再去问C,C推荐D,然后A继续问D,如此迭代…

img

案例


2.权威DNS、递归DNS、公共DNS

权威DNS:域名可以设置默认的DNS,在配置文件中直接注明域名与主机的对应关系。例如:baidu.com的权威DNS是dns.baidu.com

递归DNS:又叫local dns,日常上网中运营商分配的DNS就是递归DNS。其核心功能一个是缓存、一个是递归查询。收到域名查询请求后首先看本地缓存是否有记录,如果没有则一级一级的查询根、顶级域、二级域……直到获取到结果然后返回给用户。

公共DNS:公共DNS属于递归DNS,为所有用户提供公共的递归查询服务。例如:谷歌的8.8.8.8、114的114.114.114.114


3.权威应答和非权威应答

权威应答:

由权威DNS服务器返回的应答就是权威应答。

非权威应答:

①客户端向DNS服务器查询某域名,DNS服务器将本地缓存中记录的IP地址,返回给客户端。

②客户端向DNS服务器查询某域名,DNS服务器推荐客户端到上一级DNS服务器查询。

③客户端向DNS服务器查询某域名,DNS服务器查询其他DNS服务器直到找到,然后此服务器将找到的内容返回给客户端。


DNS放大攻击原理:通过DNS服务器的递归查询,我们可以利用少量的查询流量,来获得大量的返回流量。

①伪造源IP地址为被攻击目标的IP地址。

②向互联网上支持递归查询的DNS服务器发起查询。

有时候,一些权威DNS因为配置不当,也支持递归查询。

root@kali:~# dig any sina.com @223.5.5.5

img

dns数据包

可以看到,发出length79,收到length223,流量被放大。

tips:

nmap -sU -p53 --script=dns-recursion 121.15.170.98

dns-recursion 的nmap脚本测试你的DNS设备是否允许来自外部的递归解析。没有被启用,你只会得到一个开放端口的指示。

refererence:

DNS放大攻击

本地DNS攻击原理与实例

安全客的一篇介绍

-------------本文结束感谢您的阅读-------------