查看原文
其他

DDoS 攻击的方法

计算机与网络安全 计算机与网络安全 2022-06-01

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:16004488


微信公众号:计算机与网络安全

ID:Computer-network

分布式拒绝服务攻击:利用分布式的客户端,向服务提供者发起大量看似合法的请求,消耗或长期占用大量资源,从而达到拒绝服务的目的。本文介绍各种分布式拒绝服务攻击方法。


虽然都是在消耗目标资源,但是不同的分布式拒绝服务攻击方法所产生的影响依然有所不同。我们会为每种分布式拒绝服务攻击方法给出流行度、简单度和影响力的评分,最后给出这种攻击手段的综合风险率。看过《黑客大曝光——网络安全机密与解决方案》(本文尾可购买)的读者可能会对这种风险评级的方式感到非常熟悉,下面对这几个方面的评分进行一下说明。


  • 流行度:利用这种手段对实际目标进行攻击的频率,1代表最少见,10代表最常见。

  • 简单度:利用这种攻击手段所需的技能,10代表需要的技能最少,1代表只有资深的安全人员才能实施。

  • 影响力:攻击得手时可能造成的损失大小和进行防护的难度,1代表损失很小并且非常容易防护,10代表损失会非常大,而且难以防护。

  • 风险率:前三个数字的平均值(四舍五入为整数),这个数值给出了某种攻击手段总体的危害程度。


从不同的角度看,分布式拒绝服务攻击的方法有不同的分类标准。依据消耗目标资源的不同,将分布式拒绝服务攻击分为攻击网络带宽资源、攻击系统资源和攻击应用资源三类。我们还会从其他的一些角度对分布式拒绝服务攻击进行归类,并对混合攻击进行简要的介绍。

一、攻击网络带宽资源


我们都知道,互联网实际上是由大量的网络设备将大量终端连接起来所组成的一个庞大的网络,如果想获取某台服务器上的服务资源,则需要将请求数据通过特定链路传输到这台服务器上。如同客人想要用餐,就需要知道快餐店的位置,并且到达快餐店点餐(这里我们暂时不考虑快餐店的外卖服务)。但是,如果快餐店的门口或者它所在的街道发生了拥堵和交通管制,客人就无法到达快餐店,也就无法得到服务。


同样的道理,无论是服务器的网络接口带宽,还是路由器、交换机等互联网基础设施,其数据包处理能力都是存在着事实上的上限的,当到达或通过的网络数据包数量超过了这个上限时,就会出现网络拥堵、响应缓慢的情况。消耗网络带宽资源的分布式拒绝服务攻击就是根据这个原理,利用受控主机发送大量的网络数据包,占满被攻击目标的全部带宽,从而使正常的请求无法得到及时有效的响应,造成拒占满被攻击目标的全部带宽,从而使正常的请求无法得到及时有效的响应,造成拒绝服务。


(一)直接攻击


直接攻击(如下图所示)使用大量的受控主机直接向被攻击目标发送大量的网络数据包,以占满被攻击目标的带宽,并消耗服务器和网络设备的网络数据处理能力,达到拒绝服务的目的。


直接攻击

直接攻击的主要方法有ICMP/IGMP洪水攻击和UDP洪水攻击两种。


1、ICMP/IGMP洪水攻击


网络控制消息协议(Internet Control Message Protocol,ICMP)是TCP/IP协议族的核心协议之一。它用于在TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈。通过这些信息,管理者可以对所发生的问题做出诊断,然后采取适当的措施解决。


因特网组管理协议(Internet Group Management Protocol,IGMP)是用于管理因特网协议多播组成员的一种通信协议。IP主机和相邻的路由器利用IGMP来建立多播组的组成员。


攻击者使用受控主机向被攻击目标发送大量的ICMP/IGMP报文,进行洪水攻击以消耗目标的带宽资源。这种类型的攻击出现得很早,使用hping等工具就能够简单地发起攻击。但现在使用这种方法发动的攻击已不多见,被攻击目标可以在其网络边界直接过滤并丢弃ICMP/IGMP数据包使攻击无效化。


2、UDP洪水攻击


用户数据报协议(User Datagram Protocol,UDP)是一种面向无连接的传输层协议,主要用于不要求分组顺序到达的传输,提供面向事务的简单的不可靠信息传送服务。


利用UDP数据报文,攻击者也可以发动洪水攻击。UDP洪水攻击和ICMP/IGMP洪水攻击的原理基本相同。通常,攻击者会使用小包和大包两种方式进行攻击。


小包是指64字节大小的数据包,这是以太网上传输数据帧的最小值。在相同流量下,单包体积越小,数据包的数量就越多。由于交换机、路由器等网络设备需要对每一个数据包进行检查和校验,因此使用UDP小包攻击能够最有效地增大网络设备处理数据包的压力,造成处理速度的缓慢和传输延迟等拒绝服务攻击的效果。


大包是指1500字节以上的数据包,其大小超过了以太网的最大传输单元(MTU)。使用UDP大包攻击,能够有效地占用网络接口的传输带宽,并迫使被攻击目标在接收到UDP数据时进行分片重组,造成网络拥堵,服务器响应速度变慢。


UDP洪水攻击也是很早就出现的一种拒绝服务攻击方式,这种攻击发动简单,有相当多的工具都能够发动UDP洪水攻击,如hping、LOIC等。但UDP洪水攻击完全依靠受控主机本身的网络性能,因此通常对攻击目标带宽资源的消耗并不太大。


(二)反射和放大攻击


攻击者可以使用ICMP洪水攻击、UDP洪水攻击等方式直接对被攻击目标展开消耗网络带宽资源的分布式拒绝服务攻击,但这种方式不仅低效,还很容易被查到攻击的源头。虽然攻击者可以使用伪造源IP地址的方式进行隐藏,但更好的方式是使用反射攻击技术。


