DDOS原理与防御

0X00前言
暑假无聊,找了一家公司实习,打算学点东西。这家公司早些年是做抗DDOS设备的,培训的时候就很粗略的讲了部分原理,但是我却对DDOS产生了浓厚的兴趣。一但有了兴趣,便有了研究下去的动力。所以我开始在网络上搜集各种DDOS文章、书籍,学习的同时还做了记录,在此与大家分享,文中必要之处,我会连同协议的工作方式及报文格式一并讲解,这样才能更好的理解攻击触发点。

0X01DDOS简介
DDOS(Distributed Denial of Service),又称分布式拒绝服务攻击。骇客通过控制多个肉鸡或服务器组成的僵尸网络,对目标发送大量看似合法请求,从而占用大量网络资源,瘫痪网络,阻止用户对网络资源的正常访问。

0X02DDOS危害
出口带宽堵死
游戏掉线导致客户流失
服务器连接数多,连接资源被耗尽
服务器卡、慢、死机、无法连接
0X03攻击来源
高性能服务器配合发包软件
可联网的设备(如打印机、摄像头、电视等等)
移动设备(数量多,增长速度快,其高性能利于组建僵尸网络)
个人PC(存在漏洞的PC或一些黑客迷自愿成为DDOS一员)
骇客控制的僵尸网络(僵尸网络又分为IRC型、HTTP型、P2P型)
0X04流量特点
IP地址随机或固定某些IP段随机
没有完整完成三次握手
地址多数是伪造的
请求数量大、快
0X05导致DDOS原因
人类因素
金钱利益
政治冲突
宗教冲突
为求出名
非人类因素
带宽上限
协议缺陷
设备性能上限
应用性能上限
系统性能上限
0X06攻击类型及防御
Smurf攻击
攻击者向网关发送ICMP请求包,并将该ICMP请求报文的源地址伪造成受害主机IP地址,目的地址为广播地址。路由器在接受到该数据包,发现目的地址是广播地址,就会将该数据包广播出去,局域网内所有的存活主机都会受到一个ICMP请求包,源地址是受害主机IP。接下来受害主机就会收到该网络内所有主机发来的ICMP应答报文,通过大量返回的ICMP应答报文来淹没受害主机,最终导致网络阻塞,受害主机崩溃。
防护方案:

禁止路由器广播ICMP请求包;
禁止操作系统对广播发出的ICMP请求包做出响应;
配置防火墙静止来自你所处网络外部的ping包
TearDrop攻击
在了解这种攻击之前,需要先知道什么是IP fragmentation(数据包分片)。数据在网络中传输必定会产生数据包被分片,因为每种网络都有不同的最大单个数据包的大小,也就是常说的MTU(Maximum Transmission Unit,最大传输单元)。当要传输的数据超过你要通信的那台主机所处网络的MTU时,数据包就会被分片进行传输,然后在到达目的地再重新组装成原来的数据包,
TearDrop攻击,就是通过设置错误的片偏移,使得数据包到达目的地时,服务器无法重新组合数据包,因为数据包的组合是通过片偏移来组装的,最终导致崩溃。对比一下正常IP数据包和错误IP数据包
这种攻击主要对旧的windows版本和Linux版本有效,防护的话,可以检测发来的数据包片偏移是否合法,如果合法在组装,不合法直接丢弃。例如这个:分片重组检查算法。

Land Attack
攻击者发动Land Attack攻击时,需要先发出一个SYN数据包,并将数据包的源IP与目的IP都设置成要攻击的目标IP,这样目标在接收到SYN数据包后,会根据源IP回应一个SYN+ACK数据包,即和自己建立一个空连接,然后到达idel超时时间时,才会释放这个连接。攻击者发送大量这样的数据包,从而耗尽目标的TCP连接池,最终导致拒绝服务
防御方案参考如下:这种攻击对早期系统有效。通过设置防火墙和路由规则,检测源IP与目的IP相同的数据包,丢弃、过滤这种数据包。

