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

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() 操做便可产生挥手操做。socket

第一次挥手(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)。欢迎留言讨论,咱们会尽量回复。

感谢您的阅读。
相关文章
相关标签/搜索