反射攻击又被称为DRDoS(Distributed Reflection Denial of Service,分布式反射拒绝服务)攻击,是指利用路由器、服务器等设施对请求产生应答,从而反射攻击流量并隐藏攻击来源的一种分布式拒绝服务攻击技术。


反射攻击的基本原理如下图所示。


反射攻击

在进行反射攻击时,攻击者使用受控主机发送大量的数据包,这些数据包的特别之处在于,其目的IP地址指向作为反射器的服务器、路由器等设施,而源IP地址则被伪造成被攻击目标的IP地址。反射器在收到数据包时,会认为该数据包是由被攻击目标所发来的请求,因此会将响应数据发送给被攻击目标。当大量的响应数据包涌向攻击目标时,就会耗尽目标的网络带宽资源,造成拒绝服务攻击。


发动反射攻击需要在互联网上找到大量的反射器,某些种类的反射攻击并不难实现。例如,对于ACK反射攻击,只需要找到互联网上开放TCP端口的服务器即可,而这种服务器在互联网上的存在是非常广泛的。


发动反射攻击通常会使用无须认证或握手的协议。反射攻击需要将请求数据的源IP地址伪造成被攻击目标的IP地址,如果使用的协议需要进行认证或者握手,则该认证或握手过程没有办法完成,也就不能进行下一步的攻击。因此,绝大多数的反射攻击都是使用基于UDP协议的网络服务进行的。


相比于直接伪造源地址的分布式拒绝服务攻击,反射攻击由于增加了一个反射步骤,因此更加难以追溯攻击来源。但是,这并不是反射攻击真正的威胁,真正的威胁在于利用反射原理进行的放大攻击。


放大攻击是一种特殊的反射攻击,其特殊之处在于反射器对于网络流量具有放大作用,因此我们也可以将这种反射器称为放大器。进行放大攻击的方式与反射攻击的方式也是基本一致的,不同之处在于反射器(放大器)所提供的网络服务需要满足一定条件。


在反射器提供的网络服务协议中,需要存在请求和响应数据量不对称的情况,响应数据量需要大于请求数据量。响应数据量与请求数据量的比值越大,放大器的放大倍数也就越大,进行放大攻击所产生的消耗带宽资源的效果也就越明显。


放大器所使用网络服务部署的广泛性决定了该放大攻击的规模和严重程度。如果存在某些网络服务,不需要进行认证并且放大效果非常好,但是在互联网上部署的数量很少,那么利用该网络服务进行放大也不能达到很大的流量,达不到有效消耗带宽资源的效果,这种网络服务也就不能作为主要的放大攻击流量,而只能作为辅助手段。


1、ACK反射攻击


我们知道,在传输控制协议(Transmission Control Protocol,TCP)建立连接时,首先会进行TCP三次握手。在这个过程中,当服务器端接收到客户端发来的SYN连接请求时,会对该请求进行ACK应答。利用TCP握手的ACK应答,即可进行ACK反射攻击。


ACK反射攻击是比较常见的一种反射攻击技术,其攻击原理如下图所示。

ACK反射攻击

如果攻击者将SYN的源IP地址伪造成被攻击目标的IP地址,服务器的应答也就会直接发送给被攻击目标。由于使用TCP协议的服务在互联网上广泛存在,攻击者可以通过受控主机向大量不同的服务器发送伪造源IP地址的SYN请求,从而使服务器响应的大量ACK应答数据涌向被攻击目标,占用目标的网络带宽资源并造成拒绝服务。


在发动ACK反射攻击时,首先需要进行扫描,获得大量的反射器地址,并分别向这些反射器发送伪造源地址的SYN请求数据,因此相比于直接攻击,这种方式显得复杂了一些。ACK反射攻击的优点主要在于其能够比较有效地隐藏攻击的来源。


2、DNS放大攻击


域名系统(Domain Name System,DNS)是因特网的一项核心服务。它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住那些难以记忆的IP地址。DNS使用的TCP与UDP端口号都是53,主要使用UDP协议。


通常,DNS响应数据包会比查询数据包大,因此攻击者利用普通的DNS查询请求就能够发动放大攻击,并将攻击流量放大2~10倍。但更有效的方法是使用RFC 2671中定义的DNS扩展机制EDNS0。


EDNS0。


在没有EDNS0以前,对DNS查询的响应数据包被限制在512字节以内。当需要应答的数据包超过512字节时,根据DNS服务实现的不同,可能会丢弃超过512字节的部分,也可能会使用TCP协议建立连接并重新发送。无论是哪种方式,都不利于进行DNS放大攻击。


在EDNS0中,扩展了DNS数据包的结构,增加了OPT RR字段。在OPT RR字段中,包含了客户端能够处理的最大UDP报文大小的信息。服务端在响应DNS请求时,解析并记录下客户端能够处理的最大UDP报文的大小,并根据该大小生成响应的报文。


攻击者能够利用dig(Domain Information Groper)和EDNS0进行高效的DNS放大攻击。攻击者向广泛存在的开放DNS解析器发送dig查询命令,将OPT RR字段中的UDP报文大小设置为很大的值(如4096),并将请求的源IP地址伪造成被攻击目标的IP地址。DNS解析器收到查询请求后,会将解析的结果发送给被攻击目标。当大量的解析结果涌向目标时,就会导致目标网络拥堵和缓慢,造成拒绝服务攻击。


DNS放大攻击的原理如下图所示。

DNS放大攻击

攻击者发送的DNS查询请求数据包大小一般为60字节左右,而查询返回结果的数据包大小通常为3000字节以上,因此,使用该方式进行放大攻击能够达到50倍以上的放大效果,这种放大效应所产生的攻击效果是非常惊人的,只要攻击的发起端能够发出2Gbit/s的带宽,就能够在目标网络处产生100Gbit/s的带宽消耗。在2013年3月对Spamhaus的分布式拒绝服务攻击中,主要就是用了DNS放大攻击技术,使得攻击流量达到了史无前例的300Gbit/s,甚至拖慢了局部互联网的响应速度。


