前言
洪泛式拒绝服务攻击是目前网络上最为重要的、发生次数最多的一种拒绝服务攻击类型,是指攻击者通过大量的无用数据包来占用过多的网络和系统资源,以达到拒绝服务的目的。在这类攻击中,攻击数据包可以是各种类型的,数据包中的数据也可以是多种多样的,这些数据包与正常服务的数据包是难以区分的。在洪泛式拒绝服务攻击中,攻击效果完全依赖于数据包的数量。
PING/ICMP 洪泛攻击
最简单的洪泛式拒绝服务攻击是Ping洪泛,其目的是耗尽受害者的带宽,同时也会消耗受害者的系统资源。其结果就是,要么合法的流量不能通过,要么受害者系统不能响应正常的服务请求。这种攻击是单纯地向受害者发送大量的ICMP回应请求报文,即Ping消息,使受害者网络出现拥塞,或使受害者系统忙于处理这些消息而降低性能,严重的可能导致系统无法对其他的消息做出响应而陷入拒绝服务的状态。
应该说,这种攻击没有什么过人之处————它只是一场带宽的战斗:攻击者要比受害者拥有更大的带宽,才能够发送大小超过受害者接收极限的数据,并以此阻止其他合法流量到达受害者处。在当今时代,这种单兵较量已经难以发挥作用了。
SYN洪泛攻击
SYN洪泛攻击是最常见的一种攻击,早期有统计表明,大约90%的拒绝服务攻击使用的是TCP,而SYN洪泛又是其中最常用的一种攻击。SYN洪泛攻击利用了TCP连接建立过程中使用的3次握手机制。在完成3次握手的过程中,有以下一些重要概念:
- 半开(Half-Open)连接队列:在3次握手协议中,服务器维护一个半开连接队列,该队列为每个客户端的SUN报文开设一个条目,该条目表名服务器已收到SYN报文,并向客户发出确认,正在等待客户的确认报文。
- backlog参数:表示半开连接队列的最大容纳数目。
- SYN-ACK重传次数:服务器发送完SYN+ACK报文,如果未收到客户确认报文,服务器进行首次重传;等待一段时间仍未收到客户确认报文,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半开连接队列中删除。
- 半开连接存活时间:是指半开连接队列的条目存活的最长时间,也即服务器从收到SYN报文到确认这个报文无效的最长时间,该时间值是针对一个数据报文的重传过程中,所有重传请求报文的最长等待时间总和。不同的系统超时长度的设置不同,一般情况下为75秒左右。
由于半开连接的数量(即backlog参数)是有限的,例如很多操作系统设置backlog的默认值为1024。如果服务器在短时间内接收到大量的连接请求,但又不按协议规定完成三次握手过程,则服务器的半开连接资源就会用完。SYN洪泛攻击正是利用了TCP的上述缺陷,通过向受害者发送大量的半连接请求,耗费受害者的CPU和内存资源,特别是耗尽其半开连接资源,从而使其不再接受其他的连接请求,达到拒绝服务的目的。
SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。配合IP欺骗,SYN攻击能达到很好的效果,通常客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN报文,服务器回复确认报文并等待客户的确认,由于源地址是不存在的,服务器需要不断地重发直至超时,这些伪造的SYN报文将长时间占用半开连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
TCP连接耗尽攻击与Naptha
在TCP连接中,操作系统的内核需要为每一个TCP连接维持一些必要的信息(相当于本地文件系统中的文件句柄/描述符),当然每一个操作系统内核的资源都是有限的,如果有太多的连接同时存在,则会占用很多的内存和CPU时间。TCP连接耗尽攻击就是指攻击者通过僵尸网络向服务器发起大量的TCP连接建立请求,耗尽服务器的TCP连接资源。连接耗尽一般有以下几种攻击类型
- 完成三次握手后,不发送数据,只是维持这些TCP连接,占用服务器端的连接资源。
- 完成三次握手后,立刻发送FIN或RST报文,释放本端连接,同时快速发起新的连接,大量消耗服务器的CPU资源。
- 连接过程中呈现给服务器端很小的TCP窗口,导致服务器TCP协议栈资源耗尽。
- 发送大量TCP重传请求,以很小的流量即可导致被攻击网络上行链路拥塞。
一般来说,只要拥有足够的内存和较高性能的CPU主机,简单地使用TELNET等命令就可以耗尽一个安全性不太强的系统的TCP连接资源。当然采用这样的方法也会消耗大量攻击者主机的资源。大规模分布式多主机并行攻击则另当别论。
有的攻击程序直接使用一些网络API,例如利用Berkeley套接字发动攻击,将更有效也更危险,但这种采用网络API的方式由于要在攻击主机上建立连接,也会显著地消耗攻击者的系统资源,同时不足以对目标主机构成严重的安全威胁。也正因为如此,这种攻击TCP连接的方式并没有被广泛使用。
然而,一款被命名为Naptha的漏洞却能非常有效地使TCP连接耗尽。Naptha可通过创建大量的TCP连接并使它们保持在某些特定状态,某些应用程序甚至是操作系统自身会消耗大量的资源,直至出错或者崩溃,而攻击者这一方只会有很少的资源耗费。
Naptha完全避免使用系统的TCP/IP协议栈实现,而是自己构造原始套接自来建立TCP链接;而且为了实现在资源耗费上的不对等,Naptha攻击程序不在攻击主机的内核中设置任何TCB(传输控制块),不保存任何连接状态的记录。它只根据发给它的报文中的某些标志位进行响应。基于这样的实现方法,它可以轻松与目标主机建立成干上万的连接,在攻击者自身消耗有限资源的情况下,却能使受害者主机耗尽所有资源。早期的许多操作系统都存在这样的漏洞,比如,对于FreeBSD 4.0 REL操作系统,在对其ssh端口建立495个连接后,系统开始变得不稳定。由于每个连接都会派生出一个守护进程的子进程,使得文件句柄很快被耗尽:系统报告“too many open files in system”。在大约30分钟后,一些连接开始超时(随后释放掉响应的资源),系统才逐步恢复到可用状态。
与SYN洪泛攻击不同,TCP连接耗尽攻击不需要不停地向受害者发起链接,只要连接数达到一定水平后,使受害者陷入拒绝服务的状态,攻击者就可以停止攻击,而受害者系统仍不能使用;但在SYN洪泛攻击中,一般情况下只要攻击停止,受害者系统就可以恢复并继续提供服务。因此TCP连接耗尽型攻击的成本更低,而且更不易被检测到;但由于TCP连接耗尽攻击需要和受害者建立完整的TCP连接,因此需要使用真实可用的IP地址,哪怕是通过僵尸主机发起攻击,也要用到真实可用的、具有双向路由能力的IP地址。因此一旦被检测到,就比较容易被追溯,进而被过滤或阻断。
防止连接耗尽攻击的一种手段是创建监听套接字时,设置TCP_DEFER_ACCEPT选项。这个选项在3次握手完成后不让连接进入ESTABLISHED状态,服务端的连接处于SYN RECV状态,则服务端ACCEPT获取不到这个连接,直到客户端有真正的数据到达之后才进人ESTABLISHED状态。如果客户端一直不发送数据, 则服务端重传SYN_ACK并等待TCP_DEFER_ACCEPT设置的超时时间,当两个条件均满足时,如果还是没有数据到来,则服务端系统回收连接,并且不对客户端发出RST或FIN包。当然这涉及系统TCP/IP实现的修改,可以简单地采取适当措施比如限制服务器系统的服务数,或是关闭不必要的服务;通过防火墙控制,使得非授权用户不能连接到开放的TCP端口;调节TCP的超时设置和连接保持的时间等。
UDP洪泛攻击
UDP是无连接的传输层协议,在传输数据之前不需要像TCP那样先建立连接。但UDP应用也和TCP应用一样是通过不同的端口号来区分不同的会话源的,当一个系统收到一个UDP包时,它会检查哪个应用程序在监听该端口,如果有应用程序在监听,则把数据报递交给该应用程序处理;如果没有应用程序监听该端口,则回应一个ICMP错误报文,告诉发送者该UDP报文的目标不可达。
UDP泛洪攻击的实现原理与Ping/ICMP泛洪攻击类似,攻击者通过向受害者主机发送大量的UDP报文,可达到两个目的:一方面,可以消耗受害者主机所在网络的带宽,达到阻塞其网络的目的;另一方面,大量UDP报文到达受害者主机,导致受害者主机忙于处理这些UDP报文,而无法处理正常的报文请求或响应,也很容易导致受害者主机的崩溃。
UDP洪泛攻击由于无需在攻击者和受害者主机之间建立需要交互的连接关系,可以毫无限制地使用IP源地址伪造技术,所以这类攻击门槛很低,而且追溯很难。对于主要是面向端系统的攻击,由于很多端系统不需要定期收到UDP数据报,因此可通过在上游路由器到本地网络的出口处设置一些过滤规则,以过滤掉某些UDP数据报,可一定程度上防御此类UDP洪泛攻击。但此类措施由于涉及和网络接入单位之间的协调和联动,实施的难度较大。
HTTP洪泛攻击
HTTP是当前互联网上使用最为广泛的超文本传输协议,HTTP以客户——服务器的模式工作,客户端的实现就是大家广泛使用的各种浏览器,服务器则是提供各类服务的Web站点或者说Web服务器。HTTP基于TCP进行报文传输,服务器端通常运行于TCP的80或8080端口(当然Web服务器管理人员也可以自己任意指定其他端口)。
HTTP泛洪攻击是DDoS攻击的一种常见形式,其攻击对象主要是Web服务器。在该类攻击中,HTTP客户端向HTTP服务器端发起HTTP请求,以和正常用户浏览网页行为相同的方式,向受Web服务器发送大量HTTP请求以耗尽受害节点的资源,造成目标Web应用瘫痪,使得正常用户无法访问。
HTTP洪泛攻击有点类似于TCP连接耗尽攻击,但二者也有很多的差异。从攻击的手段来说,HTTP洪泛攻击是用HTTP对网页进行的语义合法的请求,而TCP连接耗尽要达到一定的效果,需要专门的攻击工具(如Naptha);从攻击效果来说,一般的连接耗尽攻击仅是占用连接资源,可能不会有太多的数据传输,而HTTP洪泛攻击则不仅占用连接资源,更会占用大量的网络带宽,因为浏览器会实实在在地从受害者服务器上下载数据。通过HTTP洪泛攻击来耗尽连接的一个有效手段是不停地从受害者网站上下载大的文件,比如音视频及图像文件等,因为大的文件所需要的传输时间长,从而使一次请求占用系统更多的资源。
HTTP有两个主要的操作,一个是GET,另一个是POST。GET请求主要用于获取静态的内容,如前面说的获取大的图像文件等,相对而言,这种操作对受害者服务器资源的消耗不是很大,但却可能大量消耗网络带宽。POST请求通常用于要求服务器执行更多的处理任务,比如数据库查询等,这将对Web服务器及其后台数据库服务器等产生很大的负担。
HTTP洪泛式攻击属于应用层攻击,相比于网络层带宽洪泛型、传输层TCP/SYN洪泛型DDoS攻击,HTTP洪泛攻击的隐蔽性更高,欺骗性更强,检测难度也更大。首先,网络层带宽洪泛型DDoS攻击通常产生巨大攻击流量,现如今,总的攻击流量已达400Gbit/s,具有明显的流量异常特征; HTTP洪泛攻击流量通常较小,平均攻击流量大约为10Mbit/s, 不会产生流量异常。其次,HTTP洪泛攻击不会造成TCP数据包统计量的异常。不仅如此,HTTP洪泛攻击最为隐蔽之处在于它能够模仿正常用户浏览网页的行为,且能够不断发送HTTP GET请求获取网页,使得低层的检测系统和一般的防火墙很难判断经过HTTP端口的用户请求是来自于正常用户还是来自于攻击者,这导致针对Web应用的HTTP洪泛攻击请求可以顺利穿越基于低层协议的检测系统。因此,HTTP洪泛攻击具有与上述网络层带宽洪泛型、传输层TCP/SYN洪泛型DDoS攻击不同的特征,它能够规避针对网络层、传输层DDoS攻击的解决方法,它的检测难度更大,给Web服务的生存带来严峻挑战。
和其他基于僵尸网络的拒绝服务攻击不同的是,在进行HTTP洪泛攻击时,僵尸主机一般不能伪造源地址,而是使用真实的IP地址,这使得受害者容易发现僵尸主机的位置。一且检测到有HTTP洪泛攻击发生,对它的防御及后续的追踪溯源相对容易一些。