從TCP協議的原理來談談rst復位攻擊

2021-08-26 16:36:50 字數 3025 閱讀 3423

在談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協議要能還原到位元組流本來面目。

從上面我用powerpoint畫的tcp協議圖可以看到,標誌位共有六個,其中rst位就在tcp異常時出現,也是我這篇文章重點關注的地方。

2、通過三次握手建立連線

下面我通過a向b建立tcp連線來說明三次握手怎麼完成的。

為了能夠說清楚下面的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,在滑動視窗大小內可以繼續傳送其他資料報。舉個例子來看吧。

大家看上圖,標誌位為.表示所有的flag都為0。標誌位p表示flag為psh的tcp包,用於快速傳輸資料。

前三個包是三次握手,客戶端表示自己的滑動視窗大小是65535(我的xp機器),伺服器端表示滑動視窗是5840(螢幕寬了,沒截出來)。從第四個包開始,客戶端向伺服器傳送psh包,資料長度是520位元組,伺服器發了ack確認包。注意此時win視窗大小發生了改變哈。以此類推。

倒數第二、三包,伺服器在滑動視窗內連續向客戶端發包,客戶端傳送的ack 124同時確認了之前的兩個包。這就是滑動視窗的功能了。

如果談到tcp攻擊就需要注意,tcp的各種實現中,在滑動視窗之外的seq會被扔掉!下面會講這個問題。

4、四次握手的正常tcp連線關閉

先畫張簡單的正常關閉連線狀態變遷圖。

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攻擊易如反掌,後果很嚴重。

從TCP協議的原理來談談rst復位攻擊

在談rst攻擊前,必須先了解tcp 如何通過三次握手建立tcp連線 四次握手怎樣把全雙工的連線關閉掉 滑動視窗是怎麼傳輸資料的 tcp的flag標誌位里rst在哪些情況下出現。下面我會畫一些盡量簡化的圖來表達清楚上述幾點,之後再了解下rst攻擊是怎麼回事。1 tcp是什麼?tcp是在ip網路層之上的...

從TCP協議的原理來談談rst復位攻擊

在談rst攻擊前,必須先了解tcp 如何通過三次握手建立tcp連線 四次握手怎樣把全雙工的連線關閉掉 滑動視窗是怎麼傳輸資料的 tcp的flag標誌位里rst在哪些情況下出現。下面我會畫一些盡量簡化的圖來表達清楚上述幾點,之後再了解下rst攻擊是怎麼回事。1 tcp是什麼?tcp是在ip網路層之上的...

從TCP協議的原理來談談rst復位攻擊

在談rst攻擊前,必須先了解tcp 如何通過三次握手建立tcp連線 四次握手怎樣把全雙工的連線關閉掉 滑動視窗是怎麼傳輸資料的 tcp的flag標誌位里rst在哪些情況下出現。下面我會畫一些盡量簡化的圖來表達清楚上述幾點,之後再了解下rst攻擊是怎麼回事。1 tcp是什麼?tcp是在ip網路層之上的...