DDoS(Distributed Denial of Service),即分布式拒绝服务,前身为DoS(Denial of Service),即拒绝服务。最基本的DoS攻击就是攻击者利用大量合理的服务请求来占用攻击目标过多的服务资源,从而使合法用户无法得到服务的响应。DoS攻击一般是采用一对一方式的,当攻击目标各项性能指标不高时(例如CPU速度低、内存小或者网络带宽小等等),它的效果是明显的。
然而随着计算机与网络技术的发展,计算机的处理能力与网络带宽迅速增长。这使得DoS攻击的困难程度大大增加了,因为攻击目标对这些恶意服务请求的“消化能力”加强了很多。既然一个单一攻击者无法使目标“拒绝服务”,那么就需要多个攻击者同时发起分布式攻击了,这时DDoS攻击也就应运而生了。DDoS攻击是指攻击者控制僵尸网络中的大量僵尸主机(即肉鸡)向攻击目标发送大流量数据,耗尽攻击目标的系统资源,导致其无法响应正常的服务请求。
-
攻击发起容易,攻击者很容易从互联网获取各类DDoS攻击工具,从而发起攻击。并且,DDoS攻击者往往可以借助正常的普通软件或网站发起攻击。
-
攻击受害者防御难度大,攻击会损害受害者的金钱、服务和信誉。
- 泛洪攻击(Flood)
指攻击者通过僵尸网络、代理或直接向攻击目标发送大量的伪装的请求服务报文,最终耗尽攻击目标的资源。发送的大量报文可以是TCP的SYN和ACK报文、UDP报文、ICMP报文、DNS报文、HTTP/HTTPS报文等。 - 反射攻击
泛洪攻击近年来发展出的一种高级形式。反射攻击并不直接向攻击目标发起大量服务请求,而是控制僵尸网络中的海量僵尸主机伪装成攻击目标,都以攻击目标的身份向网络中的服务器发起大量服务请求。网络中的服务器会响应这些大量的服务请求,并发送大量的应答报文给攻击目标,从而造成攻击目标性能耗尽。 反射攻击大多是由UDP Flood变种而来,反射的是UDP报文,例如NTP、DNS、SSDP、SMTP、Chargen等。因为UDP的响应(Reponse)报文大小要大于请求(request)报文,这样攻击者就实现了对攻击流量的放大,攻击效果较泛洪攻击好很多。 - 畸形或特殊报文攻击
攻击者发送大量有缺陷或特殊控制作用的报文,从而造成主机或服务器在处理这类报文时系统崩溃。畸形报文攻击例如Smurf、Land、Fraggle、Teardrop、WinNuke攻击等。特殊控制报文攻击包括超大ICMP报文、ICMP重定向报文、ICMP不可达报文和各种带选项的IP报文攻击。 - 扫描探测类攻击
是一种潜在的攻击行为,并不具备直接的破坏行为,通常是攻击者发动真正攻击前的网络探测行为,例如IP地址扫描和端口扫描等。
OSI层级 | 攻击内容 |
---|---|
基于网络 (数据链路层、网络层、传输层)的攻击 | IP碎片攻击 |
泪滴攻击 | |
SYN Flood 攻击 | |
其他TCP Flood攻击 | |
连接耗尽攻击 | |
TCP异常报文攻击 | |
TCP虚假会话攻击 | |
LAND攻击 | |
ICMP Flood 攻击 | |
SMURF攻击 | |
死亡之Ping攻击 | |
基于DNS(传输层)的攻击 | UDP Flood 攻击 |
UDP分片攻击 | |
反射放大攻击 | |
DNS攻击 | |
基于SSL/TLS协议(会话层及表示层)的攻击 | SSL Flood 攻击 |
HTTPS Flood 攻击 | |
THC-SSL-DoS攻击 | |
基于应用(表示层及应用层)的攻击 | HTTP Get/Post Flood 攻击 |
HTTP慢速攻击 | |
Hash碰撞攻击 | |
Apache 杀手攻击 | |
RefRef攻击 | |
XML Bomb 攻击 |
IP碎片(IP Fragment)攻击是一种基于数据碎片的攻击手段。而该攻击都是IPv4中的,由于IPv6的包中没有关于分片的字段,因为IPv6中采用了不同的关于MTU的机制,见IPv6的介绍。碎片攻击是指通过恶意操作,发送极小的分片来绕过包过滤系统或者入侵检测系统的一种攻击手段。攻击者通过恶意操作,可将TCP报头(通常为20字节)分布在2个分片中,这样一来,目的端口号可以包含在第二个分片中。对于包过滤设备或者入侵检测系统来说,首先通过判断目的端口号来采取允许/禁止措施。但是由于通过恶意分片使目的端口号位于第二个分片中,因此包过滤设备仅仅检查第一个分片,就决定后续的分片是否允许通过。但是这些分片在目标主机上进行重组之后将形成各种攻击。通过这种方法可以迂回一些入侵检测系统及一些安全过滤系统。
泪滴(teardrop)攻击同样是基于数据分片传送进行的攻击手段。在IP报头中有一个偏移字段和一个分片标志(MF),如果MF标志设置为1,则表面这个IP包是一个大IP包的片断,其中偏移字段指出了这个片断在整个IP包中的位置。例如,对一个4500字节的IP包进行分片(MTU为1500),则三个片断中偏移字段的值依次为:0,1500,3000。这样接收端就可以根据这些信息成功的组装该IP包。而如果一个攻击者打破这种正常情况,把偏移字段设置成不正确的值,即可能出现重合或断开的情况,就可能导致目标操作系统崩溃。比如,把上述偏移设置为0,1300,3000。这就是所谓的泪滴攻击。
TCP是需要连接状态的协议,在TCP中,通信双方使用三次握手来建立一个连接,如下图所示:
SYN Flood指的是攻击者利用工具或者操纵僵尸主机,向目标服务器发起大量的TCP SYN报文,当服务器回应SYN-ACK报文时,攻击者不再继续回应ACK报文。这样就会导致服务器上存在大量的TCP半连接,服务器的资源会被这些半连接耗尽,无法响应正常的请求。
假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们就称作服务器端受到了SYN Flood攻击(SYN洪水攻击)。
通信双方通过三次握手建立一个TCP连接的过程中,SYN-ACK报文出现在第二次握手中,是用来确认第一次握手的。服务器收到SYN-ACK报文后,首先会判断该报文是不是属于三次握手范畴之内的报文。如果都没有进行第一次握手就直接收到了第二次握手的报文,那么就会向对方发送RST报文,告知对方其发来报文有误,不能建立连接。
SYN-ACK Flood攻击正是利用了这一点,攻击者利用工具或者操纵僵尸主机,向目标服务器发送大量的SYN-ACK报文,这些报文都属于凭空出现的第二次握手报文,服务器忙于回复RST报文,导致资源耗尽,无法响应正常的请求。
在TCP三次握手的过程中,ACK报文出现在第三次握手中,用来确认第二次握手中的SYN-ACK报文。ACK Flood攻击指的是攻击者利用工具或者操纵僵尸主机,向目标服务器发送大量的ACK报文,服务器忙于回复这些凭空出现的第三次握手报文,导致资源耗尽,无法响应正常的请求。
主机在接收到一个带有ACK标志位的数据包的时候,需要检查该数据包所表示的连接四元组(源IP,端口)是否存在,如果存在则检查该数据包所表示的状态是否合法,然后再向应用层传递该数据包。如果在检查中发现该数据包不合法,例如该数据包所指向的目的端口在本机并未开放,则主机操作系统协议栈会回应RST包告诉对方此端口不存在。这里,服务器要做两个动作:查表、回应ACK/RST。这种攻击方式显然没有SYN Flood给服务器带来的冲击大,因此攻击者一定要用大流量ACK小包冲击才会对服务器造成影响。按照我们对TCP协议的理解,随机源IP的ACK小包应该会被Server很快丢弃,因为在服务器的TCP堆栈中没有这些ACK包的状态信息。但是实际上通过测试,发现有一些TCP服务会对ACK Flood比较敏感,比如说JSP Server,在数量并不多的ACK小包的打击下,JSP Server就很难处理正常的连接请求。对于Apache或者IIS来说,10kpps的ACK Flood不构成危胁,但是更高数量的ACK Flood会造成服务器网卡中断频率过高,负载过重而停止响应。
从目前情况来看,很少有单纯使用ACK Flood进行的攻击,都会和其他攻击方法混合使用,因此,很容易产生误判。
分片ACK Flood攻击(Fragmented ACK Attack)是ACK Flood攻击的一类变种,攻击者通过发送大片的分片报文(1500+字节)消耗服务器资源。由于报文较大,攻击者不需要很快的发送报文就可以达到很好的攻击效果。如果被攻击对象有过滤器检查通过的包裹,组装这些大片的分片报文就会消耗很大资源造成服务器无法访问。如果被攻击对象没有过滤器,这些攻击包能顺利通过包括路由器、ACL、防火墙等多层网络安全检测机制,攻击者能够从而轻而易举的耗尽服务器资源。此类报文的荷载通常为大量的随机的垃圾数据来消耗服务器资源。
TCP交互过程中还存在FIN和RST报文,FIN报文用来关闭TCP连接,RST报文用来断开TCP连接。这两种报文也可能会被攻击者利用来发起DDoS攻击,导致目标服务器资源耗尽,无法响应正常的请求。
TCP是面向连接的协议,通信双方必须保持连接状态,并且通过确认、重传、滑动窗口等机制,保证数据传输的可靠性和稳定性。攻击者利用TCP协议的上述特点,在TCP连接上做文章,利用TCP连接来消耗被攻击目标的系统资源,这类攻击的影响也不容小觑。
例如,攻击者与被攻击目标完成三次握手后,立刻发送FIN或RST报文,释放本端连接,同时快速发起新的连接,以此来消耗被攻击目标的系统资源。又比如,攻击者与被攻击目标完成三次握手后,发送很少的报文来维持连接状态,通过这种异常的TCP连接来消耗被攻击目标的系统资源。 除此之外,攻击者还会使用一些其他的攻击手段,比如构造大量的并发连接、设置很小的TCP窗口、发送重传报文等,其目的都是消耗被攻击目标的系统资源。
TCP报文头中存在六个标志位字段,代表不同的含义,当标志位的值置为1,表示该标志位起作用。在我的TCP报文介绍中有六个标志位(URG,ACK,PSH,RST,SYN,FIN)的详细信息介绍
这六个标志位在TCP交互过程中各司其职,标志位置1与否必须严格遵循TCP协议规范。如果不遵循规范随意将标志位置0或置1,这类报文就称为TCP异常报文。例如圣诞树攻击(Christmas Tree Attack)就是设置六个标志全部为1。接收方处理这些异常报文时会消耗系统资源,甚至可能会导致系统崩溃。攻击者也可以利用TCP异常报文来发起DDoS攻击,向被攻击目标发送大量的构造的TCP异常报文,导致被攻击目标系统资源耗尽、网络拥塞,无法正常提供服务。
同时,攻击者通过像服务器发送多种异常报文,并根据服务器的特定反应有时可以大致推测出服务器使用的操作系统,为攻击者之后发动更具针对性的攻击提供便利。
下表为一些TCP异常报文的特点:
- | - |
---|---|
六个标志位全为1 | 六个标志位全为0 |
SYN和FIN标志位同时为1 | SYN和RST标志位同时为1 |
FIN和RST标志位同时为1 | PSH,FIN和URG标志位同时为1 |
仅FIN标志位为1 | 仅URG标志位为1 |
仅PSH标志位为1 | SYN,RST和FIN标志位为1的分片报文 |
带有载荷的SYN报文 | 带有载荷的SYN-ACK报文 |
在虚假会话(Fake Session)DDoS攻击中,黑客发送多条伪造的SYN包、ACK包及一条或多条FIN/RST包来单方向冒充一套完整有效的TCP会话。由于当前现代网络一般采用不对称设计,即接收和发送使用不同线路从而减少话费提高效率,所以此类攻击很难被仅监控接收线路的防御工具检测到。对于此类单方向监控的防御工具来说,这些报文属于一个正常的TCP会话,从而攻击者能够通过检测消耗服务器资源达到攻击的效果。由于此类攻击相对而言不需要很快的传送速度,因此他在消耗服务器资源的同时更难被检测到。这种攻击大致分两类:
- 攻击者首先发送多个伪造的SYN包,接着发送多个ACK包,最后发送一个或多个FIN/RST包。
- 攻击者跳过SYN包而直接发送多个ACK包,接着发送一个或多个FIN/RST包。
LAND攻击利用了TCP连接建立的三次握手过程,通过向一个目标计算机发送一个TCP SYN报文而完成对目标计算机的攻击。LAND攻击SYN报文的源IP地址这时将导致接受服务器向它自己的地址发送SYN一ACK消息,结果这个地址又发回ACK消息并创建一个空连接,而每一个这样的连接都将保留直到超时掉。此类攻击的特点是报文的源IP地址与目的IP地址相同,为受攻击的地址。
这种攻击的原理很简单,攻击者利用攻击工具或者操纵僵尸主机,向目标服务器发起大量的HTTP GET或HTTP POST报文,请求服务器上涉及数据库操作的URI或其它消耗系统资源的URI,造成服务器资源耗尽,无法响应正常请求。
HTTP慢速攻击是利用HTTP协议的正常交互机制,先与目标服务器建立一个连接,然后长时间保持该连接不释放。如果攻击者持续与目标服务器建立这样的连接,就会使目标服务器上的可用资源耗尽,无法提供正常服务。HTTP慢速攻击主要包括针对HTTP请求报文头部结束符的Slow Headers攻击,以及针对POST请求报文数据长度的Slow POST攻击。
-
Slow Headers攻击
HTTP请求头部的后面会存在一个空行(结束符),其中包括回车符和换行符,从而告知服务器请求头部结束,后面不再有请求头。如果服务器没有收到这个空行则会一直保持连接。Slow Headers攻击正是利用这一点,攻击者使用GET或POST请求方法与目标服务器建立连接,然后持续发送不包含结束符的HTTP头部报文,目标服务器会一直等待请求头部中的结束符而导致连接始终被占用。如果攻击者控制大量的僵尸主机向目标服务器发起这种攻击,将会导致服务器资源耗尽,无法正常提供服务。 -
Slow POST攻击
Slow POST攻击利用的是POST请求方法,攻击者向目标服务器发送POST请求报文提交数据,数据的长度设置为一个很大的数值,但是在随后的数据发送中,每次只发送很小的报文,这样就是导致目标服务器一直等待攻击者发送数据。如果攻击者控制大量的僵尸主机向目标服务器发起这种攻击,将会导致服务器资源耗尽,无法正常提供服务。
在HTTP请求中处理大量参数的时候,服务器通过使用Hash table(哈希表)访问表单值,达到快速查询修改的效果。Hash碰撞攻击正是利用了Hash算法的“非随机性”可以制造出多个的值不一样,但是码值一样数据,从而使Hash表退化成为一张单向链表,而导致网站或是程序的运行性能以级数下降,使得服务器几乎失去响应。
Apache 杀手(Apache Killer)攻击是一个严重的针对Apache网络服务器的攻击漏洞,并在Apache版本2.2.21中被修补。这个漏洞允许攻击者向Apache服务器发送一个获取大量字节范围内URL内容的请求,从而有效的造成服务器的可用内存不足,最终达到消耗服务器资源的目的。根据2012年6月Netcraft的调查,接近2/3的互联网服务器使用Apache服务,因此这个致命的漏洞会使得没有及时更新升级的大多数互联网服务器处于极大的受此类攻击的危险之中。
#RefRef是Anonymous黑客组织发布的一款攻击工具,它针对使用SQL数据库的网络服务器,通过利用MySQL的漏洞通过SQL注入进行攻击。#RefRef滥用了MySQL的BENCHMARK()函数,从而重复运行命令达到消耗服务器资源的目的。它不需要很多终端协同来攻击服务器,很少的几个甚至一个计算机就可以达到很严重的攻击效果。
XML Bomb 攻击,也被称作“Billion Laughs Attack”,属于递归实体扩展攻击。通用实体扩展攻击通常需要足够大的XML输入数据量,然而递归实体扩展攻击仅需要平均输入字节就能产生更强力的攻击效果。这种攻击方式依赖于XML解析器(Parser),通常为HTTP服务器来进行解析,从而完成小实体集的指数级增长。通过这种指数爆炸性增长方式,一个比通用实体扩展攻击使用小得多的输入数据量实际可增长得极大。XML Bomb攻击利用XML允许定义实体的漏洞进行攻击,假设攻击者定义实体一为20个实体二,而实体二为20个实体三,以此类推,直到实体八。这时XML编译器会将实体一编译为2^7=1,280,000,000个实体八,占用5GiB的内存。最终黑客可以利用这种漏洞达到攻击的效果。
ICMP(Internet Control Message Protocol)是互联网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP Flood 的攻击原理和TCP Flood等攻击原理类似,属于流量型的攻击方式,也是利用大的流量给服务器带来较大的负载,影响服务器的正常服务。但是由于目前很多防火墙直接过滤ICMP报文, 因此ICMP Flood出现的频度较低。
Ping Flood 攻击是ICMP Flood攻击的一种,攻击者通过快速发送大量的ping(ICMP echo请求)消耗服务器的资源,占用服务器的带宽。
Smurf以最初发动这种攻击的程序“Smurf”来命名。这种攻击方法结合使用了IP欺骗和ICMP回复方法使大量网络传输充斥目标系统,引起目标系统拒绝为正常系统进行服务。攻击者向网络广播地址发送ICMP包,并将回复地址设置成受害网络的广播地址,通过使用ICMP应答请求数据包来淹没受害主机的方式进行,最终导致该网络的所有主机都对次ICMP应答请求作出答复,导致网络阻塞。更加复杂的Smurf攻击攻击将源地址改为第三方受害者,最终导致第三方崩溃。
由于路由器等三层设备本身就不会转发目的地址是广播地址的报文,因此Smurf攻击在网络上很难形成攻击。在防火墙上体检Smurf攻击必须要求被攻击网络是之间连接到防火墙上。
因为以太网长度有限,当一个IP包的长度超过以太网帧的最大尺寸时,包就会被分片,作为多个帧来发送。接收端的机器提取各个分片,并重组为一个完整的IP包。在正常情况下,IP头包含整个IP包的长度。当一个IP包被分片以后,头只包含各个分片的长度。分片并不包含整个IP包的长度信息,因此IP包一旦被分片,重组后的整个IP包的总长度只有在所在分片都接受完毕之后才能确定。
在IP协议规范中规定了一个IP包的最大尺寸,而大多数的包处理程序又假设包的长度超过这个最大尺寸这种情况是不会出现的。因此,包的重组代码所分配的内存区域也最大不超过这个最大尺寸。这样,超大的包一旦出现,包当中的额外数据就会被写入其他正常区域。这很容易导致系统进入非稳定状态,是一种典型的缓存溢出(Buffer Overflow)攻击。在防火墙一级对这种攻击进行检测是相当难的,因为每个分片包看起来都很正常。
由于使用ping工具很容易完成这种攻击,以至于它也成了这种攻击的首选武器,这也是这种攻击名字的由来。当然,还有很多程序都可以做到这一点,因此仅仅阻塞ping的使用并不能完全解决这个漏洞。预防死亡之Ping的最好方法是对操作系统打补丁,使内核将不再对超过规定长度的包进行重组。
SSL(Secure Sockets Layer),即“安全套接层”,是上世纪90年代中期网景公司设计的为网络通信提供安全及数据完整性的一种安全协议,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。在IETF将 SSL标准化之后的名称改为 TLS(Transport Layer Security),即“传输层安全协议”。
SSL Flood攻击和SSL重新协商攻击(见THC-SSL-DoS攻击)都是乘机利用服务器端协商安全TLS连接所需的处理能力,向服务器发送大量的垃圾数据,或者不断要求重新协商连接,从而致使服务器的资源超出限制并使其脱机。
目前多数在线商务使用SSL/TLS作为网页安全应用的一部分,从而确保通信安全及信息完整性。HTTPS Flood 攻击,即使用通过SSL/TLS加密的HTTP通信泛洪攻击越来越多的被运用到DDoS攻击中。HTTPS Flood攻击较普通HTTP Flood攻击更有效,因为服务器需要使用更多资源进行通信的加密/解密。这些特点使得对于HTTPS Flood的保护更为困难。
THC(The Hacker's Choice),一个国际安全专家及黑客组织,发现了这种攻击方式并希望能借此提醒SSL用户安装安全补丁并使用反DDoS攻击保护工具的重要性。THC-SSL-DoS攻击仅需要数量很少的数据包就能对大型服务器进行很有效的DoS攻击。这种攻击手段首先建立一个正常的SSL握手过程,并在握手后立即请求一个新的加密密钥。攻击者重复这个需要消耗很多服务器计算资源的重新协商密钥的过程,直到服务器资源被耗尽。
UDP Flood是日渐猖厥的流量型DDoS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器等。100k pps的UDP Flood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。由于UDP协议是一种无连接的服务,在UDP Flood攻击中,攻击者可发送大量伪造源IP地址的小UDP包。但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。
正常应用情况下,UDP包双向流量会基本相等,而且大小和内容都是随机的,变化很大。出现UDP Flood的情况下,针对同一目标IP的UDP包在一侧大量出现,并且内容和大小都比较固定。
在UDP分片(UDP Fragmentation)攻击中,攻击者通过发送巨大的UDP报文(1500+字节)来用很少的包消耗极大的资源。由于攻击包通常是伪造的并且不能被重组,被攻击方通常要花费极大CPU等资源来重组这些报文,从而似的其他流量包不能正常通过。
-
NTP:
NTP(Network Time Protocol),即网络时间协议。顾名思义,NTP是一种用于保证网络中的计算机时间同步的协议。NTP协议采用服务器-客户端模型,提供了高精准度的时间校正机制。在网络中,NTP客户端不以自己的时间为准,而是每隔一段时间从NTP服务器同步更新自身时间。NTP协议定义了NTP服务器的层次结构,通过逐层传播,实现时间同步。
NTP协议中有一个监控(Monlist)功能,用于监控NTP服务器。NTP服务器会记录与自己进行过时间同步的客户端IP地址的信息,而且客户端可以通过一些命令索要这些记录。每个NTP服务器可以记录进行过时间同步的最后600个客户端的IP地址,当有客户端索要这个记录时,NTP服务器会返回这600个客户端IP地址,响应包按照每6个IP地址进行分割,最多可以返回100个响应包。 -
反射
反射,就是把源IP地址伪造成被攻击IP地址,利用无状态连接的UDP缺少源认证机制的特点,进行攻击。 在UDP协议中,正常情况下,客户端发送请求包到服务器,服务器返回响应包给客户端,这就完成了一次交互,中间没有校验过程。由于UDP协议不是面向连接的,所以客户端发送请求包的源IP地址很容易被篡改。一些低版本的NTP服务器没有针对源IP地址的校验机制,所以如果把请求包的源IP地址篡改为攻击目标的IP地址,最终服务器返回的响应包就会被送到攻击目标,这就是“反射”攻击。 -
放大
黑客通常是利用互联网的基础架构来进行放大攻击,效果更强。网络中开放的NTP服务器非常多,如果黑客利用僵尸主机,同时向NTP服务器发起大量的Monlist请求,1个Monlist请求包可以引发100个响应包。通常,1个NTP请求包只有90字节的大小,而1个回应报文通常为482字节,100个回应报文就是48200字节,回应报文是请求报文的500倍左右,这样就可以达到四两拨千斤的“放大”效果,仅使用很小的带宽达到很大的攻击流量。
DNS(Domain Name System),属于应用层协议,DNS域名解析是互联网上非常重要的一项服务,我们每天上网都伴随着大量的DNS服务来支撑。在Internet上,用户更容易记住的是域名,但是网络中的计算机互相进行访问是通过IP地址,DNS最常用的是给用户提供域名解析服务,将用户的域名解析成网络上能够访问的IP地址。DNS查询过程通常都是基于UDP协议的,而UDP协议是无连接状态的。所以这一弱点很容易被黑客所利用。
在DNS系统中,涉及以下几种类型的服务器:
-
根服务器主要用来管理互联网的主目录,全世界只有13个根逻辑服务器节点。这13个节点其中10个设置在美国,另外各有一个设置于英国、瑞典和日本。所有根服务器均由美国政府授权的互联网域名与号码分配机构ICANN统一管理。顶级域名服务器一般用于存储顶级域名。
-
递归服务器也可理解为存储着官方域名解析授权的授权服务器,一般存储着这个网络中域名和IP地址的解析关系。
-
缓存服务器就相当于是授权服务器的一个代理,可以缓解授权服务器的压力。一般用户上网时,域名解析的请求都是首先发给缓存服务器的。当缓存服务器收到本地没有储存的域名解析请求时,会向授权服务器请求域名和IP地址的解析表,然后储存在本地。当缓存服务器收到本地储存的域名解析请求时,就会直接答复,不再像授权服务器请求。这个解析表是有一定的有效期的,等有效期到了,这个解析表就会自动老化,等下次有用户请求时重新向授权服务器询问。这个定期老化机制,可以保证缓存服务器上域名解析的定期更新。
DNS request flood攻击原理其实很简单,就是黑客控制僵尸网络向DNS服务器发送大量的不存在域名的解析请求,最终导致服务器因大量DNS请求而超载,无法继续响应正常用户的DNS请求,从而达到攻击的目的。
在DNS request flood攻击过程中,攻击的目标可能是DNS授权服务器,也可能是DNS缓存服务器。黑客伪造的客户端IP地址可能是虚假源IP地址,也可能是现网真实存在的IP地址。如果攻击的是DNS授权服务器,大量不存在的域名解析请求会导致服务器应接不暇,最终耗尽服务器性能;如果攻击的是缓存服务器,同时会导致缓存服务器不停的向授权服务器发送这些不存在域名的解析请求,一收一发更加重服务器的负担,直到最终导致服务器瘫痪。
由于UDP协议是无连接状态的,所以当DNS服务器收到DNS reply报文时,不管自己有没有发出去过解析请求,都会对这些DNS reply报文进行处理。DNS reply flood大多都是虚假源攻击,黑客控制僵尸主机发出的DNS reply报文的源IP地址通常都是伪造的,而黑客使用伪造的源IP地址发送大量的DNS reply报文到DNS缓存服务器,导致缓存服务器因为处理这些DNS reply报文而资源耗尽,影响正常业务。
DNS反射攻击是DNS reply flood的一种变异。DNS服务器是互联网最基础的设施之一,网络中有很多开放的免费DNS服务器。DNS反射攻击正是利用这些开放的DNS服务器制造的攻击。这种DNS反射攻击通常比普通的DNS reply flood攻击性更强,追踪溯源困难,更善于伪装。
黑客将自己的源IP地址伪造成被攻击目标的IP地址,然后向一系列网络中开放的DNS服务器发送大量的查询请求。通过伪造DNS请求报文的源IP地址,控制DNS回应报文的流向,这些DNS回应报文就会都被引导到被攻击目标,导致被攻击目标的网络拥塞,拒绝服务。而开放式的DNS服务器在全球有超过几千万台,这些服务器接入带宽往往都比较高,而且,DNS reply报文大小通常也是DNS request报文的几倍甚至几十倍,还可达到放大攻击的效果。对于控制成千上万台僵尸主机的黑客来说,制造几G乃至数十G的DNS攻击流量并不太困难。
DNS反射攻击和传统DNS reply flood有两点本质的不同:
-
传统DNS reply flood一般攻击目标是DNS缓存服务器;而DNS反射攻击一般攻击目标是客户端。
-
传统DNS reply flood大多是虚假源攻击,而DNS反射攻击中,DNS请求是真实的,所以DNS回应报文也都是真实的,是由网络中真实的DNS服务器发出的,属于真实源攻击。
缓存服务器并不知道实际的域名和IP地址的映射关系,一旦从授权服务器获取了映射关系后,会存储在内存中一段时间。直到记录老化。老化时间由DNS reply报文中的TTL(time to live)决定。在这个有效期内如果再有客户端请求这个相同域名的解析,缓存服务器就会直接用缓存中的IP地址进行回应。老化以后,如果有客户端再次请求这个域名时,缓存服务器就会重新向授权服务器请求。
缓存投毒攻击就是黑客伪造了恶意的DNS reply报文,导致缓存服务器无意中将恶意的域名和IP地址映射关系存储到自己的缓存中。当客户端再通过缓存服务器请求这个域名解析时,就会被指向恶意主机器,如下图所示:
-
黑客向DNS缓存服务器发送一个不存在的子域名(gh1.ddos.com),请求解析。
-
缓存服务器查找本地缓存项查不到,就会向授权服务器发起查询请求。
-
在授权服务器回应这个请求前,黑客就会伪造大量的DNS reply报文发向缓存服务器。
为了达到攻击的目的,黑客伪造的DNS reply报文的源IP地址必须是授权服务器的源IP地址;目的端口也必须是缓存服务器的源端口;同时DNS reply报文的Query ID和DNS request报文的Query ID也要一致。
源IP地址和目的端口都很好伪造,但是Query ID伪造成功是有一定难度的。因此黑客伪造大量DNS reply报文时,会不断变换Query ID字段。可能就会有一个Query ID字段命中DNS request的Query ID。一旦先于授权服务器发送给缓存服务器,缓存服务器就会将黑客发送的伪解析IP地址作为解析地址,保存到本地的缓存表中。 -
后续当授权服务器再将真正的回应报文发送到缓存服务器时,缓存服务器也不会接收,直接丢弃。
而在DNS缓存服务器中,如果仅仅gh1.ddos.com的解析地址是假的,也并没有多大影响,因为黑客利用投毒的子域名(gh1.ddos.com)通常都是不存在的,正常客户端也就不会请求这个不存在的子域名。
但是授权服务器在回答缓存服务器请求时,不仅会发送子域名gh1.ddos.com的解析地址,也会将主域名ddos.com所在的DNS授权服务器和IP地址的对应关系一起发送过去。而缓存服务器不仅仅存储子域名的解析地址,还会将主域名的解析地址一并更新到自己的缓存列表中。这样后续再有客户端请求这个主域名时,也会一并被指向虚假的IP地址,造成极大的危害。
由于这些篡改方式不属于DDoS攻击的范畴,故不做具体介绍。
-
路由器DNS劫持 黑客利用路由器的漏洞入侵受害者的路由器,篡改路由器中设置的DNS服务器的地址,将DNS服务器地址指向恶意的DNS服务器。这种篡改对于一个用户来说是最可怕的,一旦发生了这种情况,那么这个用户访问的每一个域名,可能都会被解析成其他恶意地址。
例如TP-Link路由器的劫持事件,就是黑客构造了一个恶意Web页面,页面的功能是自动登录路由器并修改DNS地址。然后,黑客再构造一个URL发送给受害者,当受害者点击这个链接的时候就访问了恶意页面。攻击要想成功的前提是黑客必须知道TP-link路由器的登录账号和密码,才能完成恶意Web页面的构造。实际上,大多数人都会使用TP-link路由器厂商预置的默认密码,所以这就给了黑客实施攻击的机会,导致路由器的DNS服务器的IP地址更改为恶意的IP地址。
这种劫持方式不容易被发现,受害者只要输入真实域名或者合法网站地址,黑客就可将其重定向到一个钓鱼网站上。一旦发生了这种情况,那么对于受害者来说后果是非常可怕的。受害者访问的每一个域名,可能都是假的。他看到的淘宝不再是淘宝,登录的网银也不再是网银,用户的各种敏感信息都会受到严重威胁。对于这种方式,最有效的防御办法就是路由器设置安全系数高的密码,然后定期修改密码。另外,对于不明链接,也不要随便点击。 -
修改授权服务器 直接在授权服务器上修改域名和IP地址的映射关系,这是最直接,最暴力的一种方式。这种方式如果作为攻击的手段的话,需要黑客通过特殊手段获取授权服务器的管理员权限,难度系数非常大。
-
修改缓存服务器 即DNS缓存投毒,黑客通过修改DNS缓存服务器中的记录达到篡改DNS的目的。
由于DDoS攻击主要都是依靠攻击工具来实施的,因此攻击工具扮演着一个重要的角色,对它们进行全面的分析,了解其产生的攻击类型、攻击实施的方式特点,将有助于采用更准确有效的清洗方法来对应攻击的威胁。DDoS攻击工具使用的具体的攻击方法可以见前文的具体分类介绍,此处不做赘述。
DDoS攻击工具要体现出更大的威力,通常会设计一种良好的流量攻击方式,让攻击更难于防护和发现。比较常见的方式就是利用僵尸网络发起攻击。如果僵尸网络主机数量比较庞大,那么不管是在应用层还是传输层,对目标服务器的资源消耗和网络带宽的影响都会比较大。如果攻击工具能够模拟完整的协议栈,那么防护设备的防御难度会更大,因为大部分防护技术都是基于协议栈的动态交互来实现身份认证的。比如SYN flood防护中的SYN COOKIE 算法,如果客户端能够完成正常3次握手,就可以突破这个防御。虽然大多数攻击工具能够完成传输层协议栈的模拟,但实现完整应用层协议栈的模拟则比较少,主要原因在于应用层协议比较复杂。
总结起来攻击工具的发展有如下几个特点:
- 利用应用层协议栈漏洞发起的工具比较多。大部分集中在基于web业务的攻击,其它应用层协议如DNS、SIP相对比较少。
- 能够模拟协议栈行为包括应用层和传输层的攻击工具是未来发展的趋势,实现应用层协议模拟的防御难度会更大。
- 攻击工具已经逐渐朝更加隐蔽的方式,以能操纵更大规模的僵尸网络为目标方向挺进,比如DirtJumper。
- 基于应用层协议漏洞的攻击工具会越来越多,由于能够通过较少流量达到攻击目的,对业务的危害比较大。
对于DDoS攻击工具的防御,一方面可以从基础设施的改进来缓解攻击影响,比如带宽扩容,增强服务器的处理性能、采用合理的网络部署结构等。而另外一方面可以在网络边界出入口采用专用的防御技术。目前行之有效的防护方法主要有4大类:
-
动态挑战算法 模拟传输层和应用层协议栈行为,代替服务器回应数据报文,对正常的客户端发送挑战报文,只有完成挑战认证的客户端的流量才能放行。动态挑战算法比较常用的有SYN Cookie, DNS Cookie和SIP Cookie。
-
多层次限速 基于各种粒度和层次,分别从源IP、目标IP、传输层和应用层session,对IP流量进行限制。这是对流量型攻击,比如UDP Flood,ICMP Flood常用的防护方法。
-
智能的访问控制 从OSI层级三层到七层灵活的访问控制策略。从IP地址到应用层协议,如HTTP协议,可对报文的URL,user-agent,cookie设置丢弃、信任和限速策略,而对DNS协议,则可对报文中QUERY名字、类型、RR记录设置类似策略。
-
行为分析和信誉机制 基于数据分析技术对IP行为和流量特征建模分析,建立通用信誉库包括IP、URL和文件信息,输出异常流量特征指纹,自动完成流量清洗。这对僵尸网络以及报文发送异常的攻击工具防护都非常有效,比如Slowloris Header。
虽然DDoS攻击方式在不断发生变化,但攻击的类型并不会发生质的改变,攻击工具对业务系统带来的最大威胁,并不在于新的工具名称的出现,而在于尚未发现而且能够被利用的已知或未知协议漏洞。面对未来新工具的出现,准确把握好其产生的攻击类型以及攻击方式特点,并基于此采用反制措施能将攻击危害控制到最小。
-
LOIC
LOIC(Low Orbit Ion Cannon)是一款专著于web应用程序的DoS/DDoS攻击工具,它可以用TCP数据包、UDP数据包、HTTP请求于对目标网站进行DDoS/DoS测试,不怀好意的人可能利用LOIC构建僵尸网络。LOIC是用C#语言写的,这是一个C#新手的练手作品,靠GUI界面吸引了不明真相的小白们使用。由于程序设计上”有意或无意”留下的BUG导致” 一旦开始攻击在退出进程前无法真正停止攻击“,潜在增大了攻击效果。攻击手段主要是以无限循环方式发送大量数据,并无其它特色。
攻击方法: UDP/TCP/HTTP GET -
XOIC
相对于LOIC的多平台(GNU/Linux, Windows, Mac OS以及Android),XOIC可运行的环境则少的多,仅支持win7以上的Windows平台。和LOIC相比,工具主打的还是流量型攻击,不过相比前者增加了Testmode模式,可以测试攻击主机的性能。
攻击方法: TCP/UDP/ICPM/HTTP GET -
HOIC
HOIC(High Orbit Ion Cannon)是完全开源的,HOIC攻击实际是靠大量正常HTTP请求进行DoS,如果有基于某些阈值的异常行为检测方案,完全可以有效检测、阻断HOIC攻击。类似NSFOCUS ADS系列的专业DDoS防护产品完全可以应对HOIC攻击。
攻击方法: HTTP GET -
HULK
HULK(HTTP Unbearable Load King)能够在互联网服务器上产生许多单一的伪造流量,绕开引擎的缓存,从而直接攻击服务器的资源池。HULK的特别之处在于:对于每一个请求都是独特的,能够绕开引擎的缓存直接作用于服务器的负载。HULK使用的技术为:- 源客户的混淆——通过一个User Agent的已知列表,每HTTP一个请求的用户代理都是随机来自于已知列表。
- 引用伪装——指向请求的referer是伪造的,要么指向主机自己,要么指向主要的已知站点。referer是产生请求的url。
- 粘附性——使用标准的http请求去请求服务器,使用变化的的keep-alive时间窗保持连接建立不使用缓存——这是一个前提,向HTTP server请求no-cache,一个没有在背后cache service使用的server会呈现一个单独的页面。
- URL的独特组成——为了避免缓存和其他优化工具,HULK伪造了常见的参数名称和参数值,为了单一性,他们都是根据每个请求随机生成的,使得服务器就得处理每个事件的响应。
攻击方法: HTTP GET
-
Dirt Jumper
Dirt Jumper 是一个通过botnet发动DDoS 攻击的工具。整体来看,由Dirt Jumper及其变种程序发起的攻击呈上升态势。原因不仅仅在于程序的简单易用,同时地下产业链相对成熟,从而得以广泛传播。从攻防角度上讲,Dirt Jumper攻击并没有引入新的方式,采用了比较传统的网络层和应用层攻击手段,防护并不困难。
攻击方法: HTTP GET/POST,SYN Flood -
Slowhttptest
Slowhttptest是一个可以灵活配置的应用层攻击工具,它能发起诸如slowloris、Slow HTTP POST、Slow read、Slow range等工具实现的低带宽应用层拒绝服务攻击工具。它利用了http协议的一个特点——等待完整的http请求收到才会进行处理。如果一个http请求不完整,或者是在网络上慢速传递,http服务器会一直为这个请求保留资源等待它传输完毕。如果http服务器有太多的资源都在等待,这就构成了DDoS攻击。详细介绍可见本文HTTP慢速攻击等板块。
攻击方法: HTTP -
Slowloris
Slowloris是在2009年由著名网络安全专家RSnake提出的一种攻击方法,其原理是以极低的速度往服务器发送HTTP请求。由于网络服务器对于并发的连接数都有一定的上限,因此若是恶意地占用住这些连接不释放,那么服务器的所有连接都将被恶意连接占用,从而无法接受新的请求,导致拒绝服务。
攻击方法: HTTP -
Zarp
Zarp是采用Python编写的、类似MSF的一款网络攻击测试框架。工具采用模块化设计,集漏洞扫描、嗅探、DDoS压力测试于一身。Zarp主要接口是一个CLI驱动的图形界面,采用多层菜单,使用起来相当方便。目前运行平台只限于linux,同时在安装之前要确保系统存在python2.7.x、git以及scapy。
攻击方法: TCP
参考资料:
1. http://forum.huawei.com/enterprise/zh/thread-360365.html
2. https://www.corero.com/resources/glossary.html#Fragmented%20ACK%20Flood
3. https://security.radware.com/ddos-knowledge-center/ddospedia
4. https://www.infoq.com/news/2011/08/apache-killer
5. http://blog.nsfocus.net/evolution-of-ddos-attack-tools/