【漏洞分析】DDOS攻防分析(四)——TCP篇
政治因素一直是黑客发动网络攻击的一个重要动机。2015年12月,著名黑客组织匿名者(Anonymous)发布视频谴责土耳其支持ISIS,并向土耳其发动了史上最大规模的DDoS攻击。
2015年12月14日开始,大规模网络攻击导致土耳其银行、政府网站离线,土耳其三家知名银行Ziraat银行,Isbank和Garanti确认受到攻击,攻击流量峰值带宽高达40Gbps。
一名土耳其电信代理商发言人Onur Oz在接受路透社采访时称:
“这次网络攻击事件是很严重的,但是这次目标不是土耳其电信,相反,土耳其的银行和公共机构网络受到了严重的攻击。现在大多数的土耳其机构使用土耳其电信作为网络服务商,目前我们在积极应对这次网络攻击并做好防御工作。”
土耳其大多数的银行和政府网站在华为Anti-DDoS系统防御之下,大流量攻击导致防御系统性能过载。华为工程师现场紧急扩容板卡,研发远程7*24小时值守,虽然黑客不断变更攻击手法,但所有攻击均被成功阻断,网站访问正常。
下面这个报表是从12月14日攻击开始,到12月31日攻击结束的攻击流量峰值带宽。从报表中可以看出,攻击持续时间相当长,而且攻击峰值最高达到40Gbps。
这次DDoS攻击事件中,Anonymous发动的是混合型的攻击,包含SYN flood、UDP flood、HTTP flood等多种类型的攻击。
什么是SYN flood攻击?
SYN flood是互联网上最经典的DDoS攻击方式之一,也是最原始的DDoS攻击,最早出现于1999年左右。在网络发展初期,由于系统的限制以及硬件资源性能的低下,SYN flood的出现对网络安全界是一大冲击。它与当时的单包攻击的不同在于,你很难通过单个报文的特征或者简单的统计限流防御住它,因为它“太真实”、“太常用”。 SYN flood能够一直占据江湖大佬地位这么多年依旧风生水起也是有原因的。SYN flood具有强大的变异能力,在攻击发展潮流中一直没有被湮没,这完全是他自身的优秀基因所决定的:
1、 攻击成本低,攻击过程简单。
2、 难防御,每个报文看起来都是一个正常的报文。
SYN flood是基于TCP协议产生的,所以我们先回顾一下TCP的三次握手。
再来看SYN flood,SYN flood其实就是利用三次握手机制,制造多个半连接,消耗服务器的连接数。
黑客伪造源IP地址向服务器发送大量的SYN报文,请求建立三次握手。由于发送源IP是伪造的,所以服务器回应了SYN-ACK报文后,源IP并不会再继续回应ACK报文进行确认。这样服务器就会维持一个庞大的等待列表,不停地重试发送SYN-ACK报文,同时占用着大量的资源无法释放。这就导致,被攻击的服务器被恶意半连接占满,不再接受新的SYN请求,而合法用户无法完成三次握手建立TCP连接。
这就好比你去超市买东西,来了一大帮人,他们也不买东西,却把所有收银台都占满了,既不结账,也不走,这就是半连接。结果导致所有收银台都无法为正常客户结账,超市业务瘫痪,这就是资源耗尽。
防御SYN Flood攻击的常用手段是源认证,从SYN报文建立连接的“行为”入手,判断是不是真实源发出的请求。源认证包括基本源认证和高级源认证两种方式,先来学习基本源认证。
基本源认证
基本源认证的原理是抗DDOS设备代替服务器向客户端响应SYN-ACK报文,报文中带有错误的确认序号。我们在前面介绍过,真实的客户端收到带有错误确认序号的SYN-ACK报文后,会向服务器发送RST报文,要求重新建立连接;而虚假源收到带有错误确认序号的SYN-ACK报文,不会做出任何响应。抗DDOS设备通过观察客户端的响应情况,来判断客户端的真实性。
1、当连续一段时间内去往目标服务器的SYN报文超过告警阈值后,抗DDOS设备启动源认证机制。源认证机制启动后,抗DDOS设备将会代替服务器向客户端响应带有错误确认序号的SYN-ACK报文。
2、如果这个源是虚假源,是一个不存在的地址或者是存在的地址但却没有发送过SYN报文,不会做出任何响应。
3、如果这个源是真实客户端,则会向服务器发送RST报文,要求重新建立连接。抗DDOS设备收到RST报文后,将该客户端的源IP地址加入白名单。
4、后续这个客户端发出的SYN报文命中白名单直接通过。
基本源认证方式存在一定的局限性,如果网络中存在某些设备会丢弃带有错误确认序号的SYN-ACK报文,或者有的客户端不响应带有错误确认序号的SYN-ACK报文,基本源认证就不能生效了。此时,可以使用高级源认证来验证客户端的真实性。
高级源认证
高级源认证的原理也是抗DDOS设备代替服务器向客户端响应SYN-ACK报文,但与基本源认证不同的是,SYN-ACK报文中带有正确的确认序号。真实的客户端收到带有正确确认序号的SYN-ACK报文后,会向服务器发送ACK报文;而虚假源收到带有正确确认序号的SYN-ACK报文,不会做出任何响应。Anti-DDoS系统通过观察客户端的响应情况,来判断客户端的真实性。
1、当连续一段时间内去往目标服务器的SYN报文超过告警阈值后,抗DDOS设备启动源认证机制。源认证机制启动后,抗DDOS设备将会代替服务器向客户端响应带有正确确认序号的SYN-ACK报文。
2、如果这个源是虚假源,是一个不存在的地址或者是存在的地址但却没有发送过SYN报文,不会做出任何响应。
3、如果这个源是真实客户端,则会向服务器发送ACK报文,对收到的SYN-ACK报文进行确认。抗DDOS设备收到ACK报文后,将该客户端的源IP地址加入白名单。同时,抗DDOS设备会向客户端发送RST报文,要求重新建立连接。
4、后续这个客户端发出的SYN报文命中白名单直接通过。
无论是基本源认证还是高级源认证,其原理都是抗DDOS设备发送SYN-ACK报文来对源进行认证,形象点说,抗DDOS设备收到SYN报文后会反弹SYN-ACK报文。如果网络中存在海量的SYN报文,同样抗DDOS设备也会反弹出去海量的SYN-ACK报文,这样势必就会造成网络拥塞更加严重。
为了避免这个问题,减少反弹的SYN-ACK报文对网络拥塞的影响,抗DDOS设备提供了首包丢弃功能。
首包丢弃
TCP的可靠性保证除了面向连接(三次/四次握手)之外,还体现在超时与重传机制。TCP协议规范要求发送端每发送一个报文,就启动一个定时器并等待确认信息;如果在定时器超时前还没有收到确认,就会重传报文。
首包丢弃功能就是利用了TCP的超时重传机制,Anti-DDoS系统对收到的第一个SYN报文直接丢弃,然后观察客户端是否重传。如果客户端重传了SYN报文,再对重传的SYN报文进行源认证,即反弹SYN-ACK报文,这样就可以大大减少反弹报文的数量。
实际部署时,我们将首包丢弃和源认证结合使用。防御SYN Flood攻击时,先通过首包丢弃功能来过滤掉一些攻击报文,当重传的SYN报文超过告警阈值后,再启动源认证。这样就能够减少反弹的SYN-ACK报文的数量,缓解网络拥塞情况。对于虚假源攻击,尤其是对于不断变换源IP和源端口的虚假源攻击,可以达到最佳防御效果。
通信双方通过三次握手建立一个TCP连接的过程中,SYN-ACK报文出现在第二次握手中,是用来确认第一次握手的。一方收到SYN-ACK报文后,首先会判断该报文是不是属于三次握手范畴之内的报文。如果都没有进行第一次握手就直接收到了第二次握手的报文,那么就会向对方发送RST报文,告知对方其发来报文有误,不能建立连接。
SYN-ACK Flood攻击正是利用了这一点,攻击者利用工具或者操纵僵尸主机,向目标服务器发送大量的SYN-ACK报文,这些报文都属于凭空出现的第二次握手报文,服务器忙于回复RST报文,导致资源耗尽,无法响应正常的请求。
抗DDOS设备解决方案使用源认证方式防御SYN-ACK Flood攻击,其原理是抗DDOS设备向发送SYN-ACK报文的源地址发送SYN报文,相当于发起了第一次握手,探测该地址是否真实存在。真实的源会向Anti-DDoS系统响应正确的SYN-ACK报文,也就是第二次握手的报文;而虚假的源则不会响应正确的SYN-ACK报文。
1、当连续一段时间内去往目标服务器的SYN-ACK报文超过告警阈值后,抗DDOS设备启动源认证机制。源认证机制启动后,抗DDOS设备向发送SYN-ACK报文的源地址发送SYN报文。
2、如果这个源是虚假源,不会向抗DDOS设备响应正确的SYN-ACK报文。
3、如果这个源是真实源,会向抗DDOS设备响应正确的SYN-ACK报文。抗DDOS设备收到该SYN-ACK报文后,将该源IP地址加入白名单,同时会向源地址发送RST报文,断开自己和这个源地址的连接。
4、后续这个源发出的SYN-ACK报文命中白名单直接通过,而对于那些未匹配白名单的SYN-ACK报文则继续进行源认证。
抗DDOS设备防御SYN-ACK Flood攻击与防御SYN Flood攻击采用的方式类似,也是采用源认证的方式。区别是防御SYN-ACK Flood攻击时,通过发送中TCP第一次握手中的SYN报文来探测源是否真实存在,防止虚假源攻击。可见,对于这两种基于TCP的面向连接的DDoS攻击,最有效的防御方式就是源认证。
(author Zhaoxuepeng https://www.cnblogs.com/Shepherdzhao/)
在TCP三次握手的过程中,ACK报文出现在第三次握手中,用来确认第二次握手中的SYN-ACK报文。ACK Flood攻击指的是攻击者利用工具或者操纵僵尸主机,向目标服务器发送大量的ACK报文,服务器忙于回复这些凭空出现的第三次握手报文,导致资源耗尽,无法响应正常的请求。
抗DDOS设备解决方案使用会话检查的方式防御ACK Flood攻击,这与防御SYN Flood和SYN-ACK Flood时采用的方式有所不同。提到会话,大家应该不会陌生,它是状态检测防火墙的一个机制,是防火墙最基本的功能,也是实现安全防护的基础技术。
抗DDOS设备借鉴了防火墙的会话机制,通过检查会话来确定ACK报文的真实性。我们可以把抗DDOS设备看成是关闭了链路状态检查功能的防火墙,SYN、SYN-ACK、ACK等报文都会创建会话。对于一次正常的TCP连接建立过程来说,必须先有SYN报文,接着是SYN-ACK报文,然后才是ACK报文,所谓有“因”才有“果”。只有ACK报文命中了会话这个“因”,才能说明该报文是正常交互过程中的报文,是真实的。
抗DDOS设备对ACK报文进行会话检查时,支持基本和严格两种模式,我们先来看基本模式。
基本模式
使用基本模式时,抗DDOS设备对ACK报文进行会话检查,如果ACK报文没有命中会话,抗DDOS设备会允许第一个ACK报文通过,并建立会话,以此来对后续ACK报文进行会话检查;如果ACK报文命中了会话,则继续检查报文的序号,序号正确的报文允许通过,序号不正确的报文则被丢弃。
基本模式允许第一个ACK报文通过,检查条件比较宽松。如果攻击者发送变源或变端口的ACK报文,基本模式会允许报文通过并建立会话,这样就会导致攻击报文被放过,影响防御效果。为此,抗DDOS设备提供了严格模式,检查条件更加严格,防御效果也会更好一些。
严格模式
严格模式指的是抗DDOS设备对ACK报文进行会话检查时,如果ACK报文没有命中会话,直接丢弃报文;如果ACK报文命中会话,并且序号正确,允许报文通过。
严格模式的检查条件比较苛刻,没有命中会话的ACK报文都会被丢弃。在旁路部署动态引流的场景,由于报文来回路径不一致,正常业务的ACK报文会因为没有命中会话而被丢弃,因此对正常业务有一定的影响。
TCP交互过程中还存在FIN和RST报文,FIN报文用来关闭TCP连接,RST报文用来断开TCP连接。这两种报文也可能会被攻击者利用来发起DDoS攻击,导致目标服务器资源耗尽,无法响应正常的请求。
市面上的抗DDOS设备也是使用会话检查的方式防御FIN/RST Flood攻击,如果FIN/RST报文没有命中会话,直接丢弃报文;如果FIN/RST报文命中会话,则根据会话创建原因和会话检查结果来判断该报文是否通过:
l 如果会话是由SYN或SYN-ACK报文创建的,则允许该FIN/RST报文通过。
l 如果会话是由其他报文创建的(例如ACK报文),则进一步检查报文序号是否正确,序号正确的报文允许通过,序号不正确的报文则被丢弃。
TCP是面向连接的协议,通信双方必须保持连接状态,并且通过确认、重传、滑动窗口等机制,保证数据传输的可靠性和稳定性。攻击者利用TCP协议的上述特点,在TCP连接上做文章,利用TCP连接来消耗被攻击目标的系统资源,这类攻击的影响也不容小觑。
例如,攻击者与被攻击目标完成三次握手后,立刻发送FIN或RST报文,释放本端连接,同时快速发起新的连接,以此来消耗被攻击目标的系统资源。抗DDOS设备通过检查新建连接的速率来防御此类攻击。首先,针对受保护目标进行统计,当受保护目标的TCP新建连接速率超过阈值时,启动防御功能。然后针对源进行统计,如果某个源IP在指定的时间间隔内发起的TCP新建连接数超过了阈值,则将该源IP加入黑名单。
又比如,攻击者与被攻击目标完成三次握手后,发送很少的报文来维持连接状态,通过这种异常的TCP连接来消耗被攻击目标的系统资源。抗DDOS设备通过异常会话检查来防御此类攻击。如果受保护目标的TCP连接上特定时间内通过的报文数小于阈值,则认为该连接为异常会话。如果在特定时间内某个源IP的异常会话数超过阈值,则将该源IP加入黑名单。
除此之外,攻击者还会使用一些其他的攻击手段,比如构造大量的并发连接、设置很小的TCP窗口、发送重传报文等,其目的都是消耗被攻击目标的系统资源。总体来说,抗DDOS设备防御此类攻击时,还是基于会话机制,通过新建连接速率检查、并发连接数检查、异常会话检查等措施,将攻击源加入黑名单,阻断攻击流量达到防御效果。
TCP报文头中存在六个标志位字段,代表不同的含义,标志位的值置为1,表示该标志位起作用。我们在前面介绍TCP连接建立和断开过程时,提到过SYN、ACK和FIN标志位,下面是这六个标志位的详细信息:
l URG:置1时表示紧急指针有效。
l ACK:置1时表示确认序号有效。
l PSH:置1时表示接收方收到数据段后应该尽快送到应用程序。
l RST:置1时表示重新建立连接。
l SYN:置1时表示发起一个连接。
l FIN:置1时表示发送方完成发送任务,释放连接。
这六个标志位在TCP交互过程中各司其职,标志位置1与否必须严格遵循TCP协议规范。如果不遵循规范随意将标志位置0或置1,这类报文就称为TCP异常报文。接收方处理这些异常报文时会消耗系统资源,甚至可能会导致系统崩溃。攻击者也可以利用TCP异常报文来发起DDoS攻击,向被攻击目标发送大量的构造的TCP异常报文,导致被攻击目标系统资源耗尽、网络拥塞,无法正常提供服务。
抗DDOS设备通过检查TCP报文是否符合协议规范来防御异常报文攻击。例如,正常情况下TCP报文中六个标志位的值不可能都置为0。抗DDOS设备检查发现此类异常报文后,就直接将报文丢弃。
又比如,SYN标志位用来建立连接,FIN标志位用来断开连接,正常情况下同一个TCP报文中SYN和FIN标志位不可能同时置为1。同样,抗DDOS设备检查发现此类异常报文后,直接丢弃报文。
下面给出了抗DDOS设备判定TCP异常报文的原则,通过这些检查项,抗DDOS设备可以全面准确的防御TCP异常报文攻击。