TCP重置攻击演示
前言
在TCP中,有一个标志是RST标志,它表示立即终止连接,也就是如果连接上的一方收到另一方的发送的RST数据包,它将立即关闭连接。
那是不是可以伪造一个数据包,让两台设备之间断开连接?
理论是可以的,但是需要几个很重要的参数,根据TCP规范,为了能正确响应RST数据包,RST数据包中必须具有与接受者期望的相同序列号,这个序列号如果不对,那还是无法断开连接。
假设A向B发送一个数据包,序列号为10,其中包含5个字节的数据,它将期望收到来自B的确认数据包,其确认号为15 (10 + 5)。
这需要知道TCP的三次握手过程。
三次握手分析
理解这一点的最好方法是使用Wireshark工具实际查看TCP数据包。
假设本机电脑ip是192.168.43.157,手机的ip是192.168.43.226。

由电脑监听7070端口,手机连接之后首先会发出三个包,被称为TCP的三次握手,其实就是互相交换一下控制信息。
第一次握手是由手机发出,包中的Flag为SYN,只有来自发送方的第一个数据包才应该设置此标志,它还包含自己的SEQ号,如果对方回应了,则对方的ACK确认号就是自己的SEQ+1,这里的SEQ是1952416868.

第二次握手是由电脑回应手机所发出的,包中的Flag为SYN、ACK,还有确认号是1952416869,用来告诉对方自己收到了你的请求,当然还要告诉对方自己的SEQ号,同样要等待对方回应,如果回应中的ACK值等于自己的SEQ+1,那么连接就建立完毕,这里的SEQ是1982386088。

第三次还是手机发出,用来回应电脑,告诉自己也能收到你的数据包,包中的Flag为ACK,ACK确认号为1982386089,SEQ是1952416869。

现在双方都互相持有对方的SEQ序列号,自身的SEQ值都被+1。
好了,现在由电脑先发出2字节的数据,Wireshark会捕获到4个包,原因是每发送一个数据包,都需要会有回应,电脑发送后,收到手机的回应,而手机也发送了2个字节的数据,需要电脑回应,所以有4个包。

这里最重要的还是SEQ的变化。
下面是电脑发送的数据包,SEQ还是自己的序列号,但是Next sequence number变成了他自身的SEQ+数据包大小,而他希望收到手机回应的数据包中ACK必须是这个Next sequence number值(1982386091),

所以来看下手机回应的。
可以看到ACK确认号就是1982386091,而其他都没有变。

接着手机又发出两个字节的数据,同样的流程,同样的校验方式。
netwox伪造数据包
现在来伪造一个数据包演示RST攻击。
而这个数据包中要包含原地址/端口,目标地址/端口,还要最重要的SEQ号。
我找了很多向客户端发送RST数据包的方法,最后发现netwox这个工具很方便,可用于伪造数据包。在http://www.cse.iitm.ac.in/~chester/courses/19e_ns/slides/3_TCPAttacks.pdf 的第32页有一个很好的TCP攻击示例。
命令如下。
netwox 40 -l 原ip -m 目标ip -o 监听的端口号 -p 客户端端口后 -B -q 原的SEQ号
从Wireshark中就可以看到客户端的端口号是42560,而原的SEQ号由最初的1982386088变成了1982386091,所以最终执行以下命令。
netwox 40 -l 192.168.43.157 -m 192.168.43.226 -o 7070 -p 42560 -B -q 1982386091
执行后就能看到Android中抛出SocketException异常。
断开SSH连接
现在来尝试一下断开一个已经与远程服务取得连接的ssh。
还是来拿Wireshark筛选一下,条件是tcp.port==22 and tcp
netwox 40 -m 116.62.xx.xx -l 192.168.43.157 -o 22 -p 37156 -B -q 1328649361
最后在终端会输出以下内容
root@meet:~# packet_write_wait: Connection to 116.62.xx.xx port 22: Broken pipe
- END -
原文始发于微信公众号(十四个字节):TCP重置攻击演示