TCP 复位攻击的原理和实战复现|课后作业

879 阅读4分钟

本文正在参与 “网络协议必知必会”征文活动

TCP 复位

什么是 TCP 复位

在 TCP 连接的数据报中,每一个包都包含了一个 TCP 头,而在这些头中都包含了一个复位标志("reset" (RST) flag)。在大多数包中这个位都被设置为 0 且不起任何作用。但是,如果该位设置为 1,则向接收计算机表明该计算机应立即停止使用 TCP 连接。TCP 复位基本上会立即终止 TCP 连接。

一个“栗子”

一个常见的场景:在 TCP 连接正在进行时,计算机(计算机 A)出现了崩溃。而另一端的计算机(计算机 B)将继续发送 TCP 数据包,因为它不知道计算机 A 已经崩溃。当计算机 A 重新启动时,它将从旧的崩溃前连接接收数据包。计算机 A 没有这些数据包的上下文,也无法知道如何处理它们,因此它直接就丢弃缓存区的包并发送 RST 包,它让计算机 B 知道连接不再有效,在计算机 B 收到 RST 包后也不必发送 ACK 包来确认。计算机 B 上的用户现在可以尝试另一个连接或执行其他操作。

TCP 复位攻击

什么是 TCP 复位攻击

接着上面介绍 TCP 复位的例子,新增一台计算机(计算机 C),它监视着计算机 A 和 计算机 B 连接上的 TCP 包。计算机 C 将 TCP 复位的数据包发送给计算机 B,表明自己是”计算机 A“,欺骗计算机 B 关闭了 TCP 连接。为了使得计算机 B 信服自己是计算机 A的身份,计算机 C 需要制作一个携带了正确的 Seq, Ack 的 TCP 段来表明身份。

实战复现

为了实现 TCP 复位攻击,攻击者必须:

  • 观察(或嗅探)受害者之间的网络流量
  • 嗅探 ACK 启用标志的 TCP 段并读取其确认号
  • 制作一个 RST 启用了标志的欺骗 TCP 段,序列号等于被拦截段的确认号
  • 将欺骗段发送给我们的一个或两个受害者,希望使他们终止他们的 TCP 连接

这里我用了一台虚拟机作为服务器,本机既作为靶机(客户端)也作为攻击机。使用 wireshark 来监听客户端与服务器之间的通信。

首先我使用 ssh (ssh1 非 sshv2) 命令来建立客户机和虚拟机之间的连接。例如:

ssh admin@xxx.xxx.xxx.xxx

使用 wiresharkKali 自带)进行抓包分析

sudo wireshark

我们可以在过滤那栏中添加 ip.src == 源地址 && ip.dst == 目标地址,右侧点击箭头后加以过滤。

Pasted image 20211128220308.png

成功建立连接后在 wireshark中,可以看到有一条 TCP 的连接,点开 Transmission Control Protocol,我们可以看到它的 Src Port,Dst Port,Seq,Ack 等信息。

有了这些信息后就可以开始伪造“身份”来进行攻击了,这里使用了 hping3,这是 Kali 操作系统自带的工具。 新开一个命令行窗口输入:

sudo hping3 192.168.43.238 -p 22 -s 60130 -R -A -M 153042453 -L 1914896372 -c 1

其中:

  • 192.168.43.238 是靶机 ip,这里因为靶机(客户端)和攻击机是同一台机子,因此这里的 ip 其实是服务器的 ip 地址,可以通过 ip addrifconfig 获取。
  • -p 22 代表了端口
  • -s 60130Source Port
  • - Rreset flag
  • - AACK
  • -M 153042453Next sequence number
  • -L 1914896372Acknowledgment number
  • -c 1 表明只需要发送一个数据包

最后实验结果如下图所示,说明攻击已经成功了。

Pasted image 20211128221213.png

此时在通过 ssh 登录到服务器的命令行面板中输入任何命令已经不再起作用,会看到 Broken pipe 的错误提示,说明 TCP 连接已经终止。这里提供了一个思路,使用的是 ssh1,需要注意的是 sshv2 并不会看到这个错误提示。

参考资料

  1. TCP reset attack
  2. How does a TCP Reset Attack work?
  3. TCP复位攻击