【博客613】tcp重置防火墙原理:构造RST报文来终结非法活跃连接
·
tcp重置防火墙原理:构造RST报文来终结非法活跃连接
1、场景
如何关闭一个 TCP 连接?
可能大家第一反应是「杀掉进程」不就行了吗?
是的,这个是最粗暴的方式,杀掉客户端进程和服务端进程影响的范围会有所不同:
-
在客户端杀掉进程的话,就会发送 FIN 报文,来断开这个客户端进程与服务端建立的所有 TCP 连接,这种方式影响范围只有这个客户端进程所建立的连接,而其他客户端或进程不会受影响。
-
而在服务端杀掉进程影响就大了,此时所有的 TCP 连接都会被关闭,服务端无法继续提供访问服务。
所以,关闭进程的方式并不可取,最好的方式要精细到关闭某一条 TCP 连接。
合理的做法:伪造一个四元组相同的 RST 报文,其实 「伪造 RST 报文来关闭 TCP 连接」 的方式其实有个专业术语叫:TCP 重置攻击。
TCP重置攻击维基百科:
2、TCP重置


3、实现TCP重置的工具:tcpkill 和 killcx
这两个工具都是通过伪造 RST 报文来关闭指定的 TCP 连接,但是它们拿到正确的序列号的实现方式是不同的:
- tcpkill 工具是在双方进行 TCP 通信时,拿到对方下一次期望收到的序列号,然后将序列号填充到伪造的 RST 报文,并将其发送给对方,达到关闭 TCP 连接的效果。
- killcx 工具是主动发送一个 SYN 报文,对方收到后会回复一个携带了正确序列号和确认号的 ACK 报文,这个 ACK 被称之为 Challenge ACK,这时就可以拿到对方下一次期望收到的序列号,然后将序列号填充到伪造的 RST 报文,并将其发送给对方,达到关闭 TCP 连接的效果。
可以看到, 这两个工具在获取对方下一次期望收到的序列号的方式是不同的。
双方的差别主要为一个是主动,一个是被动:
-
tcpkill 工具属于被动获取,就是在双方进行 TCP 通信的时候,才能获取到正确的序列号,很显然这种方式无法关闭非活跃的 TCP 连接,只能用于关闭活跃的 TCP 连接。因为如果这条 TCP 连接一直没有任何数据传输,则就永远获取不到正确的序列号。
-
killcx 工具则是属于主动获取,它是主动发送一个 SYN 报文,通过对方回复的 Challenge ACK 来获取正确的序列号,所以这种方式无论 TCP 连接是否活跃,都可以关闭。
4、tcpkill 和 killcx实践







killcx工作原理如下:


总结:
- tcpkill 工具只能用来关闭活跃的 TCP 连接,无法关闭非活跃的 TCP 连接,因为 tcpkill 工具是等双方进行 TCP 通信后,才去获取正确的序列号,如果这条 TCP 连接一直没有任何数据传输,则就永远获取不到正确的序列号。
- killcx 工具可以用来关闭活跃和非活跃的 TCP 连接,因为 killcx 工具是主动发送 SYN 报文,这时对方就会回复 Challenge ACK ,然后 killcx 工具就能从这个 ACK 获取到正确的序列号。
更多推荐

所有评论(0)