《实战录》导语
云端卫士《实战录》栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益。本期分享人为云端卫士系统架构师高鹏,将带来常见的DDoS的分享。
DDoS(Distributed Denial of Service:分布式拒绝服务)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。
请DDoS攻击的主要表现形式
一、流量型攻击
这种攻击消耗网络带宽或使用大量数据包淹没一个或多个路由器、服务器和防火墙;带宽攻击的普遍形式是大量表面看合法的 TCP、UDP 或 ICMP 数据包被传送到特定目的地;为了使检测更加困难,这种攻击也常常使用源地址欺骗,并不停地变化。这种攻击相对而言更加难以防御,因为合法数据包和无效数据 包看起来非常类似。
二、资源耗尽型
利用TCP和HTTP等协议定义的行为来不断占用计算资源以阻止它们处理正常事务和请求。HTTP 半开和 HTTP 错误就是应用攻击的两个典型例子,缓存溢出攻击-试图在一个缓存中存储超出其设计容量的数据。这种多出的数据可能会溢出到其他的缓存之中,破坏或者覆盖其中的有效数据。
常见的DDoS攻击类型
通常在进行 TCP 连接需要进行三次握手。当客户端向服务端发出请求时,首先会发送一个 TCP SYN 数据包。而后,服务器分配一个控制块,并响应一个 SYN ACK 数据包。服务器随后将等待从客户端收到一个 ACK 数据包。如果服务器没有收到ACK 数据包,TCP连接将处于半开状态,直到服务器从客户端收到ACK数据包或者连接因为 time-to-live(TTL)计时器设置而超时为止。在连接超时的情况下,事先分配的控制块将被释放。
当一个攻击者有意地、重复地向服务器发送 SYN 数据包,但不对服务器发回的SYN ACK 数据包答复 ACK 数据包时,就会发生 TCP SYN 泛洪攻击。这时,服务器将会失去对资源的控制,无法建立任何新的合法TCP连接。
图1 tcp三次握手
图2 syn-flood攻击图解
2、UDP flood攻击
UDP flood 又称UDP洪水攻击或UDP淹没攻击,UDP是没有连接状态的协议,因此可以发送大量的 UDP 包到某个端口,如果是个正常的UDP应用端口,则可能干扰正常应用,如果是没有正常应用,服务器要回送ICMP,这样则消耗了服务器的处理资源,而且很容 易阻塞上行链路的带宽。
常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。100k pps的UDPFlood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。在UDPFLOOD攻击中,攻击者可发送大量伪造源IP地址的小 UDP包。
但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。
3、ICMP攻击
利用ICMP报文进行网络攻击主要分为三种类型:死亡之Ping、ICMP DoS攻击、基于重定向的路由欺骗。
1死亡之Ping
这种攻击主要是由于单个包的长度超过了ip协议规范所规定的包长度,死亡之ping首先是以太网长度有限,ip包片段被分片,当一个长度超过以太网帧的最大尺寸时,包被分片,作为多个帧来发送。接收端的机器提取各个分片,并重组为一个完整的皮包。在正常情况下,ip头包含整个ip包的长度。当一个ip包被分片以后,头只包含各个分片的长度。
分片并不包含整个ip包的长度信息,因此ip包一旦被分片,重组后的整个ip包的总长度只有在所在的分片都接受完毕之后才能确定。
在IP协议规范中规定了一个IP包的最大尺寸,而大多数的包处理程序又假设包的长度超过这个最大尺寸这种情况是不会出现的。因此,包的重组代码所分配的内存区域也最大不超过这个最大尺寸。
这样,超大的包一旦出现,包当中的额外数据就会被写入其他正常区域。这很容易导致系统进入非稳定状态,是一种典型的缓存溢出(Buffer Overflow)攻击。在防火墙一级对这种攻击进行检测是相当难的,因为每个分片包看起来都很正常。
由于使用ping工具很容易完成这种攻击,以至于它也成了这种攻击的首选武器,这也是这种攻击名字的由来。
2ICMP DoS攻击
针对带宽的Dos:
ICMP echo reply报文具有高转发优先级,攻击者向被攻击的主机发送大量源ip伪造的ICMP echo request报文,被攻击主机回复主机不可达,攻击主机带宽被占用,不能正常服务,这种攻击方式要求主句处理能力和带宽要大于被攻击主机,否则自身被Dos了。
图3 icmp dos攻击
针对连接的Dos:
针对连接的dos攻击,可以终止现有的网路连接,会影响所有的ip设备,因为它使用了合法的icmp的消息。通过发送一个伪造的ICMP Destination Unreachable或者Redirect消息来终止合法的网络连接。更恶意的是如puke和smack会给某一个范围内的端口发送大量的数据包,毁掉大量的网络连接,同时还会消耗受害主机cpu的时钟周期。
3基于重定向的路由欺骗
ICMP重定向报文是当主机采用非最优路由发送数据报时,设备会发回ICMP重定向报文来通知主机最优路由的存在。一般情况下,设备仅向主机而不向其它设备发送ICMP重定向报文,但一些恶意的攻击可能跨越网段向另外一个网络的主机发送虚假的重定向报文,以改变主机的路由表,破坏路由,干扰主机正常的IP报文转发,并以此增强其窃听能力。
4、Smurf 攻击
与通常的Dos攻击不同,Smurf攻击并不直接对目标主机发送服务请求包。所谓的Smurf攻击是指,攻击者在远程机器上发送ICMP答应请求服务,其目标主机不是一个主机的IP地址,而是某个网络的广播地址,其请求包的源IP不是发起攻击的IP地址,而是加以伪装的将要攻击的主机IP地址。
大量的主机收到ICMP应答请求服务包后,按源IP返回请求信息,从而导致受攻击主机的服务性能下降,甚至崩溃。
图4 smurf攻击
5、Fraggle攻击
类似于Smurf,使用UDP应答消息而非ICMP。UDP端口7(ECHO)和端19(Chargen)在收到UDP报文后,都会产生回应。在UDP 的7号端口收到报文后,会回应收到的内容,而UDP的19号端口在收到报文后,会产生一串字符流。它们都同ICMP一样,会产生大量无用的应答报文,占满网路带宽。
攻击者可以向子网广播地址发送源地址为受害网络或受害主机的UDP包,端口号用7或19。子网络启用了此功能的每个系统都会向受害者的主机做出响应,从而引发大量的包,导致受害网络的阻塞或受害主机的崩溃;子网上没有启动这些功能的系统将产生一个ICMP不可达的消息,因而仍然消耗带宽。
也可将源端口改为Chargen。目的端口为ECHO,这样会自动不停地产生回应报文,其危害性更大。
6、land flood攻击
Land flood攻击是用一个特别打造的syn包,它的源地址和目标地址都被设置成某一个服务器地址。此举将导致服务器向它自己的地址发送syn-ack消息,结果这个地址有发回ack消息并穿件一个空连接,被攻击的服务器没接受一个这样的连接都将保留,直到超时。
7、NTP Reply flood攻击
正常情况下,客户端向NTP服务器发送请求后,NTP服务器向客户端答复请求,流程大概如下图:
但是,可以构造UDP数据包,由于UDP没有TCP的三次握手,导致随意的数据包可以流过去,于是,将UDP数据包中源地址改成欲攻击对象的,这样返回的数据包就飞到那个造孽的娃娃电脑上去了,大概流程图如下:
图5 NTP Reply flood攻击
8、Tear drop
利用UDP包重组时重叠偏移(假设数据包中第二片IP包的偏移量小于第一片结束的位移,而且算上第二片IP包的Data,也未超过第一片的尾部, 这就是重叠现象。)的漏洞对系统主机发动拒绝服务攻击,最终导致主机菪掉;对于Windows系统会导致蓝屏死机,并显示STOP 0x0000000A错误。
对付这种类型得攻击最好的方法就是要及时为操作系统打补丁了,但是Teardrop攻击仍然会耗费处理器的资源和主机带宽。
图6 TearDrop攻击
9、HTTP GET/POST Flood攻击
这种攻击主要是针对存在ASP、JSP、PHP、CGI等脚本程序,并调用MSSQLServer、MySQLServer、Oracle等数据库的网站系统而设计的,特征是和服务器建立正常的TCP连接,并不断的向脚本程序提交查询、列表等大量耗费数据库资源的调用,典型的以小博大的攻击方法。
一般来说,提交一个GET或POST指令对客户端的耗费和带宽的占用是几乎可以忽略的,而服务器为处理此请求却可能要从上万条记录中去查出某个记录,这种处理过程对资源的耗费是很大的,常见的数据库服务器很少能支持数百个查询指令同时执行,而这对于客户端来说却是轻而易举的。
因此攻击者只需通过Proxy代理向主机服务器大量递交查询指令,只需数分钟就会把服务器资源消耗掉而导致拒绝服务,常见的现象就是网站慢如蜗牛、ASP程序失效、PHP连接数据库失败、数据库主程序占用CPU偏高。
这种攻击的特点是可以完全绕过普通的防火墙防护,轻松找一些Proxy代理就可实施攻击,缺点是对付只有静态页面的网站效果会大打折扣,并且有些Proxy会暴露攻击者的IP地址。
图7 http get flood
10、IP Fragment攻击
fragment攻击是指通过恶意操作,发送极小的分片来绕过包过滤系统或者入侵检测系统的一种攻击手段。攻击者通过恶意操作,可将TCP报头(通常为20字节)分布在2个分片中,这样一来,目的端口号可以包含在第二个分片中。
11、ACK flood攻击
ack攻击是tcp建立连接以后,所有的数据传输tcp报文都是带有ack标志位的,主机在接收一个带有ack标识位的数据包的时候,需要检查该数据包所表示的连接四元组是否合法,如果合法,然后再向应用层传递该数据包。
如果检查中发现该数据包不合法,例如,该数据包所指向的目的端口在本机并未开放,则主机操作系统协议栈会回应RST包告诉对方该端口不存在。
相比主机收到的ack报文和syn报文时所作动作的复杂程度,显然ACK报文带来的负载要小的多,所以在实际环境中,只有攻击程序每秒钟发送ack报文的速率达到一定程度,才能使主机和防火墙的负载大有变化。
当发送速率很大的时候,主机操作系统将耗费大量的精力接收报文、判断状态,同事要主动回应RST报文,正常的数据包就可能无法得到及时的处理,这时候客户端的表现就是访问页面反应很慢,丢包率很高。
图8 ack flood攻击
12、HTTP Slow Header
Slow-Header的工作原理是利用在服务器端的客户闲置端超时值。如果客户端被发现闲置了超过所配置的时间,服务器端將放弃客户端连接。
Slow-Header攻击查找服务器端设定的近似值,选择一个较低的值,然后向服务器启动一个加上Partial header的HTTP请求。它不断发送基于选择的值的header,这样客户端的空闲超时不会被触发而服务器端的请求将不能完成。
图9 Httpslow Header
13、DNS query flood攻击
DNS 服务器在接收到域名解析请求的时候首先会在服务器上查找是否有对应的缓存,如果查找不到并且该域名无法直接由服务器解析的时候,DNS 服务器会向其上层DNS服务器递归查询域名信息。
域名解析的过程给服务器带来了很大的负载,每秒钟域名解析请求超过一定的数量就会造成DNS服务器解析域名超时。
根据微软的统计数据,一台DNS服务器所能承受的动态域名查询的上限是每秒钟9000个请求。而我们知道,在一台P3的PC机上可以轻易地构造出每秒钟几万个域名解析请求,足以使一台硬件配置极高的DNS服务器瘫痪,由此可见DNS 服务器的脆弱性。
目前最常用的DNS服务器软件是国内领先的WINMYDNS,以及国外的Bind等。通常攻击者采用的手段包括:
常用手段
(1) 利用发包程序向DNS服务器发送不带任何负载的NULL数据包。由于数据包本身不符合协议规定,服务器在收到报文的时候将直接丢弃。因此这种攻击方式除非攻击流量比较大,否则不会有明显的效果。
(2) 利用程序构造DNS解析请求固定的域名,由于DNS服务器在解析请求的时候会在系统cache存放上一次解析的结果,这种攻击方式也需要较大的流量。
(3)向DNS服务器发起解析请求随机的、不存在的域名;这样DNS服务器就需要进行频繁的字符串匹配,由于在本地无法查到对应的结果,服务器必须使用递归查询向上层域名服务器提交解析请求,引起连锁反应。
14、DNS amplification flood攻击
通过向一系列无辜的第三方DNS服务器发送大量的查询请求(小的和欺骗性的询问信息),这些查询请求数据包中的源IP地址为被攻击主机的IP地址,DNS服务器将大量的查询结果发送给被攻击主机,使被攻击主机所在的网络拥塞或拒绝服务。