DDOS原理与防御

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应答报文来淹没受害主机,最终导致网络阻塞,受害主机崩溃。下面是smurf攻击示意图

DDOS原理与防御

防护方案:

  • 禁止路由器广播ICMP请求包;
  • 禁止操作系统对广播发出的ICMP请求包做出响应;
  • 配置防火墙静止来自你所处网络外部的ping包

TearDrop攻击

在了解这种攻击之前,需要先知道什么是IP fragmentation(数据包分片)。数据在网络中传输必定会产生数据包被分片,因为每种网络都有不同的最大单个数据包的大小,也就是常说的MTU(Maximum Transmission Unit,最大传输单元)。当要传输的数据超过你要通信的那台主机所处网络的MTU时,数据包就会被分片进行传输,然后在到达目的地再重新组装成原来的数据包,下面是数据包分片重组过程

DDOS原理与防御

TearDrop攻击,就是通过设置错误的片偏移,使得数据包到达目的地时,服务器无法重新组合数据包,因为数据包的组合是通过片偏移来组装的,最终导致崩溃。对比一下正常IP数据包和错误IP数据包

DDOS原理与防御

这种攻击主要对旧的windows版本和Linux版本有效,防护的话,可以检测发来的数据包片偏移是否合法,如果合法在组装,不合法直接丢弃。例如这个:分片重组检查算法

Land Attack

攻击者发动Land Attack攻击时,需要先发出一个SYN数据包,并将数据包的源IP与目的IP都设置成要攻击的目标IP,这样目标在接收到SYN数据包后,会根据源IP回应一个SYN+ACK数据包,即和自己建立一个空连接,然后到达idel超时时间时,才会释放这个连接。攻击者发送大量这样的数据包,从而耗尽目标的TCP连接池,最终导致拒绝服务。攻击过程如下

DDOS原理与防御

防御方案参考如下:这种攻击对早期系统有效。通过设置防火墙和路由规则,检测源IP与目的IP相同的数据包,丢弃、过滤这种数据包。

SYN FLOOD攻击

SYN FLOOD攻击是在TCP三次握手过程中产生的。攻击者通过发送大量伪造的带有SYN标志位的TCP报文,与目标主机建立了很多虚假的半开连接,在服务器返回SYN+ACK数据包后,攻击者不对其做出响应,也就是不返回ACK数据包给服务器,这样服务器就会一直等待直到超时。这种攻击方式会使目标服务器连接资源耗尽、链路堵塞,从而达到拒绝服务的目的。SYN FLOOD攻击图示如下

DDOS原理与防御

防御:
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资源,导致正常的连接无法建立或增加延迟,甚至造成服务器瘫痪、死机。

DDOS原理与防御

第二种:利用TCP三次握手的ACK+SYN应答,攻击者向不同的服务器发送大量的SYN请求,这些SYN请求数据包的源IP均为受害主机IP,这样就会有大量的SYN+ACK应答数据包发往受害主机,从而占用目标的网络带宽资源,形成拒绝服务。

DDOS原理与防御

通常DDOS攻击会将ACK flood与SYN flood结合在一起,从而扩大威力。防御方案可参考如下:采用CDN进行流量稀释;避免服务器IP暴露在公网上;通过限速或动态指纹的方式;利用对称性判断来分析出是否有攻击存在;在连续收到用户发送的ACK包时,中断回话,让其重连。

UDP FLOOD攻击

UDP(User Datagram Protocol,用户数据报协议),是一种无连接和无状态的网络协议,UDP不需要像TCP那样进行三次握手,运行开销低,不需要确认数据包是否成功到达目的地。这就造成UDP泛洪攻击不但效率高,而且还可以在资源相对较少的情况下执行。UDP FLOOD可以使用小数据包(64字节)进行攻击,也可以使用大数据包(大于1500字节,以太网MTU为1500字节)进行攻击。大量小数据包会增大网络设备处理数据包的压力;而对于大数据包,网络设备需要进行分片、重组,最终达到的效果就是占用网络传输接口的带宽、网络堵塞、服务器响应慢等等。

DDOS原理与防御

防御方案:限制每秒钟接受到的流量(可能产生误判);通过动态指纹学习(需要攻击发生一定时间),将非法用户加入黑名单。

NTP放大攻击

