复位信息块RST: flags [R.]
1、什么是RST? 接收到RST后,会进行哪些操作?
RST表示复位,用于异常关闭连接,对TCP的设计至关重要。 如上所述,发送RST数据包并关闭连接时,不需要等待缓冲器中的所有数据包都被发送,而是直接丢弃缓冲器中的数据包并发送RST数据包。 接收端接收到RST分组后,也不需要为了确认而发送ACK分组。
2、RST分节发生在三种情况下:连接建立、中途发送数据、连接关闭。
(1)访问/连接不存在的端口
服务器端口未打开,客户端将连接
)2)向处于TIME_WAIT状态的端口发出连接请求时
当客户端开始连接到服务器端口且服务器端口处于TIME_WAIT状态时,客户端将监听RST段
)3)异常终止连接
当初,a和b已经建立了连接
)1)但是,a使用套接字选项SO_LINGER向b发送RST段,在这种情况下,a缓冲区中排队的所有数据都将被丢弃。 (详情请参阅插座选项的详细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之间滑动窗口的序列号。 这可以用暴力解决。 一个序列长度为32位,值范围为0-4294967296,因此如果窗口大小在上图中类似于我捕获的windows下的65535,只需将其除以即可,最多65537(4294967296/65535=65537 )可见,RST分组很小,IP报头TCP报头也是40字节,计算我们的带宽,可以看到这真的只需要几秒钟。
)所有一个TCP连接都是4组,并且源IP、源端口、目标IP和目标端口唯一确定一个连接。 因此,如果c伪造从a到b的分组,请在上述IP和TCP头部中填写所有源IP、源端口、目标IP和目标端口。 在这里,b作为服务器公开了IP和端口,a是我们想插手的目标。 IP当然知道,但a的源端口不清楚。 这是因为a有可能是随机生成的。 当然,如果能在windows和linux等一般操作系统中找到生成source port的法则,就能想办法了。
那么,序列号不是问题。 a的端口会变得麻烦。 如果每个操作系统无法完全随机生成源端口,或者黑客们可以通过其他方式获取source端口,则RST攻击会产生简单而严重的后果。