TCP中的RST復位信號


TCP中的RST復位信號

 

在TCP協議中RST表示復位,用來關閉異常的連接,在TCP的設計中它是不可或缺的。

發送RST包關閉連接時,不必等緩沖區的包都發出去,直接就丟棄緩存區的包發送RST包。而接收端收到RST包后,也不必發送ACK包來確認。

TCP報文中有一個RST標志位,如下圖:

 

 

產生RST的原因

1、端口未打開

服務器程序端口未打開而客戶端來連接,例如telnet一個未打開的TCP的端口可能會出現這種錯誤。

比如主機A向主機B發送一個SYN請求,表示想要連接主機B的40000端口,但是主機B上根本沒有打開40000這個端口,於是B就向主機A發送了一個RST。這種情況很常見。特別是服務器程序core dump之后重啟之前連續出現RST的情況會經常發生。

 

 

2、提前關閉

比如主機A和主機B正常建立連接后,A向B發送了FIN包要求關連接,B發送ACK后,網斷了,A通過若干原因放棄了這個連接(例如進程重啟)。網通了后,B又開始發數據包,A收到后表示壓力很大,不知道這野連接哪來的,就發了個RST包強制把連接關了,B收到后會出現connect reset by peer錯誤。

 

3、在一個已關閉的連接上收到數據

 

 

4、請求超時

 

 

 


 

RST攻擊

服務器A和服務器B之間建立了TCP連接,此時服務器C偽造了一個TCP包發給B,使B異常的斷開了與A之間的TCP連接,這就是RST攻擊。
那么偽造什么樣的TCP包可以達成目的呢?我們至頂向下的看:

  • 假定C偽裝成A發過去的包,這個包如果是RST包的話,毫無疑問,B將會丟棄與A的緩沖區上所有數據,強制關掉連接;
  • 如果發過去的包是SYN包,B會表示A已經發瘋了(與OS的實現有關),正常連接時又來建新連接,B主動向A發個RST包,並在自己這端強制關掉連接;

這兩種方式都能夠達到復位攻擊的效果。似乎挺恐怖,然而關鍵是C如何能偽造成A發給B的包呢?這里有兩個關鍵因素,源端口和序列號。
一個TCP連接都是四元組,由源IP+源端口、目標IP+目標端口唯一確定一個連接。所以,如果C要偽造A發給B的包,要在上面提到的IP頭和TCP頭,把源IP、源端口、目標IP、目標端口都填對。這里B作為服務器,IP和端口是公開的,A是我們要下手的目標,IP當然知道,但A的源端口就不清楚了,因為這可能是A隨機生成的。當然,如果能夠對常見的OS如windows和linux找出生成source port規律的話,還是可以搞定的。
此外,偽造的TCP包里需要填序列號(SeqNum),如果序列號的值不在A之前向B發送時B的滑動窗口內,B是會主動丟棄的。所以我們要找到能落到當時的AB間滑動窗口的序列號。這個可以暴力解決,因為一個sequence長度是32位,取值范圍0-4294967296,如果滑動窗口大小為65535的話,則最多只需要發65537(4294967296/65535=65537)個包就能有一個序列號落到滑動窗口內。RST包是很小的,IP頭+TCP頭也才40字節,算算我們的帶寬就知道這實在只需要幾秒鍾就能搞定。

 

 

 

 

參考文檔:

http://my.oschina.net/costaxu/blog/127394

http://www.cnblogs.com/lulu/p/4149562.html

http://blog.csdn.net/russell_tao/article/details/7228923

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM