tcp port numbers reused出现原因_从TCP协议的原理来谈谈rst复位攻击

在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接、四次握手怎样把全双工的连接关闭掉、滑动窗口是怎么传输数据的、TCP的flag标志位里RST在哪些情况下出现。下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下RST攻击是怎么回事。

1、TCP是什么?

TCP是在IP网络层之上的传输层协议,用于提供port到port面向连接的可靠的字节流传输。我来用土语解释下上面的几个关键字:

port到port:IP层只管数据包从一个IP到另一个IP的传输,IP层之上的TCP层加上端口后,就是面向进程了,每个port都可以对应到用户进程。

可靠:TCP会负责维护实际上子虚乌有的连接概念,包括收包后的确认包、丢包后的重发等来保证可靠性。由于带宽和不同机器处理能力的不同,TCP要能控制流量。

字节流:TCP会把应用进程传来的字节流数据切割成许多个数据包,在网络上发送。IP包是会失去顺序或者产生重复的,TCP协议要能还原到字节流本来面目。

5467f7b7efcd16f4b4f557c66883eda3.png

从上面的TCP协议图可以看到,标志位共有六个,其中RST位就在TCP异常时出现,也是我这篇文章重点关注的地方。

2、通过三次握手建立连接

下面我通过A向B建立TCP连接来说明三次握手怎么完成的。

92aef19c73b65a69d587edabfc303e5b.png

为了能够说清楚下面的RST攻击,需要结合上图说说:SYN标志位、序号、滑动窗口大小。

建立连接的请求中,标志位SYN都要置为1,在这种请求中会告知MSS段大小,就是本机希望接收TCP包的最大大小。

发送的数据TCP包都有一个序号。它是这么得来的:最初发送SYN时,有一个初始序号,根据RFC的定义,各个操作系统的实现都是与系统时间相关的。之后,序号的值会不断的增加,比如原来的序号是100,如果这个TCP包的数据有10个字节,那么下次的TCP包序号会变成110。

滑动窗口用于加速传输,比如发了一个seq=100的包,理应收到这个包的确认ack=101后再继续发下一个包,但有了滑动窗口,只要新包的seq与没有得到确认的最小seq之差小于滑动窗口大小,就可以继续发。

3、滑动窗口

滑动窗口毫无疑问是用来加速数据传输的。TCP要保证“可靠”,就需要对一个数据包进行ack确认表示接收端收到。有了滑动窗口,接收端就可以等收到许多包后只发一个ack包,确认之前已经收到过的多个数据包。有了滑动窗口,发送端在发送完一个数据包后不用等待它的ack,在滑动窗口大小内可以继续发送其他数据包。举个例子来看吧。

7b5f1fb6e99328c24b3057b59899f3e2.png

大家看上图,标志位为.表示所有的flag都为0。标志位P表示flag为PSH的TCP包,用于快速传输数据。

前三个包是三次握手,客户端表示自己的滑动窗口大小是65535(我的XP机器),服务器端表示滑动窗口是5840(屏幕宽了,没截出来)。从第四个包开始,客户端向服务器发送PSH包,数据长度是520字节,服务器发了ack确认包。注意此时win窗口大小发生了改变哈。以此类推。

倒数第二、三包,服务器在滑动窗口内连续向客户端发包,客户端发送的ack 124同时确认了之前的两个包。这就是滑动窗口的功能了。

如果谈到TCP攻击就需要注意,TCP的各种实现中,在滑动窗口之外的seq会被扔掉!下面会讲这个问题。

需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

d4d01971d6478ab04a6f0751cb5f36d4.png

4、四次握手的正常TCP连接关闭

先画张简单的正常关闭连接状态变迁图。

3f5b0ac495ddbc14e21815cac1614b96.png

FIN标志位也看到了,它用来表示正常关闭连接。图的左边是主动关闭连接方,右边是被动关闭连接方,用netstat命令可以看到标出的连接状态。

FIN是正常关闭,它会根据缓冲区的顺序来发的,就是说缓冲区FIN之前的包都发出去后再发FIN包,这与RST不同。

5、RST标志位

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

TCP处理程序会在自己认为的异常时刻发送RST包。例如,A向B发起连接,但B之上并未监听相应的端口,这时B操作系统上的TCP处理程序会发RST包。

又比如,AB正常建立连接了,正在通讯时,A向B发送了FIN包要求关连接,B发送ACK后,网断了,A通过若干原因放弃了这个连接(例如进程重启)。网通了后,B又开始发数据包,A收到后表示压力很大,不知道这野连接哪来的,就发了个RST包强制把连接关了,B收到后会出现connect reset by peer错误。

6、RST攻击

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

那么伪造什么样的TCP包可以达成目的呢?我们至顶向下的看。

假定C伪装成A发过去的包,这个包如果是RST包的话,毫无疑问,B将会丢弃与A的缓冲区上所有数据,强制关掉连接。