SYN FLOOD攻击
SYN FLOOD攻击是在TCP三次握手过程中产生的。攻击者通过发送大量伪造的带有SYN标志位的TCP报文,与目标主机建立了很多虚假的半开连接,在服务器返回SYN+ACK数据包后,攻击者不对其做出响应,也就是不返回ACK数据包给服务器,这样服务器就会一直等待直到超时。这种攻击方式会使目标服务器连接资源耗尽、链路堵塞,从而达到拒绝服务的目的。
防御:
SYNCheck:使用防护设备,3次握手变成了6次握手,由防护设备检测SYN请求是否合法,通过后再由防护设备将报文转发给服务器,后续报文仍由防护设备代理。
Micro blocks:管理员可以在内存中为每个SYN请求创建一个小索引(小于16字节),而不必把整个连接对象存入内存。
RST cookies:在客户端发起第一个SYN请求后,服务器故意回应一个错误的SYN+ACK报文。如果合法用户收到这个报文,就会给服务器响应RST报文。当服务器收到这个报文时,就将这个主机的IP记录进合法IP列表,下次该主机发起SYN请求时,就可以直接通过了。
STACK tweaking:管理员可以调整TCP堆栈以减缓SYN泛洪攻击的影响。这包括减小超时时间,等到堆栈存释内放时再分配连接,否则就随机性地删除传入的连接。

ACK FLOOD攻击
ACK FLOOD攻击是利用TCP三次握手过程。这里可以分为两种。
第一种:攻击者伪造大量的SYN+ACK包发送给目标主机,目标主机每收到一个SYN+ACK数据包时,都会去自己的TCP连接表中查看有没有与ACK的发送者建立连接 ,如果有则发送ACK包完成TCP连接,如果没有则发送ACK+RST 断开连接。但是在查询过程中会消耗一定的CUP计算资源。如果瞬间收到大量的SYN+ACK数据包,将会消耗服务器的大量cpu资源,导致正常的连接无法建立或增加延迟,甚至造成服务器瘫痪、死机。

第二种:利用TCP三次握手的ACK+SYN应答,攻击者向不同的服务器发送大量的SYN请求,这些SYN请求数据包的源IP均为受害主机IP,这样就会有大量的SYN+ACK应答数据包发往受害主机,从而占用目标的网络带宽资源,形成拒绝服务。
UDP FLOOD攻击
UDP(User Datagram Protocol,用户数据报协议),是一种无连接和无状态的网络协议,UDP不需要像TCP那样进行三次握手,运行开销低,不需要确认数据包是否成功到达目的地。这就造成UDP泛洪攻击不但效率高,而且还可以在资源相对较少的情况下执行。UDP FLOOD可以使用小数据包(64字节)进行攻击,也可以使用大数据包(大于1500字节,以太网MTU为1500字节)进行攻击。大量小数据包会增大网络设备处理数据包的压力;而对于大数据包,网络设备需要进行分片、重组,最终达到的效果就是占用网络传输接口的带宽、网络堵塞、服务器响应慢等等。防御方案:限制每秒钟接受到的流量(可能产生误判);通过动态指纹学习(需要攻击发生一定时间),将非法用户加入黑名单。

NTP放大攻击
NTP(Network Time Protocol,网络时间协议),是用来使计算机网络时间同步化的一种协议,它可以使计算机与时钟源进行同步化并提供高精度的时间校正,使用UDP123端口进行通信。通常在NTP服务器上会有一些调试接口,而利用这些接口中的monlist请求,就可触发放大攻击。当主机向NTP服务器发送monlist查询请求时,NTP服务器会将与之进行时间同步的最后600个IP地址返回。所以攻击者只需要将源地址伪造为受害主机的IP,向NTP服务器发送一个monlist查询请求包,受害主机就会收到大量的UDP响应包。这种攻击在放大攻击里,危害相对较大。
总结一下这种攻击产生的原因,请求与响应数据包不等价;UDP协议的通信模糊性(无数据传输确认机制);以及NTP服务器的无认证机制。再来谈谈防御方案:使用防 DDoS 设备进行清洗;加固并升级NTP服务器;在网络出口封禁 UDP 123 端口;通过网络层或者借助运营商实施 ACL 来防御;关闭现在 NTP 服务的 monlist 功能,在ntp.conf配置文件中增加disable monitor选项。

DNS放大攻击
DNS(Domain Name System,域名系统),由于使用IP地址来记忆各个网站比较困难,所以就产生了使用主机名称来表示对应的服务器,主机名称通过域名解析的过程转换成IP地址。下面来看一下DNS报文格式,以便了解攻击发生在何处。