与ACK反射攻击类似,发动DNS放大攻击也需要先进行扫描,以获得大量的开放DNS解析器的地址,并向这些开放DNS解析器发送伪造源地址的查询命令来放大攻击流量。


3、NTP放大攻击


网络时间协议(Network Time Protocol,NTP)是用来使计算机时间同步化的一种协议,它可以使计算机与时钟源进行同步化并提供高精准度的时间校正,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服务关闭或重新启动之前一直保持这么大的放大倍数。


NTP放大攻击的原理如下图所示。

NTP放大攻击

攻击者发送的monlist请求数据包大小不超过64字节,而请求返回的结果会包含100个482字节的UDP响应数据,因此,使用该方式进行放大攻击能够达到700倍以上的放大效果。


与ACK反射攻击和DNS放大攻击类似,发动NTP放大攻击也需要先进行网络扫描,以获得大量的NTP服务器,并向这些NTP服务器发送伪造源地址的请求来放大攻击流量。相比于DNS放大攻击,NTP放大攻击的放大倍数更大,因此其危害也更加严重,在针对Spamhaus的大规模分布式拒绝服务攻击事件中,如果攻击者不使用DNS放大攻击而改用NTP放大攻击,那么攻击流量将会达到2Tbit/s以上。


4、SNMP放大攻击


简单网络管理协议(Simple Network Management Protocol,SNMP)是目前网络中应用最为广泛的网络管理协议,它提供了一个管理框架来监控和维护互联网设备。SNMP协议使用UDP 161端口进行通信。


利用SNMP协议中的默认通信字符串和GetBulk请求,攻击者能够开展有效的SNMP放大攻击。


由于SNMP的效果很好,网络硬件厂商开始把SNMP加入到它们制造的每一台设备,这导致各种网络设备上都可以看到默认启用的SNMP服务,从交换机到路由器,从防火墙到网络打印机,无一例外。同时,许多厂商安装的SNMP都采用了默认的通信字符串(Community String),这些通信字符串是程序获取设备信息和修改配置必不可少的。最常见的默认通信字符串是public和private,除此之外还有许多厂商私有的默认通信字符串。几乎所有运行SNMP的网络设备上,都可以找到某种形式的默认通信字符串。


在SNMPv1中定义的Get请求可以尝试一次获取多个MIB对象,但响应消息的大小受到设备处理能力的限制。如果设备不能返回全部请求的响应,则会返回一条错误信息。在SNMPv2中,添加了GetBulk请求,该请求会通知设备返回尽可能多的数据,这使得管理程序能够通过发送一次请求就获得大段的检索信息。


攻击者向广泛存在并开启了SNMP服务的网络设备发送GetBulk请求,使用默认通信字符串作为认证凭据,并将源IP地址伪造成攻击目标的IP地址。设备收到GetBulk请求后,会将响应结果发送给攻击目标。当大量的响应结果涌向攻击目标时,就会导致攻击目标网络拥堵和缓慢,造成拒绝服务攻击。


SNMP放大攻击的原理如下图所示。

SNMP放大攻击

攻击者发送的GetBulk请求数据包约为60字节,而请求的响应数据能够达到1500字节以上,因此,使用该方式进行放大攻击能够达到25倍以上的放大效果。这也是一种放大效应明显且有效的放大攻击方式。


在发动SNMP放大攻击时,同样需要先进行网络扫描以找到开放了SNMP协议的网络设备。虽然开放SNMP协议的网络设备很多,但是在扫描到这些设备之后还需要对它们所使用的默认字符串进行猜测。因此,相比于DNS放大攻击,不论是简单度还是放大倍数的影响力,SNMP放大攻击都略逊一筹。不过从总体上来看,SNMP放大攻击依然是一种非常有效的消耗带宽资源的攻击方法。


(三)攻击链路


攻击链路与前面介绍的几种攻击方法有所不同,其攻击的目标并不是作为互联网端点的服务器的带宽资源,而是骨干网上的链路的带宽资源。对链路进行攻击的一种典型的方式是Coremelt攻击。


Coremelt是安全研究人员在2009年提出的一种针对链路的分布式拒绝服务攻击方法。攻击者需要控制一个分布足够广泛的僵尸网络来发动Coremelt攻击,其攻击的原理如下图所示。

Coremelt攻击

首先,攻击者通过traceroute等手段来判断各个僵尸主机和将要攻击的链路之间的位置关系,并根据结果将僵尸主机分为两个部分。然后,攻击者控制僵尸主机,使其与链路另一侧的每一台僵尸主机进行通信并收发大量数据,这样,大量的网络数据包就会经过骨干网上的被攻击链路,造成网络拥堵和延时。


从骨干网上来看,这些僵尸主机之间相互收发的数据包确实是真实存在的通信数据,没有办法将这些通信数据与真正的合法通信数据进行有效的区分,因此这种攻击方式更加难以防护和缓解。


二、攻击系统资源


互联网上的服务器面对着与快餐店相似的问题。终端设备在与服务器进行通信时,经常需要创建会话连接,在这个过程中通常会使用TCP和SSL等协议。在会话创建的初始阶段,服务器需要为新建立的连接分配资源;在会话过程中,服务器需要维护并更新连接的状态,并进行数据传输和交互;在会话结束之后,这些连接资源才会被释放。这些会话连接就像快餐店的收款台,一旦被占满,新进入的会话请求就必须等待前面的会话完成。消耗系统资源的分布式拒绝服务攻击的主要目的就是对系统维护的连接资源进行消耗和占用,阻止正常连接的建立,从而达到拒绝服务的目的。


误区:DDoS攻击都是消耗网络带宽资源的攻击。


很多时候,新闻报道中提到DDoS攻击时,都会以“攻击流量达到××”的语句来描述攻击的猛烈程度。这种以攻击流量的带宽作为DDoS攻击危害程度描述指标的说法,通常会让人们误以为DDoS攻击都是消耗网络带宽资源的攻击。


