-
面试官:请问如何在不终止进程的情况下,关闭一个 TCP 连接?
- 时间:2024-06-24 来源:zoc7RcITctunhMtq7EzA 人气:
大家好,我叫小林星空体育官方。有一位读者在面试过程中被问到了这样一个问题。
怎样能够在不终止进程的情况下,关闭一个TCP连接呢?在我的以前文章中也讨论过,当处于建立状态的连接收到SYN报文时会发生什么?我再重点强调一下这个关键问题。
这个想法很不错,但别忘了还有个序列号的疑虑,你伪造的RST报文是否能被对方接受呢?如果RST报文的序列号不在对方的滑动窗口范围内,对方将会丢弃该RST报文,导致无法成功关闭连接。为了成功伪造一个可以关闭 TCP 连接的 RST 报文,需要同时确保「四元组匹配」和「序列号位于对方的滑动窗口范围内」的两个条件被满足。在传输数据的 TCP 连接中,直接伪造符合预期的序列号是相当困难的。这是因为滑动窗口在不断变化,难以准确计算出一个刚好落在对方滑动窗口范围内的序列号,从而伪造 RST 报文。
仍然有解决办法,我们可以伪造一个四元组相同的 SYN 报文,以获取“合法”的序列号!由于在建立状态的服务器端,当收到四元组相同的SYN数据包时,会回复一个Challenge ACK。在这个ACK数据包中,其中的“确认号”恰好是服务器端希望接收的下一个序列号,简而言之,通过此步骤可以获取服务器端下一个预期接收的序列号。
使用这个确认号作为RST报文的序列号发送给服务器,服务器会接受该RST报文并释放连接,因为服务器会认为该序列号合法。在Linux上,有一个名为killcx的工具,是基于以上这种方式实现的。它会主动发送SYN包获取SEQ/ACK号,然后利用这个号伪造两个RST报文,分别发送给客户端和服务端,这样双方的TCP连接都会被释放。这种方式既可以用来断开活跃的TCP连接,也可以用来断开非活跃的TCP连接。
的操作方法非常简单,只需要输入客户端的IP地址和端口号即可。
星空体育网站。Killcx
工具的运行原理如下所示:它伪造客户端发送的SYN数据包,一旦服务端收到后,就会返回一个带有正确"序列号和确认号"的ACK数据包(挑战ACK)。然后利用这个ACK数据包的信息,伪造两个RST数据包:
使用挑战ACK中的确认号,伪造RST数据包发送给服务端,服务端一旦收到RST数据包,就会释放连接。在 Challenge ACK 数据包中伪造序列号发送 RST 报文给客户端,客户端收到 RST 后也会释放连接。通过这种方式成功地关闭了一个 TCP 连接!在这里提供一个使用 killcx 工具关闭连接的抓包图,大家可以仔细观察序列号和确认号的变化。
因此,在捕获数据包时,如果突然出现一个不明来源的 SYN 包,对方很可能计划发起一个 RST 攻击来中断你的 TCP 连接!
是不是很巧妙呀!
星空体育网页版
星空体育手机版
星空体育入口
星空体育入口 星空体育官方版