如果发过去的包是SYN包,那么,B会表示A已经发疯了(与OS的实现有关),正常连接时又来建新连接,B主动向A发个RST包,并在自己这端强制关掉连接。

这两种方式都能够达到复位攻击的效果。似乎挺恐怖,然而关键是,如何能伪造成A发给B的包呢?这里有两个关键因素,源端口和序列号。

一个TCP连接都是四元组,由源IP、源端口、目标IP、目标端口唯一确定一个连接。所以,如果C要伪造A发给B的包,要在上面提到的IP头和TCP头,把源IP、源端口、目标IP、目标端口都填对。这里B作为服务器,IP和端口是公开的,A是我们要下手的目标,IP当然知道,但A的源端口就不清楚了,因为这可能是A随机生成的。当然,如果能够对常见的OS如windows和linux找出生成source port规律的话,还是可以搞定的。

序列号问题是与滑动窗口对应的,伪造的TCP包里需要填序列号,如果序列号的值不在A之前向B发送时B的滑动窗口内,B是会主动丢弃的。所以我们要找到能落到当时的AB间滑动窗口的序列号。这个可以暴力解决,因为一个sequence长度是32位,取值范围0-4294967296,如果窗口大小像上图中我抓到的windows下的65535的话,只需要相除,就知道最多只需要发65537(4294967296/65535=65537)个包就能有一个序列号落到滑动窗口内。RST包是很小的,IP头+TCP头也才40字节,算算我们的带宽就知道这实在只需要几秒钟就能搞定。

那么,序列号不是问题,源端口会麻烦点,如果各个操作系统不能完全随机的生成源端口,或者黑客们能通过其他方式获取到source port,RST攻击易如反掌,后果很严重。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP端口号被重用的原因可能是因为先前使用该端口的应用程序已经关闭或崩溃,导致该端口号变得可用。另外,一些应用程序可能会在同一台计算机上使用相同的端口号,但在不同的IP地址上进行监听,这也可能导致TCP端口号被重用。 ### 回答2: TCP端口号的重用是因为TCP连接的四元组——源IP、源端口号、目标IP、目标端口号——可以确定一个唯一的连接。但是,在TCP连接被断开后,这个四元组可以被操作系统重用,从而建立新的连接。这样做的原因是为了节省端口号的使用,避免系统占用过多的端口。 在实际应用中,TCP连接的创建和销毁频繁而快速,而TCP端口号是有限的资源。在短时间内不可能用完所有的端口号,因此操作系统可以重用已经被关闭连接的端口号,从而降低了系统开销。 TCP端口号被重用还有另外一种情况。在服务端应用程序关闭前,它还可能保留这个端口号并等待重新唤醒。这对于减少服务启动和停止的开销是非常有用的。此外,TCP端口号的重用还可以使连接建立更加快速,缩短了用户的等待时间。 需要注意的是,TCP连接的四元组不同,即使是相同的端口号也不能进行重用。例如,如果新建一个连接的源IP、源端口号与之前的连接相同,但目标IP地址或目标端口号改变了,仍视为一个新的连接,系统会为它分配一个新的端口号。只有当TCP连接的四元组完全相同,包括状态和时间戳等信息时,系统才会认为这是同一条连接的重复使用。 ### 回答3: 网络通信中的TCP协议是一种面向连接通信的协议,它通过创建一条可靠的双向通信通道来进行数据传输。而TCP端口号就是用来标识每一条连接通道的。 TCP端口号是充分利用了网络资源的一项重要措施,允许多个进程同时使用网络上的同一个IP地址。在TCP协议中,每个端口号都对应着一个正在工作的进程,这些进程通过不同的端口号来实现在同一个IP地址下进行通信。 然而,在某些情况下,操作系统中的一个端口号已经被一个进程使用了,但是这个进程又被终止了,导致这个端口号就被占用了。这时候,如果另一个进程需要使用同一个端口号来进行通信,那么它就无法与网络上其他设备建立连接。为了解决这个问题,TCP协议允许端口号重用,即在一个进程结束后,其他进程仍然可以使用相同的端口号。 TCP端口号重用的出现原因主要有以下几点: 1. 提高资源利用率 端口号是有限资源,在同时需要进行大量TCP连接的情况下很容易出现资源不足的状况。为了提高资源的利用率,TCP端口号能够被重用,避免了由于资源短缺造成的连接阻塞,确保网络通信的稳定性。 2. 快速建立连接 TCP协议允许端口号被重用,当进程结束后,其他进程不需要等待操作系统释放端口号,在同一端口上可以很快的建立连接,节约了时间。 3. 允许多进程并发监听同一端口 TCP协议允许多进程并发监听同一端口,这样做可以帮助用户构建高可用性的网络服务,不因为某一个进程的故障而影响其他进程的工作。 总之,TCP端口号重用能够有效地提高网络的利用率,加快连接速度,以及保障网络稳定性。但是在实际应用中,需要注意TCP端口号重用的次数和范围,以免出现数据冲突、复制等问题,影响用户体验和数据安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值