事实上,除了网络带宽资源,DDoS攻击还有消耗系统资源和应用资源的攻击方法,而攻击流量的大小只是决定攻击危害程度的一个方面。对于相同种类的攻击,通常攻击流量越大,其危害也越大;而如果在相同攻击流量的情况下,不同的攻击方法造成的危害和影响则不尽相同。


有时候,人们会错误地将SYN洪水攻击认为是消耗网络带宽资源的DDoS攻击,而事实上,这种攻击的主要危害在于耗尽系统连接表资源。相同攻击流量的SYN洪水攻击会比UDP洪水攻击的危害更大。


(一)攻击TCP连接


TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层无法提供这样的流机制,在现实的互联网中,这种连接通常通过TCP协议来实现。


TCP连接包括三个阶段:连接创建、数据传送和连接终止。由于在协议的设计过程当中只专注于协议的可用性,而没有对协议的安全性进行比较周密和详细的考虑,因此TCP协议存在很多安全缺陷和安全性问题。


TCP连接的三个阶段都容易受到拒绝服务攻击的影响,我们会在这里对这些攻击手段分别进行介绍。


1、TCP连接洪水攻击


TCP连接洪水攻击是在连接创建阶段对TCP资源进行攻击的。


TCP三次握手。


创建TCP连接需要客户端与服务器进行三次交互,其过程如下图所示。


TCP三次握手

首先,客户端主机向服务器发送带有SYN标志的TCP同步报文,并在报文中指明客户端使用的TCP端口和TCP连接的初始序列号。


其次,服务端在接收到客户端的同步报文之后,返回一个带有SYN+ACK标志的报文,表示接受客户端的同步请求,并将TCP序列号加1。


最后,客户端也返回一个带有ACK标志的报文,对服务端的响应进行确认,并将TCP序列号加1。


至此,一个TCP连接建立成功,这个建立连接的过程也被称为TCP三次握手。


在三次握手进行的过程中,服务器会创建并保存TCP连接的信息,这个信息通常被保存在连接表结构中。但是,连接表的大小是有限的,一旦服务器接收到的连接数量超过了连接表能存储的数量,服务器就无法创建新的TCP连接了。


攻击者可以利用大量受控主机,通过快速建立大量恶意的TCP连接占满被攻击目标的连接表,使目标无法接受新的TCP连接请求,从而达到拒绝服务攻击的目的。


TCP连接洪水攻击的原理如下图所示。

TCP连接洪水攻击

TCP连接洪水攻击是攻击TCP连接的最基本方法。当有大量的受控主机发起攻击时,其效果非常明显。


2、SYN洪水攻击


SYN洪水攻击是最经典的一种拒绝服务攻击方式。这种攻击方式在2000年以前就出现过,直到现在依然被攻击者大规模地广泛使用。近年来,SYN洪水攻击仍然占据全部分布式拒绝服务攻击的三分之一以上。


TCP半开连接。


在建立TCP连接的过程中,如果在服务器返回SYN+ACK报文后,客户端由于某种原因没有对其进行确认,这时服务器端就需要重传SYN+ACK报文,并等待客户端的确认报文直到TCP连接超时。这种等待客户端确认的连接状态通常被称为半开连接,如下图所示。

TCP半开连接

在连接超时之前,半开连接会一直保存在服务器的连接表中。


由于连接表的大小是有限的,如果在短时间内产生大量的半开连接,而这些连接又无法很快地结束,连接表就会迅速被占满,导致新的TCP连接无法建立。


SYN洪水攻击就是攻击者利用受控主机发送大量的TCP SYN报文,使服务器打开大量的半开连接,占满服务器的连接表,从而影响正常用户与服务器建立会话,造成拒绝服务。


攻击者在发送TCP SYN报文时,可以在收到服务器端返回的SYN+ACK报文后,跳过最后的ACK报文发送,使连接处于半开状态。但是这样会很明显地暴露出进行SYN洪水攻击的攻击者的IP地址,同时响应报文会作为反射流量占用攻击者的带宽资源。所以更好的方式是攻击者将SYN报文的源IP地址随机伪造成其他主机的IP地址或不存在的IP地址,这样攻击目标会将应答发送给被伪造的IP地址,从而占用连接资源并隐藏攻击来源。


SYN洪水攻击的原理如下图所示。

SYN洪水攻击

SYN洪水攻击发动简单,效果明显,有大量的攻击工具都能够发动这种攻击,至今依然是攻击者最喜爱的攻击方法之一。


3、PSH+ACK洪水攻击


在TCP数据传输的过程中,可以通过设置PSH标志位来表示当前数据传输结束,需要服务端进行处理。


在正常的TCP传输过程当中,如果待发送的数据会清空发送缓冲区,那么操作系统的TCP/IP协议栈就会自动为该TCP数据包设置PSH标志。同样,当服务端接收到了一个设置了PSH+ACK标志的报文时,意味着当前数据传输已经结束,因此需要立即将这些数据递交给服务进程并清空接收缓冲区,而无须等待判断是否还会有额外的数据到达。


由于带有PSH标志位的TCP数据包会强制要求接收端将接收缓冲区清空并将数据提交给应用服务进行处理,因此当攻击者利用受控主机向攻击目标发送大量的PSH+ACK数据包时,被攻击目标就会消耗大量的系统资源不断地进行接收缓冲区的清空处理,导致无法正常处理数据,从而造成拒绝服务。


PSH+ACK洪水攻击的原理如下图所示。

PSH+ACK洪水攻击

单独使用PSH+ACK洪水攻击对服务器产生的影响并不十分明显,更有效的方式是SYN洪水攻击与ACK洪水攻击相结合,这样能够绕过一部分防护设备,增强攻式是SYN洪水攻击与ACK洪水攻击相结合,这样能够绕过一部分防护设备,增强攻击的效果。


