为什么TCP的序号是随机的,而不是从0开始?


主要有两个问题:

  • 防止数据冲突
  • 降低TCP序列号预测攻击的可能性

数据冲突

假设客户端A发给服务端B的一个包在网络里面停留太久;

最后本次连接已经结束了,后面又重新建立了一次连接;

恰巧这次连接的四元组和上次相同,(其实就是源端口刚好相同)

四元组=源IP地址+源端口号+目标IP地址+目标端口号

这时序号又是从0开始,而卡了很久的包在这时送到了服务端;

因为连接时的序号都是从0开始,这个包的序号如果刚好落在序号段接收的范围内,就会被接收;

后面客户端A发送的真正这个序号的包,根据TCP协议,认为是重复,会被丢弃;

TCP序列号预测攻击

这个需要先了解一下TCP建立连接的过程(三次握手),此处默认都会;

image-20200508122605247

上面的图中,主机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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM