主要有两个问题:
- 防止数据冲突
- 降低TCP序列号预测攻击的可能性
数据冲突
假设客户端A发给服务端B的一个包在网络里面停留太久;
最后本次连接已经结束了,后面又重新建立了一次连接;
恰巧这次连接的四元组和上次相同,(其实就是源端口刚好相同)
四元组=源IP地址+源端口号+目标IP地址+目标端口号
这时序号又是从0开始,而卡了很久的包在这时送到了服务端;
因为连接时的序号都是从0开始,这个包的序号如果刚好落在序号段接收的范围内,就会被接收;
后面客户端A发送的真正这个序号的包,根据TCP协议,认为是重复,会被丢弃;
TCP序列号预测攻击
这个需要先了解一下TCP建立连接的过程(三次握手),此处默认都会;
上面的图中,主机C模拟主机B,向主机A发送连接请求;
这种情况针对于局域网外想和内网里面的主机通信;
比如你在家,想远程登录公司内网的一台主机;
这里C是伪造了B的IP地址,也就是主机C发出的包的源地址是B的IP地址;
这一点很容易实现,学过操作系统和计算机网络的就能理解;
运输层和网络层的协议是操作系统实现的,网卡负责转发帧;
主机A收到连接请求后,因为IP地址是认可的,就会发送确认包
应该是公司内部授权外部这些IP地址的主机可以建立连接
根据TCP三次握手,此时再发送ACK包给主机A,连接就成功建立了
而发送的ACK需要依赖主机A的SYN,如果序号都是从0开始,那可就太简单了;
连接建立后,主机C继续伪造主机B的IP,就能随意发送数据给主机A了;
因为主机A的确认包实际还是发送给主机B,为了防止B响应,这里还涉及到一种DOS的技术,感兴趣的可以去了解;
在使用随机之前,还有一种ISN生成器,它不是从0开始;
比如每4微秒让序号+1,因为序号有32位,所以周期是4.55h左右;
或者BSD Unix的一小时增加128000,每次连接增加64000;
因为序号生成有一些规律,所以也是存在一定风险;
论文期刊中提到发起多次真实连接请求,通过分析ISN增长规律,去预测之后的ISN;
我疑问的是为什么能够获取到ISN的这些包?另外,又是怎么知道主机B的IP地址的?
以上是了解到的一些情况,如果有误,欢迎指出
找的一些资料:
http://www.wanfangdata.com.cn/details/detail.do?_type=perio&id=jsjyy200212020
https://www.tech-faq.com/tcp-sequence-prediction-attack.html