4、RST洪水攻击


在TCP连接的终止阶段,通常是通过带有FIN标志报文的四次交互(TCP四次挥手)来切断客户端与服务器的TCP连接。但是当客户端或服务器其中之一出现异常状况,无法正常地完成TCP四次挥手以终止连接时,就会使用RST报文将连接强制中断。


TCP RST攻击。


在TCP连接中,RST表示复位,用来在异常时关闭连接。发送端在发送RST报文关闭连接时,不需要等待缓冲区中的数据报全部发送完毕,而会直接丢弃缓冲器的数据并发送RST报文;同样,接收端在收到RST报文后,也会清空缓冲区并关闭连接,并且不必发送ACK报文进行确认。


攻击者可以利用RST报文的这个特性,发送伪造的带有RST标志位的TCP报文,强制中断客户端与服务器的TCP连接。在伪造RST报文的过程中,服务器端的IP地址和端口号是已知的,攻击者还需要设法获得客户端的IP地址和端口号,并且使RST报文的序列号处于服务器的接收窗口之内。如果攻击者和被攻击客户端或服务器处于同一内网,这些信息可以通过欺骗和嗅探等方式获取到。


TCP RST攻击的原理如下图所示。

TCP RST攻击

很多情况下,攻击者不会与被攻击客户端或服务器处于同一内网,导致发动TCP RST攻击时难以获取端口和序列号。在这种情况下,攻击者可以利用大量的受控主机猜测端口和序列号,进行盲打,发动RST洪水攻击。只要在数量巨大的RST报文中有一条与攻击目标的端口号相同,并且序列号落在目标的接收窗口之中,就能够中断连接。


RST洪水攻击的原理如下图所示。

RST洪水攻击

严格来说,TCP RST攻击和RST洪水攻击是针对用户的拒绝攻击方式。这种攻击通常被用来攻击在线游戏或比赛的用户,从而影响比赛的结果并获得一定的经济利益。


5、Sockstress攻击


Sockstress攻击是研究人员在2008年提出的一种攻击TCP连接的方法。与前面几种攻击方法不同的是,Sockstress攻击不需要在短时间内发送大量的攻击流量,因此不属于洪水攻击,而是一种慢速攻击。


误区:DDoS攻击都是洪水攻击。


在提到DDoS攻击时,人们通常会条件反射性地想到UDP洪水攻击、SYN洪水攻击、RST洪水攻击等,并会由此认为DDoS攻击都是洪水攻击。


事实上,洪水攻击确实占据了DDoS攻击方法中相当大的比例,但并不是所有的DDoS攻击都是洪水攻击。除了洪水攻击外,还有一些被称为慢速攻击(Low and Slow Attack)的攻击方法。前面,我们对于DDoS攻击精髓的表述中提到:“消耗或长期占用大量资源,从而达到拒绝服务的目的”。洪水攻击就是通过快速发送大量数据和请求,达到迅速消耗大量资源的目的;而慢速攻击则有所不同,它会缓慢而坚定地发送请求并长期占用,一点一滴地蚕食目标的资源。


在TCP传输数据时,并不是将数据直接递交给应用程序处理,而是先临时存储在接收缓冲区中,该接收缓冲区的大小是由TCP窗口表示的。如果TCP窗口大小为0,则表示接收缓冲区已被填满,发送端应该停止发送数据,直到接收端的窗口发生了更新。Sockstress攻击就是利用该原理长时间地维持TCP连接,以达到拒绝服务攻击的目的。


Sockstress攻击首先会完成TCP三次握手以建立TCP连接,但是在三次握手的最后一次ACK应答中,攻击者将其TCP窗口大小设置为0,随后进行一次数据请求。攻击目标在传输数据时,发现接收端的TCP窗口大小为0,就会停止传输数据,并发出TCP窗口探测包,询问攻击者其TCP窗口是否有更新。由于攻击者没有更改TCP窗口的大小,被攻击目标就会一直维持TCP连接等待数据发送,并不断进行窗口更新的探测。如果攻击者利用大量的受控主机进行Sockstress攻击,被攻击目标会一直维持大量的TCP连接并进行大量窗口更新探测,其TCP连接表会逐渐耗尽,无法接受新的连接而导致拒绝服务。


Sockstress攻击的原理如下图所示。

Sockstress攻击

Sockstress攻击的另一种方式是将TCP窗口设置为一个非常小的值,例如4字节。这样攻击目标将不得不把需要发送的数据切分成大量4字节大小的分片,这会极大地消耗目标的内存和处理器资源,造成系统响应缓慢和拒绝服务。


(二)攻击SSL连接


安全套接层(Secure Sockets Layer,SSL)是为网络通信提供安全及数据完整性的一种安全协议。SSL能够在传输层对网络连接进行加密,以防止传输的数据明文被监听和截获。


然而,SSL协议加密、解密和密钥协商的过程中会消耗大量的系统资源,严重降低机器的性能,因此,通常只有在传输密码等机密信息时才使用SSL协议进行传输。


下图是在SSL协议密钥协商过程中,客户端与服务器端消耗的CPU计算资源的对比图。可以看到,如果使用RSA系列的公钥密码算法,那么服务器端所要消耗的资源都会比客户端多。在最极端的情况下,使用RSA 4096进行加解密,服务器端需要花费相当于客户端资源的25倍才能完成计算。

使用不同加密算法时客户端与服务器消耗资源的对比

攻击者可以利用SSL协议消耗资源的特性进行拒绝服务攻击。


1、THC SSL DoS攻击


在进行SSL数据传输之前,通信双方首先要进行SSL握手,以协商加密算法交换加密密钥,进行身份认证。通常情况下,这样的SSL握手过程只需要进行一次即可,但是在SSL协议中有一个Renegotiation选项,通过它可以进行密钥的重新协商以建立新的密钥。


