avatar

目录
DDoS原理与防御

感觉自己最近很颓废,因为一点小事就想着逃避,然后摸鱼摸一天
为什么要写这篇,主要是因为考试考到了,所以记录学习一下
– 懒狗发言

DDoS简介

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

DDoS危害

出口带宽堵死
游戏掉线导致客户流失
服务器连接数多,连接资源被耗尽
服务器卡、慢、死机、无法连接

攻击来源

高性能服务器配合发包软件
可联网的设备(如打印机、摄像头、电视等等)
移动设备(数量多,增长速度快,其高性能利于组建僵尸网络)
个人PC(存在漏洞的PC或一些黑客迷自愿成为DDOS一员)
骇客控制的僵尸网络(僵尸网络又分为IRC型、HTTP型、P2P型)

流量特点

IP地址随机或固定某些IP段随机
没有完整完成三次握手
地址多数是伪造的
请求数量大、快

导致DDoS原因

个人因素:金钱利益 政治冲突 宗教冲突 为求出名

服务带宽上限 网络协议存在缺陷
服务器设备性能上限
应用性能上限
系统性能上限


攻击类型及防御

Smurf Attack

攻击者向网关发送 ICMP请求包,并将该 ICMP请求报文的源地址 伪造成 受害主机IP地址,目的地址为广播地址。
路由器在接受到该数据包,发现目的地址是广播地址,就会将该数据包广播出去,局域网内所有的 存活主机 都会受到一个 ICMP请求包源地址是受害主机IP。接下来受害主机就会收到该网络内所有主机发来的 ICMP应答报文 ,通过大量返回的ICMP应答报文来淹没受害主机,最终导致网络阻塞,受害主机崩溃。

ddos_1

防护方案:

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

TearDrop Attack

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

ddos_2

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

ddos_3

对比一下正常IP数据包和错误IP数据包

ddos_4

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

网络安全设备将接收到的分片报文先放入缓存中,并根据源IP地址目的IP地址对报文进行分组,源IP地址和目的IP地址均相同的报文归入同一组,然后对每组IP报文的相关分片信息进行检查,丢弃分片信息存在错误的报文。为了防止缓存益处,当缓存快要存满是,直接丢弃后续分片报文。


Land Attack

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

ddos_5

防御方案:

  • 通过设置防火墙和路由规则,检测源IP与目的IP相同的数据包,丢弃、过滤这种数据包。(类似上述的 TearDrop Attack)

SYN flood attack (几个值得了解的关键点来了)

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

ddos_6

防御方案:

  • SYN Check:使用防护设备,3次握手变成了6次握手,由防护设备检测SYN请求是否合法,通过后再由防护设备将报文转发给服务器,后续报文仍由防护设备代理。

  • Micro blocks:管理员可以在内存中为每个SYN请求创建一个小索引(小于16字节),而不必把整个连接对象存入内存。

  • RST cookies:在客户端发起第一个SYN请求后,服务器故意回应一个错误的SYN+ACK报文。如果合法用户收到这个报文,就会给服务器响应RST报文。当服务器收到这个报文时,就将这个主机的IP记录进合法IP列表,下次该主机发起SYN请求时,就可以直接通过了。

  • STACK tweaking:管理员可以调整TCP堆栈以减缓SYN泛洪攻击的影响。这包括减小超时时间等到堆栈存释内放时再分配连接,否则就随机性地删除传入的连接。

ACK Flood Attack

ACK Flood Attack 是利用TCP三次握手过程。这里可以分为两种。

第一种

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

ddos_7

第二种

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

通常DDOS攻击会将ACK flood与SYN flood结合在一起,从而扩大威力。
防御方案可参考如下:

  • 采用CDN进行流量稀释;
  • 避免服务器IP暴露在公网上;
  • 通过限速或动态指纹的方式;
  • 利用对称性判断来分析出是否有攻击存在;
  • 在连续收到用户发送的ACK包时,中断回话,让其重连。

UDP FLood Attack

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

ddos_8

防御方案

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

NTP放大攻击(初步只作点了解)

NTP (Network Time Protocol,网络时间协议),是用来使计算机网络时间同步化的一种协议,它可以使计算机与时钟源进行同步化并提供高精度的时间校正,使用 UDP 123 端口进行通信。
通常在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报文格式,以便了解攻击发生在何处。

ddos_9

报文首部格式

ddos_10

报文首部各字段含义如下,其中高亮是攻击点之一

ddos_11

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

ddos_12

DNS递归查询

ddos_13

DNS递归查询

ddos_14

从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报文大小信息,所以攻击者将这个信息设置的很大,服务器就会根据这个信息生成响应报文。

ddos_15

防御方案

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

SNMP放大攻击

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

下面来看一下SNMP的PDU格式

ddos_16

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

ddos_17

防护方案:

  • 禁止已开启SNMP的设备响应GetBulk请求,避免自己的设备被黑客利用;
  • 更改默认的通信字符串;
  • 修改默认端口161;
  • 隐藏开启SNMP设备的公网IP

TFTP放大攻击

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

ddos_18

超时重传机制

ddos_19

可以看到,TFTP协议 将数据分成好多个数据块进行传输,每个数据块最大为 512字节,客户端在接受到数据块时,需要给服务器端返回一个ACK确认报文,然后才会继续传输下一个报文。若服务器没有收到客户端发来ACK报文,则在时间到达超时计数器时,便会开启重传机制,这也就是攻击利用点。

