TCP反射攻击研究

一、 TCP反射攻击

TCP反射攻击是一种较新型的攻击方式。攻击者会预先收集大量公网服务器的开放端口作为反射源。攻击时,攻击者向这些端口发送大量的SYN报文,这些SYN报文的源IP地址都被伪造成了攻击目标的IP地址。这样,公网服务器在收到这些SYN报文后,会向攻击目标回复大量的响应报文,形成反射攻击流,最终造成拒绝服务的效果。

针对遭遇到的TCP反射攻击流,我们抓取了大量的攻击流报文进行分析,并尝试对其中一部分反射服务器进行了反向探测,发现各种不同类型的反射服务器会形成具有不同特点的反射流。这些攻击流某些具有协议栈行为,某些则有其他的特殊之处,导致防御算法设计难度较大。

二、常见反射流

服务器在收到SYN报文后,会回复SYNACK报文,并开启一个半连接。然而,通常情况下,攻击者会在短时间向同一个服务器发送多个相同五元组的SYN报文。此时,后续的SYN报文就会与第一个SYN报文形成会话冲突。出现这种情况后,各种服务器实现的处理方式则各不相同。

2.1 标准反射流

Linux内核协议栈是按照标准的TCP协议规范处理SYN报文的,这类服务器所反射出的攻击流是最常见的TCP反射攻击流。这类反射流通常由SYNACK报文、ACK报文以及少量的RST报文组成。如下图所示:

Linux协议栈在收到第一个SYN报文时,会回复一个SYNACK报文。而对后续相同五元组的SYN报文的处理方式,则与第一个SYN报文的seq号SEQ1、服务器的窗口大小WIN以及当前SYN报文的seq号SEQ2有关。具体为:

  • 如果SEQ1与SEQ2相同,则会回复一个与之前完全相同的SYNACK报文。
  • 如果SEQ2小于SEQ1,或者SEQ2大于SEQ1 + WIN,则会回复一个ACK报文。该ACK报文的seq号为第一个SYNACK报文的seq号加一,ack_seq号为第一个SYN报文的seq号加一。
  • 如果SEQ2大于SEQ1,且小于等于SEQ1 + WIN,则会回复一个RST报文,并关闭半连接。

2.2 Syn Cookie

如果服务器在短时间之内收到大量不同五元组的SYN报文,会导致服务器在短时间内开启大量的半连接,从而使其半连接队列被占满,此时服务器将无法再处理新的连接请求。这种情况在遭遇SYN Flood攻击时尤为明显。

为了应对这种情况,部分服务器会使用Syn Cookie算法来进行处理。当前的主流操作系统大多支持Syn Cookie算法配置。算法开启后,当服务器的半连接队列满时,如果再收到SYN报文后,服务器将不会再为该SYN报文分配半连接,而是交由Syn Cookie算法处理。

Syn Cookie算法在收到任意SYN报文后,会根据SYN报文的五元组信息、时间戳以及MSS等一些信息计算一个特殊的seq号,并使用该seq号向客户端回复一个SYNACK报文。如果客户端是一个正常的访问者,则会回复ACK报文,服务器即可根据ACK报文的ack_seq号反向解析出SYNACK报文的seq号,并部分恢复出以上信息,用于校验ACK报文的可靠性。只有确定ACK报文可靠后,才会为对应的客户端实际分配连接。

因此,在这种情况下,服务器所发出的反射报文与通常情况不同,所有反射报文均为SYNACK报文。同时,根据服务器对Syn Cookie算法的实现不同,这些SYNACK报文所使用的seq号又各具特征。

  • 标准实现

标准实现中,SYNACK报文的seq号计算方式如下:

  1. 令t为一个缓慢递增的时间戳(通常为time()>>6,提供64秒的分辨率)。
  2. 令m为客户端通告的MSS,由于数据长度原因,会将MSS编码为一个3位数值。
  3. 令s为一个由五元组信息经过加密散列函数计算得到的24位值。
  4. seq号的计算规则为:高五位为t mod 32,中三位为m,末24位为s。

因此,如果在短时间内收到多个五元组与MSS相同的SYN报文,服务器也将回复多个完全相同的SYNACK报文。

  • Linux实现

Linux系统中,Syn Cookie的主体处理方式与标准实现基本一致,但对seq号的计算方式却与标准实现不相同。具体计算方式如下:

以上计算公式中,sseq为客户端的SYN报文中的序号,count为时间戳,data表示客户端通告的MSS值,其取值在比较新的内核中有 4 种。

由此可见,Linux服务器中,Syn Cookie算法回复的SYNACK报文的seq号与收到的SYN报文的seq号是相关的。当SYN报文的seq号变化时,SYNACK报文的seq号也会随同变化。

2.3 防端口扫描

观察攻击流时发现,某些服务器在收到任意SYN报文后,同样只回复SYNACK报文,但是SYNACK报文的seq号完全随机,没有规律。

通过分析和测试,基本确认此类服务器为一种蜜罐,或者服务器本身运行了某种防端口扫描的防护程序。这类服务器在收到一些典型的端口嗅探报文后,会无差别的回复一些响应报文,使得扫描者无法确定对应端口是否真的开启了。

此类服务器对于收到的任意SYN报文,均会回复SYNACK。其seq号可能根据实现的不同,各具特点。

此类服务器具有一个较为重要的特点,为了防止被恶意程序扫描到端口信息,这类服务器在收到指向任意端口的SYN报文,均会无差别的回复SYNACK报文。这导致这类服务器被用于反射攻击时,攻击者可以选定任意端口号作为反射源。而某些传统的防反射攻击的算法中,会针对特定端口号进行防护。这类服务器的存在会导致此类防护策略失效,进一步提高防护的难度。

2.4 Windows服务器

Windows服务器对SYN报文的处理方式与Linux服务器有相似之处,但又有诸多不同不同。我们使用了Win7和Win10两台服务器进行了反射测试,发现其处理方式基本一致,且同样与SEQ1、SEQ2和WIN有关。但具体的处理方式确与Linux服务器又有所不同:

  • 如果SEQ2小于SEQ1,或者超过,则服务器会再次发送一个与之前相同的SYNACK报文。
  • 如果SEQ2大于或者等于SEQ1,但小于SEQ1 + WIN,服务器不会回复任何报文,而是直接忽略等待SYNACK重传。
  • 此外,情况2中有一种特殊情况,即如果SEQ2 = SEQ1 + 1,则服务器会回复RST报文,并关闭会话。

三、 防御思路

由上述分析可知,TCP反射攻击形成的反射流特征较为复杂,其防护具有一定的难度,传统的防护算法很难形成有效的防护:

  • TCP反射形成的攻击流具有一定的协议栈行为,比传统使用攻击工具无脑发起的攻击迷惑性更强,更难防御。
  • TCP反射攻击的攻击报文有SYNACK、ACK和少量RST几种,与正常通信流程的报文构成类似,难以区分。
  • 由于网络中的服务器种类和配置等多种多样,导致最终形成的反射攻击流情况较多,更加复杂。

目前传统的防御方法主要是通过规则封禁源端口为0-1024、目的端口为0-1024的TCP报文,或者根据抓包封禁TCP反射的源端口。但是由于互联网上开放的服务端口越来越多,这种通过静态规则的方法往往无法适应攻击的变化,防护效果不够理想。

绿盟科技基于对各种反射器的深入研究和不断的攻防实践,提炼了一套基于动态探测+上下文识别+各维度判定的TCP反射防护算法,能够有效的防御TCP反射攻击。

Spread the word. Share this post!

Meet The Author

Leave Comment