THC SSL DoS攻击是安全研究人员在2011年提出的一种针对SSL的拒绝服务攻击方法。这种方法就是利用Renegotiation选项,造成被攻击目标资源耗尽。在进行SSL连接并握手之后,攻击者反复不断地进行密钥重新协商过程,而密钥重协商过程需要服务器投入比客户端多15倍的CPU计算资源。攻击者只需要一台普通的台式机就能够拖慢一台高性能服务器,而如果有大量主机同时进行攻击,则会使服务器忙于协商密钥而完全停止响应。


THC SSL DoS攻击的原理如下图所示。

THC SSL DoS攻击

另外,即使服务器不支持Renegotiation,攻击者依然可以通过另行打开新的SSL连接的方式来制造类似的攻击效果。


2、SSL洪水攻击


在SSL握手的过程中,服务器会消耗较多的CPU计算资源进行加解密,并进行数据的有效性检验。对于客户端发过来的数据,服务器需要先花费大量的计算资源进行解密,之后才能对数据的有效性进行检验。重要的是,不论数据是否是有效的,服务器都必须先进行解密才能够做检查。攻击者可以利用这个特性进行SSL洪水攻击。


在进行洪水攻击时,一个要点是需要攻击者能够在客户端大量地发出攻击请求,这就需要客户端所进行的计算尽可能地少。对于SSL洪水攻击,比较好的方式是在数据传输之前,进行SSL握手的过程中发动攻击。攻击者并不需要完成SSL握手和密钥交换,而只需要在这个过程中让服务器去解密和验证,就能够大量地消耗服务器的计算资源,因此,攻击者可以非常容易地构造密钥交换过程中的请求数据,达到减少客户端计算量的目的。


SSL洪水攻击的原理如下图所示。

SSL洪水攻击

攻击者可以使用SSLSqueeze等工具来发动SSL洪水攻击。


三、攻击应用资源


客户端的请求能够到达服务器,并且正常地与服务器建立会话连接,这只是服务的第一步。如果在之后的步骤中,客户端不能够获取到所需要的内容,就依然没有得到服务。网络应用和服务在处理数据时,通常需要消耗一定的网络连接、计算和存储资源,这些资源是由应用程序向系统进行申请并自行管理和维护的。消耗应用资源的分布式拒绝服务攻击就是通过向应用提交大量消耗资源的请求,从而达到拒绝服务的目的。


近年来,消耗应用资源的分布式拒绝服务攻击正逐渐成为拒绝服务攻击的主要手段之一。而由于DNS和Web服务的广泛性和重要性,这两种服务也就成为了消耗应用资源的分布式拒绝服务攻击的最主要的攻击目标。


(一)攻击DNS服务


DNS服务是互联网的一项核心服务。通过使用DNS,人们在访问网站时不需要记忆其IP地址,而只须输入其域名即可。在IPv6网络环境下,由于IP地址由原来的32位扩展到了128位,变得更加难以记忆,DNS服务也就变得更加重要。当DNS服务的可用性受到威胁时,互联网上的大量设备都会受到影响甚至无法正常运行。历史上曾有多次针对DNS进行的攻击事件,都造成了较大影响。


针对DNS服务的攻击方法主要有DNS QUERY洪水攻击和DNS NXDOMAIN洪水攻击两种。


1、DNS QUERY洪水攻击


DNS QUERY洪水攻击是指向DNS服务器发送大量查询请求以达到拒绝服务效果的一种攻击方法。


DNS查询和解析过程。


当客户端向DNS服务器查询某域名时,DNS服务器会首先检查其本地缓存中是否有该域名的记录,如果缓存中有该域名的记录(即命中),则直接将缓存中记录的IP地址作为非权威应答返回给客户端。如果在缓存中没有找到该域名的记录,则会进行迭代查询,从根域名开始,逐级进行域名解析,直到解析出完整的域名,之后服务器会将域名解析结果作为应答发送给客户端,并生成一条解析记录保存到缓存中。


例如,对www.nsfocus.com这个域名进行解析,如果在缓存中没有查到其记录,DNS服务器会首先向根域名服务器查询.com的域名解析服务器,然后向.com域名服务器查询nsfocus.com的域名解析服务器,最后向nsfocus.com域名解析服务器查询得到www.nsfocus.com的域名解析结果,并将结果返回给发起查询的客户端。


DNS查询和解析的过程通常如下图所示。

DNS解析过程

在DNS解析的过程中,客户端发起一次查询请求,DNS服务器可能需要进行额外的多次查询才能完成解析的过程并给出应答,在这个过程中会消耗一定的计算和网络资源。如果攻击者利用大量受控主机不断发送不同域名的解析请求,那么DNS服务器的缓存会被不断刷新,而大量解析请求不能命中缓存又导致DNS服务器必须消耗额外的资源进行迭代查询,这会极大地增加DNS服务器的资源消耗,导致DNS响应缓慢甚至完全拒绝服务。


DNS QUERY洪水攻击的原理如下图所示。

DNS QUERY洪水攻击

进行DNS QUERY洪水攻击的要点在于每一个DNS解析请求所查询的域名应是不同的,这样可以比较有效地避开DNS服务器缓存中的解析记录,达到更好的资源消耗效果。


2、DNS NXDOMAIN洪水攻击


DNS NXDOMAIN洪水攻击是DNS QUERY洪水攻击的一个变种攻击方式,区别在于后者是向DNS服务器查询一个真实存在的域名,而前者是向DNS服务器查询一个不存在的域名(NXDOMAIN即Non-eXistent Domain)。


在进行DNS NXDOMAIN洪水攻击时,DNS服务器会进行多次域名查询,同时,其缓存会被大量NXDOMAIN记录所填满,导致响应正常用户的DNS解析请求的速度变慢。这与DNS QUERY洪水攻击所达到的效果类似。除此以外,一部分DNS服务器在获取不到域名的解析结果时,还会再次进行递归查询,向其上一级的DNS服务器发送解析请求并等待应答,这进一步增加了DNS服务器的资源消耗。因此,DNS NXDOMAIN洪水攻击通常比DNS QUERY洪水攻击的效果更好。


