DDoS的攻击及防御

47次阅读

共计 13167 个字符,预计需要花费 33 分钟才能阅读完成。

DDoS Distributed Denial of Service(分布式拒绝服务)
一、概念
1. 什么叫“拒绝服务”攻击?
可以简单理解为:让一个公开网站无法访问。要达到这个目的的方法也很简单:不断地提出服务请求,让合法用户的请求无法及时处理。
2. 什么叫“分布式”?
随着网络发展,很多大型企业具备较强的服务提供能力,所以应付单个请求的攻击已经不是问题。道高一尺,魔高一丈,于是乎攻击者就组织很多同伙,同时提出服务请求,直到服务无法访问,这就叫“分布式”。但是在现实中,一般的攻击者无法组织各地伙伴协同“作战”,所以会使用“僵尸网络”来控制 N 多计算机进行攻击。
3. 什么叫“僵尸网络”?
Botnet,就是数量庞大的僵尸程序(Bot)通过一定方式组合,出于恶意目的,采用一对多的方式进行控制的大型网络,也可以说是一种复合性攻击方式。因为僵尸主机的数量很大而且分布广泛,所以危害程度和防御难度都很大。僵尸网络具备高可控性,控制者可以在发布指令之后,就断开与僵尸网络的连接,而控制指令会自动在僵尸程序间传播执行。
节点
僵尸网络由大量功能结点共同组成,可能是普通 PC、服务器或者移动设备。步骤:感染传播 -> 安装执行 -> 接入僵尸网络 -> 命令执行
控制

控制模式
网络规模
组网难度
抗打击性
流行度

IRC 型僵尸网络
一般
较简单
偏弱
国内较少见

HTTP 型僵尸网络
中等
一般
一般
国内较普遍

P2P 型僵尸网络
规模庞大
较困难

多见于国外

危害

发动 DDos 攻击
发送垃圾邮件
窃取敏感信息
抢占系统资源