攻击者利用TFTP协议上的缺陷,伪造源地址向服务器发起请求,服务器回复的第1个data数据包后无法收到客户端发送的ACK。此时TFTP就会利用他的重传机制,定时重传第1个data数据包,当攻击者发出大量的这种请求时,TFTP放大攻击也就发生了。

TFTP 放大攻击示意图

ddos_20

防御方案

  • 不将TFTP服务器暴露在公网上;
  • 对流经TFTP服务的流量进行入侵检测;
  • 将重传(数据包)率设置为1;
  • 只为信任域内的主机提供服务。

CC 攻击 (重点)

CC攻击 (ChallengeCollapsar) 又称作 HTTP 泛洪攻击,其原理是攻击者控制肉鸡、僵尸网络或使用代理服务器,不停地向目标的web服务发送大量合法请求,使得正常用户的web请求处理缓慢甚至得不到处理,制造大量的后台数据库查询动作,消耗目标CPU资源,最终导致服务器宕机崩溃。

这种攻击方式不需要很大的带宽,且无法使用伪造IP地址进行攻击,需要真实的机器与web服务器建立连接,因为HTTP协议是建立在TCP协议上,必须先进行TCP三次握手才能进行HTTP通信。如果目标web服务器支持HTTPS,那么发起的HTTPS泛洪攻击还能穿透一些防护设备。

ddos_20

防御方案

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

HTTP 慢速攻击

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

Slow Loris Attack

HTTP协议规定请求头以一个空行结束,所以 完整的http请求头 结尾是 \r\n\r\n
然而使用非正常的 \r\n 来结尾,就会导致服务端认为我们的请求头还没结束,等待我们继续发送数据直到超时时间。

两种请求头区别如下,CRLF(Carriage Return Line Feed) 表示回车换行

ddos_22

Slow Post Attack

在http头部信息,可以使用 content-length 声明HTTP消息实体的传输长度,服务器端会将 content-length 的值作为 HTTP BODY 的长度。(这个好像Struts2 有类似的漏洞)

利用这一特点,攻击者把 content-length 设置得很大的,然后缓慢发送数据部分,比如一次只发送一个字节,这样服务器端就要一直保持连接,直到客户端传完所有的数据。

Slow Read Attack

攻击者发送一个完整的HTTP数据请求,之后服务器会给出响应,这时攻击者在将自己的TCP窗口大小设置的很小,服务器会根据客户的TCP窗口大小来传送数据。

由于客户端的TCP窗口很小,服务器只能缓慢的传输数据给客户端。当建立大量的这种连接时,web应用的并发连接池将被耗尽,最终导致拒绝服务。

ddos_23

Apache range header Attack

这种攻击方式只针对 Apache,当客户端传输大文件时会有 range字段,表示将大文件分段,分成几个小段进行传输。
例如攻击者将一个文件按照一个字节一段,分成好多段,这样就会造成传输数据缓慢,长时间占用连接,消耗服务器CPU和内存资源。

说一下 Apache 的防护

  • mod_reqtimeout : 控制请求数据传输的超时时间及最小速率

ddos_24

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

ddos_25

  • mod_security : 一个开源的WAF模块,有专门针对慢速攻击防护的规则

ddos_26

其他的中间件防护方案,参考下面的链接


XSS-DOS (稍作了解

利用网站存在的 存储型XXS漏洞,在网站中插入恶意的js代码。代码的功能是不断向web服务器发起大量请求,从而导致服务器宕机,无法响应正常用户的请求。

客户端访问已插入恶意的javascript代码的页面后,流量如下

ddos_27

由于这种攻击的是由 存储型XSS导致的,因此要考虑如何防护 存储型XSS

防护方案

  • 对用户的输入以及url参数进行特殊字符过滤;
  • 对输出内容进行编码转换;
  • 结合黑白名单机制。

时间透镜攻击

通过控制相同源和相同目的IP报文,使得走不同路径的数据包,在同一时刻到达目标服务器,从而达到流量集中攻击的目的。

这种攻击其实我也还弄不太懂,详细信息可以阅读这篇paper:Temporal Lensing and its Application in Pulsing Denial-of-Service Attacks,以及后面的参考链接

攻击示意图

ddos_28
ddos_29

主要扯一下防护方案:增加抖动,干扰攻击路径,使得数据包无法预期到达;由运营商禁止源路由。
其他防御措施:

  • 采用高性能的网络设备;充足的网络带宽保证;升级主机服务器硬件;
  • 避免将服务器的真实IP暴露在公网中
  • 使用CDN对流量进行稀释,当大流量稀释到各个CDN节点时,再对流量进行清洗,从而达到防护源站的目的。然而这种防御方式只能用在对域名发起的DDOS攻击,如果攻击者直接对IP进行攻击,则需要使用 anycast技术 来防御。

参考

ack flood
DDoS和cc的区别
什么是cc攻击
DDoS的大部分攻击形式
Mitigate Slow HTTP GET/POST Vulnerabilities in the Apache HTTP Server
How to Protect Against Slow HTTP Attacks
时间透镜及其在脉冲拒绝服务攻击的应用
《破坏之王_DDoS攻击与防范深度剖析》(书籍网上有电子档)

文章作者: 晓黑
文章链接: https://www.suk1.top/2020/03/29/Ddos%E5%AD%A6%E4%B9%A0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Manayakko - 微笑才是王道
打赏
  • 微信
    微信