DNS NXDOMAIN洪水攻击的原理如下图所示。

DNS NXDOMAIN洪水攻击

(二)攻击Web服务


近年来,Web技术发展非常迅速。人们可以通过浏览器使用Web服务,简单方便地获取需要的信息;而许多机构和企业的重要信息和关键业务也是通过Web服务的方式对外提供。一旦Web服务受到拒绝服务攻击,就会对其承载的业务造成致命的影响。


有多种方法能够对Web服务进行分布式拒绝服务攻击,下面将依次进行介绍。


1、HTTP洪水攻击


Web服务通常使用超文本传输协议(HyperText Transfer Protocol,HTTP)进行请求和响应数据的传输(下图)。

Web访问过程

常见的HTTP请求有GET请求和POST请求两种。通常,GET请求用于从Web服务器获取数据和资源,例如请求页面、获取图片和文档等;POST请求用于向Web服务器提交数据和资源,例如发送用户名/密码、上传文件等。在处理这些HTTP请求的过程中,Web服务器通常需要解析请求、处理和执行服务端脚本、验证用户权限并多次访问数据库,这会消耗大量的计算资源和IO访问资源。


如果攻击者利用大量的受控主机不断地向Web服务器恶意发送大量HTTP请求,要求Web服务器处理,就会完全占用服务器的资源,造成其他正常用户的Web访问请求处理缓慢甚至得不到处理,导致拒绝服务。这就是HTTP洪水攻击。


由于HTTP协议是基于TCP协议的,需要完成三次握手建立TCP连接才能开始HTTP通信,因此进行HTTP洪水攻击时无法使用伪造源IP地址的方式发动攻击。这时,攻击者通常会使用HTTP代理服务器。HTTP代理服务器在互联网上广泛存在。通过使用HTTP代理服务器,不仅可以隐藏来源以避免被追查,还能够提高攻击的效率——攻击者连接代理服务器并发送完请求后,可以直接切断与该代理服务器的连接并开始连接下一个代理服务器。这时代理服务器与目标Web服务器的HTTP连接依然保持,Web服务器需要继续接收数据并处理HTTP请求。


HTTP洪水攻击的原理如下图所示。

HTTP洪水攻击

与DNS服务类似,Web服务也存在缓存机制。如果攻击者的大量请求都命中了服务器缓存,那么这种攻击的主要作用仅体现在消耗网络带宽资源上,对于计算和IO资源的消耗是非常有限的。因此,高效的HTTP洪水攻击应不断发出针对不同资源和页面的HTTP请求,并尽可能请求无法被缓存的资源(如关键词搜索结果、用户相关资料等),从而加重服务器的负担,增强攻击效果。


此外,如果Web服务器支持HTTPS,那么进行HTTPS洪水攻击是更为有效的一种攻击方式。一方面,在进行HTTPS通信时,Web服务器需要消耗更多的资源用来进行认证和加解密;另一方面,一部分防护设备无法对HTTPS通信数据流进行处理,也会导致攻击流量绕过防护设备,直接对Web服务器造成攻击。


HTTP洪水攻击是目前对Web服务威胁最大的攻击之一,有大量的攻击工具支持HTTP洪水攻击,发动简单其效果明显,已经成为攻击者使用的主要攻击方式之一。


2、Slowloris攻击


Slowloris攻击是一种针对Web服务器的慢速HTTP攻击,由安全研究人员在2009年提出。


在HTTP协议中规定,HTTP头部以连续的“\r\n\r\n”作为结束标志。许多Web服务器在处理HTTP请求的头部信息时,会等待头部传输结束后再进行处理。因此,如果Web服务器没有接收到连续的“\r\n\r\n”,就会一直接收数据并保持与客户端的连接。利用这个特性,攻击者能够长时间与Web服务器保持连接,并逐渐耗尽Web服务器的连接资源。


攻击者在发送HTTP GET请求时,缓慢地发送无用的header字段,并且一直不发送“\r\n\r\n”结束标志,这样就能够长时间占用与Web服务器的连接并保证该连接不被超时中断。然而,Web服务器能够处理的并发连接数是有限的,如果攻击者利用大量的受控主机发送这种不完整的HTTP GET请求并持续占用这些连接,就会耗尽Web服务器的连接资源,导致其他用户的HTTP请求无法被处理,造成拒绝服务。


Slowloris攻击的原理如下图所示。

Slowloris攻击

攻击者使用Slowloris、slowhttptest等工具就可以简单地发动Slowloris攻击。在Slowloris攻击方法出现以后,IIS、nginx等一部分Web服务器软件针对该攻击方法进行了修改,但是Apache、dhttpd等Web服务器软件依然会受到Slowloris攻击的影响。


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设置为一个很大的值(例如10000),并将HTTP BODY以非常缓慢的速度一个字节一个字节的向Web服务器发送。这样,Web服务器就需要一直维持与客户端的连接并等待数据传输结束。由于Content-Length被设置成了很大的值,而HTTP BODY的传输速度又非常缓慢,攻击者就可以长时间占用这个连接。通过间隔性地发送单字节的HTTP BODY内容,攻击者能够确保连接不因超时而导致中断。如果攻击者利用大量的受控主机发送这种缓慢的HTTP POST请求并持续占用这些连接,就会耗尽Web服务器的连接资源,导致其他用户的HTTP请求无法被处理,造成拒绝服务。


慢速POST请求攻击的原理如下图所示。

慢速POST请求攻击

攻击者可以使用slowhttptest等攻击发动慢速POST请求攻击。与Slowloris攻击有所不同,由于HTTP协议设计上的原因,所有的Web服务器软件都会受到慢速POST请求攻击的影响。