NTP(Network Time Protocol,网络时间协议),是用来使计算机网络时间同步化的一种协议,它可以使计算机与时钟源进行同步化并提供高精度的时间校正,使用UDP123端口进行通信。通常在NTP服务器上会有一些调试接口,而利用这些接口中的monlist请求,就可触发放大攻击。当主机向NTP服务器发送monlist查询请求时,NTP服务器会将与之进行时间同步的最后600个IP地址返回。所以攻击者只需要将源地址伪造为受害主机的IP,向NTP服务器发送一个monlist查询请求包,受害主机就会收到大量的UDP响应包。这种攻击在放大攻击里,危害相对较大。下面是NTP放大攻击示意图

DDOS原理与防御

总结一下这种攻击产生的原因,请求与响应数据包不等价;UDP协议的通信模糊性(无数据传输确认机制);以及NTP服务器的无认证机制。再来谈谈防御方案:使用防 DDoS 设备进行清洗;加固并升级NTP服务器;在网络出口封禁 UDP 123 端口;通过网络层或者借助运营商实施 ACL 来防御;关闭现在 NTP 服务的 monlist 功能,在ntp.conf配置文件中增加disable monitor选项。

DNS放大攻击

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

DDOS原理与防御

报文首部格式

DDOS原理与防御

报文首部各字段含义如下,其中绿色高亮是攻击点之一,之后会分析

DDOS原理与防御

下面是问题记录中查询类型可设置的值,我们发现最后一个ANY类型会请求所有记录,这也是一个攻击点

DDOS原理与防御

DNS查询可分为递归查询和迭代查询,下面是DNS迭代查询图

DDOS原理与防御

再来看DNS递归查询图

DDOS原理与防御


从DNS数据包结构以及DNS递归查询过程,我们就可以大致分析出攻击原理。首先,攻击者向僵尸网络发出指令,使僵尸网络中的每一台主机均发出一个伪造源地址的DNS查询请求包,这些请求包查询类型设置为ANY,因为这种类型会请求所有的记录,这些记录会在返回的响应包中,也就是说这种数据包的大小较其他类型是最大的。接着查询类型设为递归查询,为什么不是迭代查询呢,仔细看两种查询的过程图可发现,如果迭代查询第一个请求的DNS服务器没有查询到结果,那么第一个请求的服务器会返回另一个DNS服务器IP,让请求主机向这个IP去继续查询,然而攻击者的数据包源地址是伪造的,所以并不会发起第二次查询,因为第一次查询根本就不是它发起的;而递归查询却是在查询到结果之后,才返回给查询请求发起者。利用这两个特点,攻击者就可以成功发起DNS放大攻击。这种普通的查询请求可以将攻击流量放大2~10倍,如果想增大攻击倍数,可以使用RFC 2671中定义的DNS拓展机制EDNS0。未使用EDNS0时,若响应包大小小于512字节,就使用UDP封装数据;若响应包大小超过512字节,就使用TCP连接或者服务器截断响应报文,丢弃超过512字节的部分,并把TC位置1。这两种方式都不利于进行DNS放大攻击。然而在开启EDNS0机制后,增加了OPT RR字段,这两个字段包含了能够处理的最大UDP报文大小信息,所以攻击者将这个信息设置的很大,服务器就会根据这个信息生成响应报文。最后看一下DNS放大攻击演示图

DDOS原理与防御

防御的话,可以参考以下几点:联系ISP清洗上游流量;DNS服务器只对可信域内提供服务,限制对域外用户提供DNS解析服务;对单个IP的查询速率做限制;拥有足够的带宽承受小规模攻击;关闭DNS服务器的递归查询;利用防火墙等对ANY Request进行过滤。

SNMP放大攻击

SNMP(Simple Network Management Protocol,简单网络管理协议),是目前网络中应用最为广泛的网络管理协议,它提供了一个管理框架来监控和维和互联网设备,它使用UDP161端口进行通信。攻击者向互联网上开启SNMP服务的设备发送GetBulk请求,并使用默认通信字符串作为认证凭据。常见的默认通信字符串如public、private以及一些厂商默认的通信字符串。GetBulk请求是在SNMPv2中添加的的,该请求会让SNMP设备尽可能多的返回数据,这也就是SNMP放大攻击的利用点。下面来看一下SNMP的PDU格式

