要点梳理:TCP 连接及常见攻击手法分析

1,974 阅读8分钟

TCP 协议

TCP 协议是一种面向连接的、可靠的字节流通信协议。

可靠性

  • 数据校验:TCP 在传输过程中可以通过校验和,确认和重传机制保证可靠传输。
  • 数据顺序性:TCP 给数据分节进行排序,并使用累计确认保证数据的顺序不变和非重复。
  • 流量与拥塞控制:TCP 使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制。

连接建立与关闭

三次握手建立连接

三次握手是指,建立一个 TCP 连接,需要客户端和服务端总共发送三个包。

第一次握手(SYN=1,seq=x)

客户端发送一个 TCP 的 SYN 标志位置 1 的包,指明客户端准备连接服务器的端口,以及初始序列号 X,保存在包头的序列号(Sequence Number)字段里。发送完毕后,客户端进入 SYN_SEND 状态。

其中第一次的序列号是随机的,这样是为了网络安全,如果不是随机产生初始序列号,黑客将会以很容易的方式获取到你与其他主机之间的初始化序列号,并且伪造序列号进行攻击。

第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1)

服务器发回确认包(ACK)应答,即 SYN 标志位和 ACK 标志位均为1.服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。发送完毕后,服务器进入 SYN_RCVD 状态。

第三次握手(ACK=1,ACKnum=y+1)

客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方。发送完毕后,客户端发送完毕后进入 ESTABLISHED 状态,TCP 握手结束。

四次挥手关闭连接

四次挥手是指,TCP 连接的拆除需要发送四个包。

客户端或服务器均可发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。

第一次挥手(FIN=1,seq=x)

当发送 FIN 包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。发送完毕后,(假设发送方式客户端)客户端进入 FIN+WAIT_1 状态。

第二次挥手(ACK=1,ACKnum=X+1)

服务器确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但是还没准备好关闭连接(理论上:有可能还有数据向客户端传送)

第三次挥手(FIN=1, seq=y)

服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个 ACK 。

第四次挥手(ACK=1,ACKnum=y+1)

客户端接受到来自服务器的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态,等待可能出现的要求重传 ACK 包。服务器端接受到这个确认包后,关闭连接,进入 CLOSED 状态。

客户端等待 2MSL 之后,没有收到服务器端的 ACK ,认为服务器端已经处于正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

握手中的攻击手段

SYN Flooding

攻击原理

当 Server(B) 收到 Client(A) 的 SYN 请求报文时,将发送一个(ACK,SYN)应答报文,同时创建一个控制结构,将其加入到一个队列中,等待对方的 ACK 报文。接收到 ACK 报文后,双方都进入连接状态。如果 Server 在一段时间内没有收到应答消息,则控制块将被释放。

在 TCP 协议软件中,通常对每个端口等待建立链接的数目有一定限制,当队列长度到达设定阈值时,将丢弃后面到达的 TCP SYN 请求报文。

如果攻击者不断发送大量的 TCP SYN 报文,其他用户就无法再链接到被攻击者服务器。

应对措施

通过增加连接数目、减小超时时间,可以缓解攻击,但是无法从根本阻止攻击,是 DOS 的一种,可通过 netstat 命令通过查看服务器网络连接情况,如果存在大量 SYN 的连接,则有可能收到了SYN Flooding攻击。

Land 攻击

利用了 TCP 连接建立的三次握手过程,通过向一个目标计算机发送一个 TCP SYN 报文(连接请求报文)而完成对目标计算机的攻击。

攻击原理

与正常的 TCP SYN 报文不同的是,LAND 攻击报文的源 IP 地址和目的 IP 地址是相同的,都是目标计算机地址,这样目标计算机接受到 SYN 报文后,就会向该报文的源地址发送一个 ACK 报文,并建立一个 TCP 连接控制结构(TCB),而该报文的源地址就是自己,因此,这个 ACK 报文就发给了自己。这样如果攻击者发送了足够多的 SYN 报文,则目标计算机的 TCB 可能会耗尽,最终不能正常服务。

这也是一种 DOS 攻击。可以通过 Kali Linux 提供的如 hping3 实现伪造包的功能。

应对措施

可以通过防火墙、路由设备,建立规则,丢掉源地址和目标地址相同的 SYN、SYN+ACK 和 TCP。

TCP 劫持

利用 TCP 会话劫持,可以方便地修改、伪造数据。

攻击原理

TCP 通过三次握手建立连接以后,主要采用滑动窗口机制来验证对方发送的数据。如果对方发送的数据不在自己的接收窗口内,则丢弃此数据,这种发送序号不在对方接收窗口的状态称为非同步状态。

当通信双方进入非同步状态后,攻击者可以伪造发送序号在有效接收窗口内的报文,,也可以截获报文,篡改内容后,再修改发送序号,而接收方会认为数据是有效数据。

TCP 劫持的关键在于使通信双方进入非同步状态。有多种方法可以达到此目的。

如四次挥手状态图所示,在主机 A 发送 SYN 请求后,B 发送 ACK & SYN 进行应答,则 A 认为连接已经建立。此时,攻击者伪装成 A 向 B 发送一个 RST 报文,则 B 释放连接,攻击者继续伪装成 A 用自己的初始序列号和 B 建立新的连接,而 A 和 B 对此毫不觉察。当攻击者伪装成 A 和 B 建立连接后,A 和 B 就已经进入了非同步状态。

利用 Telnet 协议的 NOP 命令也可以使通信双方进入非同步状态。主机 B 接收到 NOP 命令后,并不进行任何操作,但确认序列号将会加 1。如果攻击者伪装成 A 向 B 发送大量的 NOP 命令,则会造成 A 和 B 的非同步状态。

应对措施

检测 TCP 劫持的关键在于检测非同步状态。如果不断收到在接收窗口之外的数据或确认报文,则可以确定遭到 TCP 劫持攻击。或者设置禁止 RST 报文。

TCP 伪装

TCP 伪装主要是获取其他客户端的初始序列号进行伪装。

攻击原理

要进行 TCP 伪装,就意味着在建立连接时,攻击者需要知道被伪装者的当前初始序列号。

序列号的生成算法一般有三种,一是不断增加一个常量,二是不断增加一个与时间相关的变量,三是伪随机数。对于前两种算法而言,其规律都能通过测试观察得到。也就是说,如果攻击者与被欺骗的目标主机处于同一网络,那么在排除了被伪装身份主机的干扰以后,可以比较简单地通过网络嗅探分析出初始序列号来。

当攻击者与可以通信的两台主机不在同一网络时,由于攻击者无法接收到响应包,这种攻击较为困难。但它并非万全,因为攻击者仍可配合路由欺骗的方法将响应包转发出来,从而实现上述攻击。

应对措施

TCP 伪装利用 TCP 协议本身的设计,最自然、直接和本质的思路是不在有安全需求的场合使用 TCP,而是考虑 TLS 等对连接双方有认证、对网络会话有加密的协议。

也有一些其他的方法能够从外部防止该攻击:将序列号生成算法换为伪随机数能避免初始序列号被推解,或是在路由器拒绝来自外网但使用内网源 IP 地址的数据包。


文 / blank

编 / 荧声

本文已由作者授权发布,版权属于创宇前端。欢迎注明出处转载本文。

想要看到更多来自知道创宇开发一线的分享,请搜索关注我们的微信公众号:创宇前端(KnownsecFED)。欢迎留言讨论,我们会尽可能回复。

感谢您的阅读。