本文正在参与 “网络协议必知必会”征文活动
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
使用 wireshark
(Kali
自带)进行抓包分析
sudo wireshark
我们可以在过滤那栏中添加 ip.src == 源地址 && ip.dst == 目标地址
,右侧点击箭头后加以过滤。
成功建立连接后在 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 addr
或ifconfig
获取。-p 22
代表了端口-s 60130
是Source Port
- R
是reset flag
- A
是ACK
-M 153042453
是Next sequence number
-L 1914896372
是Acknowledgment number
-c 1
表明只需要发送一个数据包
最后实验结果如下图所示,说明攻击已经成功了。
此时在通过 ssh 登录到服务器的命令行面板中输入任何命令已经不再起作用,会看到 Broken pipe
的错误提示,说明 TCP 连接已经终止。这里提供了一个思路,使用的是 ssh1,需要注意的是 sshv2 并不会看到这个错误提示。