【漏洞分析】DDOS攻防分析(四)——TCP篇

0x00 TCP DDOS攻击案例

政治因素一直是黑客发动网络攻击的一个重要动机。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等多种类型的攻击。

0x01 TCP SYN 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和源端口的虚假源攻击,可以达到最佳防御效果。

0x02 SYN-ACK Flood 攻击与防御

通信双方通过三次握手建立一个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/)

0x03 ACK Flood 攻击与防御

在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报文会因为没有命中会话而被丢弃,因此对正常业务有一定的影响。

0x04 FIN/RST Flood 攻击与防御

TCP交互过程中还存在FIN和RST报文,FIN报文用来关闭TCP连接,RST报文用来断开TCP连接。这两种报文也可能会被攻击者利用来发起DDoS攻击,导致目标服务器资源耗尽,无法响应正常的请求。

市面上的抗DDOS设备也是使用会话检查的方式防御FIN/RST Flood攻击,如果FIN/RST报文没有命中会话,直接丢弃报文;如果FIN/RST报文命中会话,则根据会话创建原因和会话检查结果来判断该报文是否通过:

l 如果会话是由SYN或SYN-ACK报文创建的,则允许该FIN/RST报文通过。

l 如果会话是由其他报文创建的(例如ACK报文),则进一步检查报文序号是否正确,序号正确的报文允许通过,序号不正确的报文则被丢弃。

0x05TCP** 连接耗尽攻击与防御**

TCP是面向连接的协议,通信双方必须保持连接状态,并且通过确认、重传、滑动窗口等机制,保证数据传输的可靠性和稳定性。攻击者利用TCP协议的上述特点,在TCP连接上做文章,利用TCP连接来消耗被攻击目标的系统资源,这类攻击的影响也不容小觑。

例如,攻击者与被攻击目标完成三次握手后,立刻发送FIN或RST报文,释放本端连接,同时快速发起新的连接,以此来消耗被攻击目标的系统资源。抗DDOS设备通过检查新建连接的速率来防御此类攻击。首先,针对受保护目标进行统计,当受保护目标的TCP新建连接速率超过阈值时,启动防御功能。然后针对源进行统计,如果某个源IP在指定的时间间隔内发起的TCP新建连接数超过了阈值,则将该源IP加入黑名单。

又比如,攻击者与被攻击目标完成三次握手后,发送很少的报文来维持连接状态,通过这种异常的TCP连接来消耗被攻击目标的系统资源。抗DDOS设备通过异常会话检查来防御此类攻击。如果受保护目标的TCP连接上特定时间内通过的报文数小于阈值,则认为该连接为异常会话。如果在特定时间内某个源IP的异常会话数超过阈值,则将该源IP加入黑名单。

除此之外,攻击者还会使用一些其他的攻击手段,比如构造大量的并发连接、设置很小的TCP窗口、发送重传报文等,其目的都是消耗被攻击目标的系统资源。总体来说,抗DDOS设备防御此类攻击时,还是基于会话机制,通过新建连接速率检查、并发连接数检查、异常会话检查等措施,将攻击源加入黑名单,阻断攻击流量达到防御效果。

0x06 TCP 异常报文攻击与防御

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异常报文攻击。

相关推荐
William一直在路上2 小时前
KONG API Gateway中的核心概念
网络·gateway·kong
sakoba5 小时前
Docker学习其二(容器卷,Docker网络,Compose)
运维·网络·学习·docker·容器·基础
惜.己7 小时前
appium中urllib3.exceptions.LocationValueError: No host specified. 的错误解决办法
网络·appium
吉凶以情迁7 小时前
window服务相关问题探索 go语言服务开发探索调试
linux·服务器·开发语言·网络·golang
专注VB编程开发20年7 小时前
UDP受限广播地址255.255.255.255的通信机制详解
网络·udp·智能路由器
189228048618 小时前
NX947NX955美光固态闪存NX962NX966
大数据·服务器·网络·人工智能·科技
Sadsvit9 小时前
Linux 进程管理与计划任务
linux·服务器·网络
一碗白开水一10 小时前
【模型细节】FPN经典网络模型 (Feature Pyramid Networks)详解及其变形优化
网络·人工智能·pytorch·深度学习·计算机视觉
什么都想学的阿超10 小时前
【网络与爬虫 38】Apify全栈指南:从0到1构建企业级自动化爬虫平台
网络·爬虫·自动化
D-海漠11 小时前
安全光幕Muting功能程序逻辑设计
服务器·网络·人工智能