DDOS原理与防御

攻击者先将源地址改成要攻击的目标IP,再使用默认的通信字符串,向大量SNMP设备发出GetBulk请求,设备收到GetBulk请求数据包后,会将一大段的设备检索信息返回给目标主机,最终目标主机会被这些SNMP设备返回的数据包淹没,导致拒绝服务。看一下SNMP的攻击图

DDOS原理与防御

可以采取以下措施进行防御:禁止已开启SNMP的设备响应GetBulk请求,避免自己的设备被黑客利用;更改默认的通信字符串;修改默认端口161;隐藏开启SNMP设备的公网IP

TFTP放大攻击

TFTP(Trivial File Transfer Protocol,简单文件传输协议),使用UDP 69端口进行通信,由于TFTP使用的是不可靠的UDP协议,所以他不能确保发送的任何报文都能真正到达目的地,因此他必须使用定时器来检测并重传报文,以下是TFTP传输文件过程图

DDOS原理与防御

超时重传机制

DDOS原理与防御

可以看到,TFTP协议将数据分成好多个数据块进行传输,每个数据块最大为512字节,客户端在接受到数据块时,需要给服务器端返回一个ACK确认报文,然后才会继续传输下一个报文。若服务器没有收到客户端发来ACK报文,则在时间到达超时计数器时,便会开启重传机制,这也就是攻击利用点。攻击者利用TFTP协议上的缺陷,伪造源地址向服务器发起请求,服务器回复的第1个data数据包后无法收到客户端发送的ACK。此时TFTP就会利用他的重传机制,定时重传第1个data数据包,当攻击者发出大量的这种请求时,TFTP放大攻击也就发生了。来看一下TFTP放大攻击示意图

DDOS原理与防御

防御方案可参考如下:不要将TFTP服务器暴露在公网上;对流经TFTP服务的流量进行入侵检测;将重传(数据包)率设置为1;只为信任域内的主机提供服务。

CC攻击

CC攻击(ChallengeCollapsar)又称作HTTP 泛洪攻击,其原理是攻击者控制肉鸡、僵尸网络或使用代理服务器,不停地向目标的web服务发送大量合法请求,使得正常用户的web请求处理缓慢甚至得不到处理,制造大量的后台数据库查询动作,消耗目标CPU资源,最终导致服务器宕机崩溃。这种攻击方式不需要很大的带宽,且无法使用伪造IP地址进行攻击,需要真实的机器与web服务器建立连接,因为HTTP协议是建立在TCP协议上,必须先进行TCP三次握手才能进行HTTP通信。如果目标web服务器支持HTTPS,那么发起的HTTPS泛洪攻击还能穿透一些防护设备。

DDOS原理与防御

防御方案:必要时将网页做成静态,减少数据库的使用;限制连接数量;修改最大超时时间;让用户手动输入验证码;在response报文中添加特殊字段,验证IP合法性;屏蔽频繁访问服务器的主机IP。

HTTP慢速攻击

Slow HTTP Dos AttACKs(慢速HTTP拒绝服务攻击),黑客模拟正常用户向web服务器发送慢速http请求,由于是慢速的,服务器端需要保持连接资源,直到数据传输结束或请求结束才可释放连接。当服务器端建立了大量这样的慢速连接,就会导致服务器拒绝服务。这种攻击可以分为两类,一类是客户端发数据,另一类是客户端读取服务器发来的数据。HTTP慢速攻击对基于线程处理的web服务器影响显著,如apache、dhttpd,而对基于事件处理的web服务器影响不大,如ngix、lighttpd。HTTP慢速攻击还可以细分成以下几种攻击方式.

Slowloris攻击方式

HTTP协议规定请求头以一个空行结束,所以完整的http请求头结尾是\r\n\r\n。然而使用非正常的\r\n来结尾,就会导致服务端认为我们的请求头还没结束,等待我们继续发送数据直到超时时间。两种请求头区别如下,CRLF(Carriage Return Line Feed)表示回车换行

DDOS原理与防御

Slow post攻击方式

在http头部信息,可以使用content-length声明HTTP消息实体的传输长度,服务器端会content-length的值作为HTTP BODY的长度。利用这一特点,攻击者把content-length设置得很大的,然后缓慢发送数据部分,比如一次只发送一个字节,这样服务器端就要一直保持连接,直到客户端传完所有的数据。

DDOS原理与防御

Slow read攻击方式

攻击者发送一个完整的HTTP数据请求,之后服务器会给出响应,这时攻击者在将自己的TCP窗口大小设置的很小,服务器会根据客户的TCP窗口大小来传送数据。由于客户端的TCP窗口大小很小,服务器只能缓慢的传输数据给客户端。当建立大量的这种连接时,web应用的并发连接池将被耗尽,最终导致拒绝服务。

DDOS原理与防御

Apache range header攻击

这种攻击方式只针对apache,当客户端传输大文件时会有range字段,表示将大文件分段,分成几个小段进行传输。例如攻击者将一个文件按照一个字节一段,分成好多段,这样就会造成传输数据缓慢,长时间占用连接,消耗服务器CPU和内存资源。
上面这4种攻击方式,也可以参考这篇文章:CC攻击。了解了攻击原理,我们就可以有针对性地进行防御,这里说一下apache的防护策略:设置并使用以下模块
mod_reqtimeout模块,控制请求数据传输的超时时间及最小速率,防护配置如下

DDOS原理与防御

mod_qos模块,Apache的一个服务质量控制模块,用户可配置各种不同阈值,防护配置如下

DDOS原理与防御

mod_security模块,一个开源的WAF模块,有专门针对慢速攻击防护的规则,防护配置如下

DDOS原理与防御

以上是针对Apache的一些防护策略,至于其他中间件的防护,可以参考这篇文章:How to Protect Against Slow HTTP AttACKs

XSS-DOS

利用网站存在的存储型XXS漏洞,在网站中插入恶意的javascript代码。代码的功能是不断向web服务器发起大量请求,从而导致服务器宕机,无法响应正常用户的请求。客户端访问已插入恶意的javascript代码的页面后,抓包截图如下

DDOS原理与防御

由于这种攻击的是由存储型XSS导致的,我们再防御方面就要考虑如何防御存储型XSS。防御策略如下:对用户的输入以及url参数进行特殊字符过滤;对输出内容进行编码转换;结合黑白名单机制。

时间透镜攻击

通过控制相同源和相同目的IP报文,使得走不同路径的数据包,在同一时刻到达目标服务器,从而达到流量集中攻击的目的。这种攻击其实我也还弄不太懂,详细信息可以阅读这篇paper:Temporal Lensing and its Application in Pulsing Denial-of-Service Attacks,或者看这个视频,还有这份中文分析:时间透镜及其在脉冲拒绝服务攻击的应用。看一下freebuf上的一个分析图

DDOS原理与防御

防御方案:增加抖动,干扰攻击路径,使得数据包无法预期到达;由运营商禁止源路由。
其他防御措施:
采用高性能的网络设备;充足的网络带宽保证;升级主机服务器硬件;避免将服务器的真实IP暴露在公网中;使用CDN对流量进行稀释,当大流量稀释到各个CDN节点时,再对流量进行清洗,从而达到防护源站的目的。然而这种防御方式只能用在对域名发起的DDOS攻击,如果攻击者直接对IP进行攻击,则需要使用anycast技术来防御。

0X07总结

这篇文章是自己对DDOS学习的一个总结,当中参考了不少文章书籍,当然还有很多类型的DDOS文中未提及,需要再深入学习,文中若有原理性错误,还望大家指出修正。如果大家有什么好的书籍或关于这方面的资料,欢迎推荐、交流(QQ:379032449),文章仅用于研究,切勿用在非法用途。在下一篇文章中,我将还原大部分DDOS攻击的场景。

参考:
CC攻击
HTTP FLOOD
UDP FLOOD
SNMP GETBULK
SMURF DDOS ATTACK
DNS Amplification AttACK
NTP Amplification AttACKs Using CVE-2013-5211
SNMP REFLECTION/AMPLIFICATION
How To Mitigate Slow HTTP DoS AttACKs in Apache HTTP Server
How to Protect Against Slow HTTP AttACKs
Temporal Lensing and its Application in Pulsing Denial-of-Service Attacks
《TCP-IP协议族(第4版)》
《破坏之王-DDoS攻击与防范深度剖析》