详解RST、RST攻击

版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/84953067

复位报文段RST: flags [R.]

1、什么是RST?接收到RST后,将会执行什么操作?
RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。就像上面说的一样,发送RST包关闭连接时,不必等缓冲区的包都发出去(不像FIN包),直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。

2、出现RST分节的情况可以在三种情况下发生,在连接建立时、在中间发送数据时、在连接关闭时。

(1) 访问/connect一个不存在的端口
服务器程序端口未打开,而客户端来连接
在这里插入图片描述

(2) 向处于TIME_WAIT状态的端口发起连接请求时
当客户端向服务器的某个端口发起连接,而服务器的该端口处于TIME_WAIT状态时,客户端会收到RST段

(3)异常终止连接
初始时,A和B已经建立了连接
(1)但是A使用socket选项SO_LINGER向B发送RST段,此时A缓冲区中所有排队等待的数据将都会丢弃(详细请看socket套接字选项详解的SO_LINGER)
(2)B收到A发送来的RST段后,将异常的断开A和B之间的连接

(4)处理半打开连接
初始时,A和B已经建立了连接
(1)A关闭或者异常终止了连接,但是B没有收到FIN段(比如网络发生了故障)。此时AB双方还维持着原来的连接,而A即使重启,也没有该连接的任何信息,将这种状态称为半打开状态。处于半打开状态的连接称为半打开连接。
(2)B向A中写入数据,则A将回复RST段给B

总结一句话:向处于半打开状态的连接写入数据,则对方将回应一个RST段。

3、RST攻击
A和服务器B之间建立了TCP连接,此时C伪造了一个TCP包发给B,使B异常的断开了与A之间的TCP连接,就是RST攻击了。实际上从上面RST标志位的功能已经可以看出这种攻击如何达到效果了。

那么伪造什么样的TCP包可以达成目的呢?我们至顶向下的看。
(1)假定C伪装成A发过去的包,这个包如果是RST包的话,毫无疑问,B将会丢弃与A的缓冲区上所有数据,强制关掉连接。
(2)假定C伪装成A发过去的包,这个包如果是SYN包的话,那么,B会表示A已经发疯了(AB正常连接时,A又来请求建立新连接) ==> B会主动向A发个RST包,并在自己这端强制关掉连接。

这两种方式都能够达到复位攻击的效果。似乎挺恐怖,然而关键是,如何能伪造成A发给B的包呢?这里有两个关键因素,源端口和序列号。
(1)序列号问题是与滑动窗口对应的,伪造的TCP包里需要填序列号,如果序列号的值不在A之前向B发送时B的滑动窗口内,B是会主动丢弃的。所以我们要找到能落到当时的AB间滑动窗口的序列号。这个可以暴力解决,因为一个sequence长度是32位,取值范围0-4294967296,如果窗口大小像上图中我抓到的windows下的65535的话,只需要相除,就知道最多只需要发65537(4294967296/65535=65537)个包就能有一个序列号落到滑动窗口内。RST包是很小的,IP头+TCP头也才40字节,算算我们的带宽就知道这实在只需要几秒钟就能搞定。
(2)一个TCP连接都是四元组,由源IP、源端口、目标IP、目标端口唯一确定一个连接。所以,如果C要伪造A发给B的包,要在上面提到的IP头和TCP头,把源IP、源端口、目标IP、目标端口都填对。这里B作为服务器,IP和端口是公开的,A是我们要下手的目标,IP当然知道,但A的源端口就不清楚了,因为这可能是A随机生成的。当然,如果能够对常见的OS如windows和linux找出生成source port规律的话,还是可以搞定的。
那么,序列号不是问题,A的端口会麻烦点,如果各个操作系统不能完全随机的生成源端口,或者黑客们能通过其他方式获取到source port,RST攻击易如反掌,后果很严重。

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/84953067