4、数据处理过程攻击


Web服务器在收到HTTP请求之后,需要检查并处理其中的数据,通过恶意构造请求数据的内容,攻击者可以显著地增加数据处理过程中的资源消耗,造成拒绝服务攻击。这里以正则表达式拒绝服务攻击和哈希冲突拒绝服务攻击为例进行说明。


正则表达式拒绝服务攻击又被称为ReDoS,是安全研究人员在2009年发现的一种拒绝服务攻击方法。在处理请求数据时,Web应用通常会使用正则表达式进行字符串的匹配操作。一部分正则表达式引擎会使用一种被称为非确定性有限状态自动机(NFA)的实现方式,以便能够处理复杂的正则表达式,例如包含了向后引用或者捕获括号的正则表达式。然而,这种正则引擎的实现方式也导致了其处理时间增加,尤其是在确定“否定匹配”(即输入字符串与正则表达式不匹配)时,正则引擎需要对所有可能的匹配路径全部进行测试。如果位于Web应用中的正则表达式写得不够好,需要测试的匹配路径数量会随着输入字符串的长度呈指数级增长。利用恶意构造的输入字符串,攻击者只需要提交相对较短的输入字符串(30个字符左右)就可以强制正则引擎处理数亿个匹配路径,所需时间可以达到几个小时甚至几天。只需要几个这种类似的恶意正则表达式匹配请求,就能够完全占用Web服务器的计算资源,造成Web服务器拒绝服务。


哈希冲突拒绝服务攻击是安全研究人员在2011年提出的一种拒绝服务攻击方法。Web应用在处理请求中的POST数据时,通常使用键-值对的方式来进行存储。在PHP、Python、Java等语言中,键-值对的实质是一个哈希表,Web应用程序通过计算“键”的哈希来获取其所对应的“值”。正常情况下,这个哈希表中的哈希冲突较少,因此进行查找和插入的速度很快。下图所示为正常状态下的哈希表。

正常状态下的哈希表

如果攻击者构造一组恶意的POST数据,使得请求中的“键”的哈希值全部相同,那么保存POST数据的哈希表就会因此退化成为链表,对哈希表的查找和插入等操作则变成了对链表的遍历操作,造成大量的计算资源被占用,导致拒绝服务攻击。下图所示为大量冲突状态下的哈希表。

大量冲突状态下的哈希表

四、混合攻击


我们根据分布式拒绝服务攻击所消耗的资源,将其分为消耗网络带宽资源的攻击、消耗系统资源的攻击和消耗应用资源的攻击。前面分别对三种攻击方式进行了介绍。我们也可以从其他角度对分布式拒绝服务攻击进行分类。例如,从攻击数据包所在的网络层次来划分,可以将分布式拒绝服务攻击分为网络层攻击、传输层攻击和应用层攻击;从攻击数据包发送的频率和速度来划分,又可以将分布式拒绝服务攻击分为洪水攻击和慢速攻击。


这些分类方法如下表所示。

拒绝服务攻击方法的分类

通过对不同的攻击方法进行归类,我们可以归纳和总结出一些攻击方法的共性,并了解每种攻击方法的特性,加深对分布式拒绝服务攻击整体的认识。然而,在实际的攻击中,攻击者并不关心到底使用哪种攻击方法,只要能够达到使目标服务不可用的目的,攻击者通常会发动他所有的攻击手段,尽其所能地展开攻击。我们把这种方式称为混合攻击。


简单的混合攻击,就是同时对被攻击目标使用多种分布式拒绝服务攻击方法、针对不同的资源进行攻击。许多攻击工具都能够同时发动多种攻击。对于攻击者来说,使用这些工具进行混合攻击的成本与只发动一种攻击的成本并没有太大的区别。但是对于被攻击目标来说,却要同时面对不同协议、不同资源的分布式拒绝服务攻击,分析、响应和处理的成本会有很大的增加。


比较高级的混合攻击,则是有针对性地将特定的几种攻击方法组合在一起,这些方法互为补充,相辅相成,能够显著地增强攻击效果。例如,将SYN洪水攻击与ACK洪水攻击组合在一起,SYN请求包及与之匹配的ACK应答包,就能够绕过一些防护设备的反向探测算法,使一部分攻击流量到达被攻击目标;再如,将Slowloris攻击和慢速POST请求攻击混入到HTTP洪水攻击中,攻击目标在发现攻击并进行处理时,大量的洪水攻击会淹没了慢速请求攻击,而无法发现被拒绝服务的真正原因。相比于普通的分布式拒绝服务攻击,这种混合攻击具有更高的隐蔽性和更好的攻击效果。


除了各种分布式拒绝服务攻击手段之间的相互组合,拒绝服务攻击与其他攻击手段相结合也是混合攻击的一种。在这种混合攻击中,拒绝服务攻击通常是作为烟雾弹来隐藏真正的攻击行为的。在遭到攻击时,攻击目标的注意力会被完全吸引到服务不可用的问题上,因此会忙于处理分布式拒绝服务攻击,以期望能够尽快地恢复服务的可用性。这时攻击者便可以乘虚而入,进行数据窃取甚至远程控制等操作而不被发现。


总之,不同的拒绝攻击方法有着不同的攻击效果,而攻击者会将各种攻击方法有效地混合在一起,达到攻击效果的最大化。


五、结语


我们首先利用分布式的客户端,向服务提供者发起大量看似合法的请求,消耗或长期占用大量资源,从而达到拒绝服务的目的。然后,我们对消耗网络带宽资源、消耗系统资源和消耗应用资源的各种分布式拒绝服务攻击方法进行了比较详细的介绍,并给出了每种攻击方法的风险程度。最后,我们又从其他的角度对各种分布式拒绝服务攻击方法进行了归类和总结,并介绍了几种混合攻击的思路、方法和效果。可以预见,随着研究的不断深入,一定会出现更多更有威胁的攻击方法。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存