二、攻击
1. 攻击网络资源带宽
当网络数据包的数量达到或者超过上限的时候,会出现网络拥堵、响应缓慢的情况。DDoS 就是利用这个原理,发送大量网络数据包,占满被攻击目标的全部带宽,从而造成正常请求失效,达到拒绝服务的目的。
直接攻击
(1) ICMP/IGMP Flood
Internet Control Message Protocol(网络控制消息协议)是 TCP/IP 协议族的核心协议之一。它用于在 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈。通过这些消息,管理者可以对所发生的问题做出诊断,然后采取适当的措施解决。
Internet Group Management Protocol(因特网组管理协议)是用于管理因特网协议多播组成员的一种通信协议。IP 主机和相邻的路由器利用 IGMP 来建立多播组的组成员。
攻击者使用受控主机向被攻击目标发送大量的 ICMP/IGMP 报文,进行洪水攻击以消耗目标的宽带资源,这种类型的攻击出现的很早,使用 hping 等工具就能简单的发起攻击。但现在使用这种方法发动的攻击已见不多,被攻击目标可以在其网络边界直接过滤并丢弃 ICMP/IGMP 数据包使攻击无效化。
但是这种直接方式通常依靠受控主机本身的网络性能,所以效果不是很好,还容易被查到攻击源头。于是反射攻击就出现。
(2) UDP Flood
User Datagram Protocol(用户数据包协议)是一种面向无连接的传输层协议,主要用于不要求分组顺序到达的传输,提供面向事务的简单的不可靠信息传送服务。
利用 UDP 数据报文,攻击者也可以发送洪水攻击,UDP 洪水攻击和 ICMP/IGMP 洪水攻击的原理基本相同,通常,攻击者会使用小包和大包两种方式进行攻击。
小包是指 64 字节大小的数据包,这是以太网上传输数据帧的最小值,在相同流量下,单包体积越小,数据包的数量就越多。由于交换机、路由器等网络设备需要对没一个数据包进行检查和校验,因此使用 UDP 小包攻击能够最有效的增大网络设备处理数据包的压力,造成处理速度的缓慢和传输延迟等拒绝服务攻击的效果。
大包是指 1500 字节以上的数据包,其大小超过了以太网的最大传输单元 (MTU),使用 UDP 大包攻击,能够有效的占用网络接口的传输宽带,并迫使被攻击目标在接受到 UDP 数据时进行分片重组,造成网络拥堵,服务器响应速度变慢。
UDP 洪水攻击也是很早就出现的一种拒绝服务攻击方式,这种攻击发动简单,有相当多的工具都能够发动 UDP 洪水攻击,如 hping、LOIC 等,但 UDP 洪水攻击完全依靠受控主机本身的网络性能,因此通常对目标宽带资源的消耗并不太大。
反射和放大攻击
反射攻击又被称为 DRDoS(Distributed Reflection Denial of Service 分布式反射拒绝服务)攻击,是指利用路由器、服务器等设施对请求产生应答,从而反射攻击流量并隐藏攻击来源的一种分布式拒绝服务攻击技术。
在进行反射攻击时,攻击者使用受控主机发送大量的数据包,这些数据包的特别之处在于,其目的 IP 地址指向作为反射器的服务器、路由器等设施,而源 IP 地址则被伪造成被攻击目标的 IP 地址,反射器在收到数据包时,会认为该数据包是否被攻击目标所发来的请求,因此会将相应数据发送给被攻击目标,当大量的响应数据包涌向攻击目标时,就会耗尽目标的网络宽带资源,造成拒绝服务攻击。
放大攻击是一种特殊的反射攻击,其特殊之处在于反射器对于网络流量具有放大作用,因此我们也可以将这种反射器成为放大器,进行放大攻击的方式与反射攻击的方式也是基本一致的,不同之处在于反射器(放大器)所提供的网络服务需要满足一定条件。
在反射器所提供的网络服务协议中,需要存在请求和响应数据量不对称的情况,响应数据量需要大于请求数据量,响应数据量与请求数据量的比值越大,放大器的放大倍数也就越大,进行放大攻击所产生的消耗宽带资源的效果也就越明显。
(1) ACK 反射攻击
在传输控制协议建立连接时,首先会进行 TCP 三次握手,在这个过程中,当服务器端接收到客户端发来的 SYN 连接请求时,会对该请求进行 ACK 应答,利用 TCP 握手的 ACK 应答,即可进行 ACK 反射攻击。
如果攻击者将 SYN 的源 IP 地址伪造成被攻击目标的 IP 地址,服务器的应答也就会直接发送给被攻击目标,由于使用 TCP 协议的服务在互联网上广泛存在,攻击者可以通过受控主机向大量不同的服务器发送伪造源 IP 地址的 SYN 请求,从而使服务器响应的大量 ACK 应答数据涌向被攻击目标,占用目标的网络宽带资源并拒绝服务。
(2) DNS 放大攻击
Domain Name System(域名系统)是因特网的一项核心服务,它作为可以将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住那些难以记忆的 IP 地址,DNS 使用的 TCP 与 UDP 端口号都是 53,主要使用的 UDP 协议。
通常,DNS 的相应数据包会比查询数据包大,因此攻击者利用普通的 DNS 查询请求就能够发动放大攻击,并将攻击流量放大 2~10 倍,但更有效的方法是使用 RFC2671 中定义的 DNS 扩展机制 EDNS0。
在 EDNS0 中,扩展了 DNS 数据包的结果,增加了 OPT RR 字段,在 OPT RR 字段中,包含了客户端能够处理的最大 UDP 报文大小的信息,服务器在响应 DNS 请求时,解析并记录下客户端能够处理的最大 UDP 报文的大小,并根据该大小生成响应的报文。
攻击者能够利用 dig 和 EDNS0 进行高效的 DNS 放大攻击,攻击者向广泛存在的开放 DNS 解析器发送 dig 查询命令,将 OPT RR 字段中 UDP 报文大小设置为很大的值,并将请求的源 IP 地址伪造成被攻击目标的 IP 地址。DNS 解析器收到查询请求后,会将解析的结果发送给被攻击目标,当大量的解析结果涌向目标时,就会导致目标网络拥堵和缓慢,造成拒绝服务攻击。攻击者发送的 DNS 查询请求数据包大小一般为 60 字节左右,而查询返回结果的数据包大小通常为 300 字节以上,因此,使用该方式进行放大攻击能够达到 50 倍以上的放大效果。
(3) NTP 放大攻击
Network Time Protocol(网络时间协议)是用来使计算器时间同步化的一种协议,它可以使计算机与时钟源进行同步化并提供高精准度的时间校正,NTP 使用 UDP 123 端口进行通信。
在 NTP 协议的服务器实现上,通常会实现一系列 Mode 7 的调试接口,而接口中的 monlist 请求能够获取到目标 NTP 服务器进行同步的最后 600 个客户端的 IP 地址等信息。这意味着,只需要发送一个很小的请求包,就能触发大量连续的包含 IP 地址信息等数据的 UDP 响应数据包。
实际上,monlist 请求返回的数据量与一段时间内和 NTP 服务器交互的客户端数据量有关,由于 NTP 服务使用的是 UDP 单包通信,因此攻击者可以将伪造源 IP 地址的 UDP 请求包发送给 NTP 放大器,伪造客户端与 NTP 服务器的交互,增加“和 NTP 服务器交互的客户端的数量”,以此来增加 monlist 请求的响应数据量并增大 NTP 放大器的放大倍数,只要向 NTP 放大器发送 600 个不超过 64 字节的请求包(约 40KB 数据),就能够快速的将 NTP 放大器的放大倍数提高到 700 倍以上,并在该服务器的 NTP 服务关闭或重新启动之前一直保持这么大的放大倍数。攻击者发送的 monlist 请求数据包大小不超过 64 字节,而请求返回的结果会包含 100 个 482 字节的 UDP 响应数据,因此使用该方式进行放大攻击能够达到 700 倍以上的放大效果。
(4) SNMP 放大攻击
Simple Network Management Protocol(简单网络管理协议)是目前网络中应用最为广泛的网络管理协议,它提供了一个管理框架来监控和维护互联网的设备,SNMP 协议使用 UDP 161 端口进行通信。
利用 SNMP 协议中的默认通信字符串和 GetBulk 请求,攻击者能够开展有效的 SNMP 放大攻击。
许多厂商安装的 SNMP 都采用了默认的通信字符串(Community String),这些通信字符串是程序获取设备信息和修改配置必不可少的,最常见的默认通信字符串是 public 和 private,除此之外还有许多厂商私有的默认通信字符串,几乎所有运行 SNMP 的网络设备上,都可以找到某种形式的默认通信字符串。
在 SNMPv1 中定义的 get 请求可以尝试一次获取多个 MIB 对象,但响应消息的大小受到设备处理能力的限制,如果设备不能返回全部请求的响应,则会返回一条错误信息。在 SNMPv2 中,添加了 Getbulk 请求,该请求会通知设备返回尽可能多的数据,这使得管理程序能够通过发送一次请求就获得大段的检索信息。
攻击者向广泛存在并开启了 SNMP 服务的网络设备发送 Getbulk 请求,使用默认通信字符串作为认证凭据,并将源 IP 地址伪造成攻击目标的 IP 地址,设备收到 Getbulk 请求后,会将响应结果发送给攻击目标,当大量的响应结果涌向攻击目标时,就会导致攻击目标网络拥堵和缓慢,造成拒绝服务攻击。攻击者发送的 Getbulk 请求数据包约为 60 字节,而请求的响应数据能够达到 1500 字节以上,因此,使用该方式进行放大攻击能够达到 25 倍以上的放大效果,这也是一种放大效应明显且有效的放大攻击方式。
攻击链路
攻击链路与以前介绍的几种攻击方法有所不同,其攻击的目标并不是作为互联网断点的服务器的宽带资源,而是骨干网上的链路的宽带资源,对链路进行攻击的一种典型的方式是 Coremelt 攻击。
Coremelt 是安全研究人员在 2009 年提出的一种针对链路的分布式拒绝服务攻击方法,攻击者需要控制一个分布足够广泛的僵尸网络来发动 Coremelt 攻击。
首先,攻击者通过 traceroute 等手段来判断各个僵尸主机和将要攻击的链路之间的位置关系,并根据结果将僵尸主机分为两个部分,然后,攻击者控制僵尸主机,使其与链路另一侧的每一台僵尸主机进行通信并收发大量数据,这样,大量的网络数据包就会经过骨干网上的被攻占链路,造成网络拥堵和延时。
从骨干网上来看,这些僵尸主机之间相互收发的数据包确实是真是存在的通信数据,没有办法将这些通信数据与真正的合法通信数据进行有效的区分,因此这种攻击方式更加难以防护和缓解。
2. 攻击系统资源
攻击 TCP 连接
Transmission Control Protocol(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通讯协议,不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是 IP 层无法提供这样的流机制,在现实的互联网中,这种连接通常通过 TCP 协议来实现。
TCP 连接包括三个阶段:连接创建,数据传送和连接终止,由于在协议的设计过程当中只专注于协议的可用性,而没有对协议的安全性进行比较周密和详细的考虑,因此 TCP 协议存在很多安全缺陷和安全性问题。
(1) TCP 连接洪水攻击
TCP 连接洪水攻击是在连接创建阶段对 TCP 资源进行攻击的。
在三次握手进行的过程中,服务器会创建并保存 TCP 连接的信息,这个信息通常被保存在连接表结构中,但是,连接表的大小是有限的,一旦服务器接收到的连接数量超过了连接表能存储的数量,服务器就无法创建新的 TCP 连接了。攻击者可以利用大量受控主机,通过快速建立大量恶意的 TCP 连接占满被攻击目标的连接表,使目标无法接受新的 TCP 连接请求,从而达到拒绝服务攻击的目的。
(2) SYN Flood
SYN 洪水攻击就是攻击者利用受控主机发送大量的 TCP SYN 报文,使服务器打开大量的半开连接,占满服务器的连接表,从而影响正常用户与服务器建立会话,造成拒绝服务。
在建立 TCP 连接的过程中,如果在服务器返回 SYN+ACK 报文后,客户端由于某种原因没有对其进行确认,这时服务器端就需要重传 SYN+ACK 报文,并等待客户端的确认报文直到 TCP 连接超时,这种等待客户确认的连接状态通常被称为半开连接。
在连接超时之前,半开连接会一直保存在服务器的连接表中。由于连接表的大小是有限的,如果在短时间内产生大量的半开连接,而这些连接又无法很快的结束,连接表就会很快被占满,导致新的连接 TCP 连接无法建立。
攻击者在发送 TCP SYN 报文时,可以在收到服务器返回的 SYN+ACK 报文后,跳过最后的 ACK 报文发送,使连接处于半开状态,但是这样会很明显的暴露出进行 SYN 洪水攻击的 IP 地址,同时相应报文会作为反射流量占用攻击者的宽带资源,所以更好的方式是攻击者将 SYN 报文的源 IP 地址随机伪造其他主机的 IP 地址或者不存在的 IP 地址,这样攻击目标将会应答发送给被伪造的 IP 地址,从而占用连接资源并隐藏攻击来源。
(3) PSH+ACK Flood
由于带有 PSH 标志位的 TCP 数据包会强制要求接收端将接收缓冲区清空并将数据提交给应用服务进行处理,因此当攻击者利用受控主机向攻击目标发送大量的 PSH+ACK 数据包时,被攻击目标就会消耗大量的系统资源不断地进行接收缓冲区的清空处理,导致无法正常处理数据,从而造成拒绝服务。
在正常的 TCP 传输过程当中,如果待发送的数据会清空发送缓冲区,那么操作系统的 TCP/IP 协议栈就会自动为该数据包设置 PSH 标志,同样,当服务端接收到一个设置了 PSH+ACK 标志的报文时,意味着当前数据传输已经结束,因此需要立即将这些数据投递交给服务进程并清空接收缓冲区,而无须等待判断是否还会有额外的数据到达。
(4) RST Flood
在 TCP 连接的终止阶段,通常是通过带有 FIN 标志报文的四次交互(TCP 四次握手)来切断客户端与服务端的 TCP 连接,但是客户端或服务器其中之一出现异常状况,无法正常完成 TCP 四次握手以终止连接时,就会使用 RST 报文将连接强制中断。
在 TCP 连接中,RST 表示复位,用来在异常时关闭连接,发送端在发送 RST 报文关闭连接时,不需要等待缓冲区中的数据报全部发送完毕,而会直接丢弃缓冲器的数据并发送 RST 报文,同样,接收端在收到 RST 报文后,也会清空缓冲区并关闭连接,并且不必发送 ACK 报文进行确认。
攻击者可以利用 RST 报文的这个特性,发送伪造的带有 RST 标志位的 TCP 报文,强制中断客户端与服务端的 TCP 连接,在伪造 RST 报文的过程中,服务端的 IP 地址和端口号是已知的,攻击者还需要设法获取客户端的 IP 地址和端口号,并且使 RST 报文的序列号处于服务器的接收窗口之内,如果攻击者和被攻击客户端或服务器处于同一内网,这些信息可以通过欺骗和嗅探等方式获取到。
很多情况下,攻击者不会与被攻击客户端或服务器处于同一内网,导致发动 TCP RST 攻击时难以获取端口和序列号,在这种情况下,攻击者可以利用大量的受控主机猜测端口和序列号,进行盲打,发送 RST 洪水攻击,只要在数量巨大的 RST 报文中有一条与攻击目标的端口号相同,并且序列号落在目标的接收窗口之中,就能够终端连接。
Sockstress 攻击
Sockstress 攻击是研究人员在 2008 年提出的一种攻击 TCP 连接的方法,与前面几种攻击方式不同的是,Sockstress 攻击不需要在短时间内发送大量的攻击流量,因此不属于洪水攻击,而是一种慢速攻击。
在 TCP 传输数据时,并不是将数据直接递交给应用程序处理,而是先临时存储在接受缓冲区里,该接收缓冲区的大小是由 TCP 窗口表示的,如果 TCP 窗口大小为 0,则表示接收缓冲区已被填满,发送端应该停止发送数据,知道接收端的窗口发生了更新,Sockstress 攻击就是利用该原理长时间维持 TCP 连接,以达到拒绝服务攻击的目的。
Sockstress 攻击首先会完成 TCP 三次握手以建立 TCP 连接,但是在三次握手的最后一次 ACK 应答中,攻击者将其 TCP 窗口大小设置为 0,随后进行一次数据请求,攻击目标在传输数据时,发现接收端的 TCP 窗口大小为 0,就会停止传输数据,并发出 TCP 窗口探测包,询问攻击者其 TCP 窗口是否有更新,由于攻击者没有更改 TCP 窗口的大小,被攻击目标就会一直维持 TCP 连接等待数据发送,并不断进行窗口更新的探测,如果攻击者利用大量的受控主机进行 Sockstress 攻击,被攻击目标会一直维持大量的 TCP 连接并进行大量窗口更新探测,其 TCP 连接表会逐渐耗尽,无法连接新的连接而导致拒绝服务。
攻击 SSL 连接
Secure Sockets Layer(安全套接层)是为网络通信提供安全及数据完整性的一种安全协议,SSL 能够在传输层对网络连接进行加密,以防止传输的数据明文被监听和截获。
然而,SSL 协议加密、解密和秘钥协商的过程中会消耗大量的系统资源,严重降低机器的性能,因此,通常只有在传输密码等机密信息时才使用 SSL 协议进行传输。攻击者可以利用 SSL 协议消耗资源的特性进行拒绝服务攻击。
(1) THC SSL DoS 攻击
在进行 SSL 数据传输之前,通信双方首先要进行 SSL 握手,以协商加密算法交换加密秘钥,进行身份验证,通常情况下,这样的 SSL 握手过程只需要进行一次即可,但是在 SSL 协议中有一个 Renegotiation 选项,通过它可以进行秘钥的重新协商以建立新的秘钥。
THC SSL DOS 攻击是安全研究人员在 2011 年提出的一种针对 SSL 的拒绝服务攻击方法,这种方法就是利用 Renegotiation 选项,造成被攻击目标资源耗尽,在进行 SSL 连接并握手之后,攻击者反复不断的进行秘钥重新协商过程,而秘钥重新协商过程需要服务器投入比客户端多 15 倍的 CPU 计算资源,攻击者只需要一台普通的台式机就能拖慢一台高性能服务器,而如果有大量主机同时进行攻击,则会使服务器忙于协商秘钥而完全停止响应。
(2) SSL Flood
在进行 SSL 握手的过程中,服务器会消耗较多的 CPU 计算资源进行加解密,并进行数据的有效性检验,对于客户端发过来的数据,服务器需要先花费大量的计算资源进行解密,之后才能对数据的有效性进行检验,重要的是,不论数据是否是有效的,服务器都必须先进行解密才能够做检查,攻击者可以利用这个特性进行 SSL 洪水攻击。
在进行洪水攻击时,一个要点是需要攻击者能够在客户端大量的发出攻击请求,这就需要客户端所进行的计算尽可能的少,对于 SSL 洪水攻击,比较好的方式是在数据传输之前,进行 SSL 握手的过程中发动攻击,攻击者并不需要完成 SSL 握手和秘钥交换,而只需要在这个过程中让服务器去解密和验证,就能够大量的消耗服务器的计算资源,因此,攻击者可以非常容易的构造秘钥交换过程中的请求数据,达到减少客户端计算量的目的。
3. 攻击应用资源
攻击 DNS 服务
Domain Name System(域名系统)服务是互联网的一项核心服务,通过使用 DNS,人们在访问网络时不需要记住其 IP 地址,而只需输入其域名即可,在 IPv6 网络环境下,由于 IP 地址由原来的 32 位扩展到了 128 位,变得更加难以记忆,DNS 服务也就变得更加重要,当 DNS 服务的可用性收到威胁时,互联网上的大量设备都会受到影响甚至无法正常运行。
(1) DNS QUERY Flood
DNS 查询和解析过程:
当客户端向 DNS 服务器查询某域名时,DNS 服务器会首先检查其本地缓存中是否有该域名的记录,如果缓
存中有该域名的记录(即命中),则直接讲缓存中记录的 IP 地址作为非权威应答返回给客户端,如果在
缓存中没有找到该域名的记录,则会进行迭代查询,从根域名开始,逐级进行域名解析,直到解析出完
整的域名,之后服务器会将域名解析结果作为应答发送给客户端,并生成一条解析记录保存到缓存中。
在 DNS 解析的过程中,客户端发起一次查询请求,DNS 服务器可能需要进行额外的多次查询才能完成解析的过程并给出应答,在这个过程中会消耗一定的计算和网络资源,如果攻击者利用大量受控主机不断发送不同域名的解析请求,那么 DNS 服务器的缓存会被不断刷新,而大量解析请求不能命中缓存又导致 DNS 服务器必须消耗额外的资源进行迭代查询,这会极大的增加 DNS 服务器的资源消耗,导致 DNS 响应缓慢甚至完全拒绝服务。
(2) DNS NXDOMAIN Flood
DNS NXDOMAIN 洪水攻击是 DNS QUERY 洪水攻击的一个变种攻击方式,区别在于后者是向 DNS 服务器查询一个真实存在的域名,而前者是向 DNS 服务器查询一个不存在的域名。(NXDOMAIN = Non-eXistent Domain)
在进行 DNS NXDOMAIN 洪水攻击时,DNS 服务器会进行多次域名查询,同时,其缓存会被大量 NXDOMAIN 记录所填满,导致响应正常用户的 DNS 解析请求的速度变慢,这与 DNS QUERY 洪水攻击所达到的效果类似,除此之外,一部分 DNS 服务器在获取不到域名的解析结果时,还会再次进行递归查询,向其上一级的 DNS 服务器发送解析请求并等待应答,这进一步增加了 DNS 服务器的资源消耗,因此,DNS NXDOMAIN 洪水攻击通常比 DNS QUERY 洪水攻击的效果更好。
攻击 Web 服务
近年来,Web 技术发展非常迅速,人们可以通过浏览器使用 Web 服务,简单方便的获取需要的信息,而许多机构和企业的重要信息和关键业务也是通过 Web 服务的方式对外提供,一旦 Web 服务受到解决服务攻击,就会对其承载的业务造成致命的影响。
(1) HTTP Flood
Web 服务通常使用 HyperText Transfer Protocol(超文本传输协议)进行请求和响应数据的传输。
常见的 HTTP 请求有 GET 请求和 POST 请求两种,通常 GET 请求用于从 Web 服务器获取数据和资源,例如请求页面、获取图片和文档等;POST 请求用于向 Web 服务器提交数据和资源,例如发送用户名 / 密码、上传文件等。在处理这些 HTTP 请求的过程中,Web 服务器通常需要解析请求、处理和执行服务端脚本、验证用户权限并多次访问数据库,这会消耗大量的计算资源和 I / O 访问资源。
攻击者利用大量的受控主机不断的向 Web 服务器发送恶意大量 HTTP 请求,要求 Web 服务器处理,就会完全占用服务器的资源,造成其他正常用户的 Web 访问请求处理缓慢设置得不到处理,导致拒绝服务,这就是 HTTP 洪水攻击。
由于 HTTP 协议是基于 TCP 协议的,需要完成三次握手建立 TCP 连接才能开始 HTTP 通信,因此进行 HTTP 洪水攻击时无法使用伪造源 IP 地址的方式发动攻击,这时,攻击者通常会使用 HTTP 代理服务器,HTTP 代理服务器在互联网上广泛存在,通过使用 HTTP 代理服务器,不仅可以隐藏来源以避免被追查,还能够提高攻击的效率——攻击者连接代理服务器并发送完成请求后,可以直接切断与该代理服务器的连接并开始连接下一个代理服务器,这时代理服务器与目标 Web 服务器的 HTTP 连接依然保持,Web 服务器需要继续接收数据并处理 HTTP 请求。
与 DNS 服务类似,Web 服务也存在缓存机制,如果攻击者的大量请求都命中了服务器缓存,那么这种攻击的主要作用仅体现再消耗网络宽带资源上,对于计算和 I / O 资源的消耗是非常有限的,因此,高效的 HTTP 洪水攻击应不断发出针对不同资源和页面的 HTTP 请求,并尽可能请求无法被缓存的资源,从而加重服务器的负担,增强攻击效果。
此外,如果 Web 服务器支持 HTTPS, 那么进行 HTTPS 洪水攻击是更为有效的一种攻击方式,一方面,在进行 HTTPS 通信时,Web 服务器需要消耗更多的资源用来进行认证和加解密,另一方面,一部分的防护设备无法对 HTTPS 通信数据流进行处理,也会导致攻击流量绕过防护设备,直接对 Web 服务器造成攻击。
HTTP 洪水攻击是目标对 Web 服务威胁最大的攻击之一,有大量的攻击工具支持 HTTP 洪水攻击,发动简单其效果明显,已经成为攻击者使用的主要攻击方式之一。
(2) Slowloris 攻击
Slowloris 攻击是一种针对 web 服务器的慢速 HTTP 攻击,由安全研究人员在 2009 年提出。
在 HTTP 协议中规定,HTTP 头部以连续的“rnrn”作为结束标志,许多 Web 服务器在处理 HTTP 请求的头部信息时,会等待头部传输结束后再进行处理,因此,如果 Web 服务器没有接受到连续的“rnrn”,就会一直接受数据并保持与客户端的连接,利用这个特性,攻击者能够长时间与 Web 服务器保持联系,并逐渐耗尽 Web 服务器的连接资源。
攻击者在发送 HTTP GET 请求时,缓慢的发送无用的 header 字段,并且一直不发送“rnrn”结束标志,这样就能够长时间占用与 Web 服务器的连接并保证该连接不被超时中断,然而,Web 服务器能够处理的并发连接数是有限的,如果攻击者利用大量的受控主机发送这种不完整的 HTTP GET 请求并持续占用这些连接,就会耗尽 Web 服务器的连接资源,导致其他用户的 HTTP 请求无法被处理,造成拒绝服务。
(3) 慢速 POST 请求攻击
慢速 POST 请求攻击也是一种针对 Web 服务器的慢速 HTTP 攻击,由安全研究人员在 2010 年提出,与 Slowloris 攻击不同的是,慢速 POST 请求攻击利用缓慢发送 HTTP BODY 的方式达到占用并耗尽 Web 服务器连接资源的目的。
在 HTTP 头部信息中,可以使用 Content-Length 字段来指定 HTTP 消息实体的传输长度,当 Web 服务器接收到的请求头部中含有 Content-Length 字段时,服务器会将该字段的值作为 HTTP BODY 的长度,持续接收数据并在达到 Content-Length 值时对 HTTP BODY 的数据内容进行处理,利用这个特性,攻击者能够长时间与 Web 服务器保持连接,并逐渐耗尽 Web 服务器的连接资源。
攻击者在发送 HTTP POST 请求时,在请求头部中将 Content-Length 设置为一个很大的值,并将 HTTP BODY 以非常缓慢的速度一个字节一个字节的向 Web 服务器发送,这样,Web 服务器就需要一直维持与客户端的连接并等待数据传输结束,由于 Content-Length 被设置成了很大的值,而 HTTP BODY 的传输速度又非常缓慢,攻击者就可以长时间占用这个连接,通过间断性的发送单字节的 HTTP BODY 内容,攻击者就能够确保连接不因超时而导致中断,如果攻击者利用大量的受控主机发送这种缓慢的 HTTP POST 请求并持续占用这些连接,就会耗尽 Web 服务器的连接资源,导致其他用户的 HTTP 请求无法被处理,造成拒绝服务。
(4) 数据处理过程攻击
Web 服务器在收到 HTTP 请求之后,需要检查并处理其中的数据,通过恶意构造请求数据的内容,攻击者可以显著的增加数据处理过程中的资源消耗,造成拒绝服务攻击。
这里以正则表达式拒绝服务攻击和哈希冲突拒绝服务攻击为例进行说明。
正则表达式拒绝服务攻击又被称为 ReDoS,是安全研究人员在 2009 年发现的一种拒绝服务攻击方法,在处理请求数据时,Web 应用通常会使用正则表达式进行字符的匹配操作,一部分正则表达式引擎会使用一种被称为非确定性有限状态自动机的实现方式,以便能够处理复杂的正则表达式,例如包含了向后引用或者捕获括号的正则表达式。然而,这种正则引擎的实现方式也导致了其处理时间增加,尤其是在确定“否定匹配”时,正则引擎需要对所有可能的匹配路径全部进行测试,如果位于 Web 应用中的正则表达式写的不好,需要测试的匹配路径数量会随着输入字符串的长度呈指数级增长,利用恶意构造的输入字符串,攻击者只需要提交相对较短的输入字符串,就可以强制正则引擎处理数亿个匹配路径,所需时间可以达到几个小时甚至几天,只需要几个这种类似的恶意正则表达式匹配请求,就能够完全占用 Web 服务器的计算资源,造成 Web 服务器拒绝服务。
哈希冲突拒绝服务攻击是安全研究人员在 2011 年提出的一种拒绝服务攻击方法,web 应用在处理请求中的 POST 数据时,通常使用键 - 值对的方式来进行存储,在 PHP、Python、Java 等语言中,键 - 值对的实质是一个哈希表,web 应用程序通过计算“键”的哈希来获取其所对应的的“值”。正常情况下,这个哈希表的哈希冲突较少,因此进行查找和插入的速度很快,正常状态下的哈希表如图所示。
如果攻击者构造一组恶意的 POST 数据,使得请求中的“键”的哈希值全部相同,那么保存 POST 数据的哈希表就会因此退化成为链表,对哈希表的查找和插入等操作规则变成了对链表的遍历操作,造成大量的计算资源被占用,导致拒绝服务攻击。如图所示为大量冲突状态下的哈希表。
三、防御
设置高性能设备
要保证网络设备不能成为瓶颈,因此选择路由器、交换机、硬件防火墙等设备的时候要尽量选用知名度高、口碑好的产品。再就是假如和网络提供商有特殊关系或协议的话就更好了,当大量攻击发生的时候请他们在网络接点处做一下流量限制来对抗某些种类的 DDoS 攻击是非常有效的。
带宽得保证
网络带宽直接决定了能抗受攻击的能力,假若仅仅有 10M 带宽的话,无论采取什么措施都很难对抗现在的 SYN Flood 攻击。所以,最好选择 100M 的共享带宽,当然是挂在 1000M 的主干上了。
不要忘记升级
在有网络带宽保证的前提下,请尽量提升硬件配置,要有效对抗每秒 10 万个 SYN 攻击包。而且最好可以进行优化资源使用,提高 web server 的负载能力。
异常流量的清洗
通过 DDoS 硬件防火墙对异常流量的清洗过滤,通过数据包的规则过滤、数据流指纹检测过滤、及数据包内容定制过滤等顶尖技术能准确判断外来访问流量是否正常,进一步将异常流量禁止过滤。
考虑把网站做成静态页面
把网站尽可能做成静态页面,不仅能大大提高抗攻击能力,而且还给黑客入侵带来不少麻烦,最好在需要调用数据库的脚本中,拒绝使用代理的访问,经验表明,使用代理访问你网站的 80% 属于恶意行为。
分布式集群防御
这是目前网络安全界防御大规模 DDoS 攻击的最有效办法。分布式集群防御的特点是在每个节点服务器配置多个 IP 地址,并且每个节点能承受不低于 10G 的 DDoS 攻击,如一个节点受攻击无法提供服务,系统将会根据优先级设置自动切换另一个节点,并将攻击者的数据包全部返回发送点,使攻击源成为瘫痪状态,从更为深度的安全防护角度去影响企业的安全执行决策。
IP 轮询技术
对稳定性、流畅性以及安全性上要求较高的业务,用户遭受 DDoS 攻击且达到一定峰值时,系统通过 IP 轮询机制,将从 IP 池中灵活调取一个新的 IP 充当业务 IP,使攻击者失去攻击目标,以此保证业务在 DDoS 的攻击下正常运转。
BGP 高防 IP
当用户应用 BGP 高防 IP 且配置转发规则和域名回源后,此时所有的访问流量都将流经 BGP 高防 IP 集群,通过端口协议转发的方式(支持网站业务和非网站业务)将访问流量转发至源站,同时攻击流量将在 BGP 高防 IP 集群进行清洗和过滤,只会将正常业务流量返回至源站,从而确保源站业务的稳定。
运营商过滤
针对反射放大类攻击,都有相同的特点,可以直接在运营商侧进行过滤,不用将流量流入抗 D 设备,从而使防御与反射放大类压制更有效果。本不存在放大效果,但基于其真实 IP 的原因,穿透性与隐蔽性都十分显著。
流量预压制
流量预压制 /UDP 预压制等能力,从容应对新型的超大流量攻击。(Memcached 的 5W 倍反射)

参考资料:绿盟科技博客,原文链接《破坏之王:DDos 攻击与防范深度剖析》作者:鲍旭华、洪海、曹志华
相关资料:http://www.freebuf.com/articl…

正文完
 0