TCP 協議
TCP 協議是一種面向連線的、可靠的位元組流通訊協議。
可靠性
- 資料校驗:TCP 在傳輸過程中可以通過校驗和,確認和重傳機制保證可靠傳輸。
- 資料順序性:TCP 給資料分節進行排序,並使用累計確認保證資料的順序不變和非重複。
- 流量與擁塞控制:TCP 使用滑動視窗機制來實現流量控制,通過動態改變視窗的大小進行擁塞控制。
連線建立與關閉
三次握手建立連線
三次握手是指,建立一個 TCP 連線,需要客戶端和服務端總共傳送三個包。
第一次握手(SYN=1,seq=x)
客戶端傳送一個 TCP 的 SYN 標誌位置 1 的包,指明客戶端準備連線伺服器的埠,以及初始序列號 X,儲存在包頭的序列號(Sequence Number)欄位裡。傳送完畢後,客戶端進入 SYN_SEND 狀態。
其中第一次的序列號是隨機的,這樣是為了網路安全,如果不是隨機產生初始序列號,黑客將會以很容易的方式獲取到你與其他主機之間的初始化序列號,並且偽造序列號進行攻擊。
第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1)
伺服器發回確認包(ACK)應答,即 SYN 標誌位和 ACK 標誌位均為1.伺服器端選擇自己 ISN 序列號,放到 Seq 域裡,同時將確認序號(Acknowledgement Number)設定為客戶的 ISN 加1,即X+1。傳送完畢後,伺服器進入 SYN_RCVD 狀態。
第三次握手(ACK=1,ACKnum=y+1)
客戶端再次傳送確認包(ACK),SYN 標誌位為0,ACK 標誌位為1,並且把伺服器發來 ACK 的序號欄位+1,放在確定欄位中傳送給對方。傳送完畢後,客戶端傳送完畢後進入 ESTABLISHED 狀態,TCP 握手結束。
四次揮手關閉連線
四次揮手是指,TCP 連線的拆除需要傳送四個包。
客戶端或伺服器均可發起揮手動作,在 socket 程式設計中,任何一方執行 close() 操作即可產生揮手操作。
第一次揮手(FIN=1,seq=x)
當傳送 FIN 包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。傳送完畢後,(假設傳送方式客戶端)客戶端進入 FIN+WAIT_1 狀態。
第二次揮手(ACK=1,ACKnum=X+1)
伺服器確認客戶端的 FIN 包,傳送一個確認包,表明自己接受到了客戶端關閉連線的請求,但是還沒準備好關閉連線(理論上:有可能還有資料向客戶端傳送)
第三次揮手(FIN=1, seq=y)
伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,FIN 置為1。傳送完畢後,伺服器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個 ACK 。
第四次揮手(ACK=1,ACKnum=y+1)
客戶端接受到來自伺服器的關閉請求,傳送一個確認包,並進入 TIME_WAIT 狀態,等待可能出現的要求重傳 ACK 包。伺服器端接受到這個確認包後,關閉連線,進入 CLOSED 狀態。
客戶端等待 2MSL 之後,沒有收到伺服器端的 ACK ,認為伺服器端已經處於正常關閉連線,於是自己也關閉連線,進入 CLOSED 狀態。
握手中的攻擊手段
SYN Flooding
攻擊原理
當 Server(B) 收到 Client(A) 的 SYN 請求報文時,將傳送一個(ACK,SYN)應答報文,同時建立一個控制結構,將其加入到一個佇列中,等待對方的 ACK 報文。接收到 ACK 報文後,雙方都進入連線狀態。如果 Server 在一段時間內沒有收到應答訊息,則控制塊將被釋放。
在 TCP 協議軟體中,通常對每個埠等待建立連結的數目有一定限制,當佇列長度到達設定閾值時,將丟棄後面到達的 TCP SYN 請求報文。
如果攻擊者不斷髮送大量的 TCP SYN 報文,其他使用者就無法再連結到被攻擊者伺服器。
應對措施
通過增加連線數目、減小超時時間,可以緩解攻擊,但是無法從根本阻止攻擊,是 DOS 的一種,可通過 netstat 命令通過檢視伺服器網路連線情況,如果存在大量 SYN 的連線,則有可能收到了SYN Flooding攻擊。
Land 攻擊
利用了 TCP 連線建立的三次握手過程,通過向一個目標計算機傳送一個 TCP SYN 報文(連線請求報文)而完成對目標計算機的攻擊。
攻擊原理
與正常的 TCP SYN 報文不同的是,LAND 攻擊報文的源 IP 地址和目的 IP 地址是相同的,都是目標計算機地址,這樣目標計算機接受到 SYN 報文後,就會向該報文的源地址傳送一個 ACK 報文,並建立一個 TCP 連線控制結構(TCB),而該報文的源地址就是自己,因此,這個 ACK 報文就發給了自己。這樣如果攻擊者傳送了足夠多的 SYN 報文,則目標計算機的 TCB 可能會耗盡,最終不能正常服務。
這也是一種 DOS 攻擊。可以通過 Kali Linux 提供的如 hping3 實現偽造包的功能。
應對措施
可以通過防火牆、路由裝置,建立規則,丟掉源地址和目標地址相同的 SYN、SYN+ACK 和 TCP。
TCP 劫持
利用 TCP 會話劫持,可以方便地修改、偽造資料。
攻擊原理
TCP 通過三次握手建立連線以後,主要採用滑動視窗機制來驗證對方傳送的資料。如果對方傳送的資料不在自己的接收視窗內,則丟棄此資料,這種傳送序號不在對方接收視窗的狀態稱為非同步狀態。
當通訊雙方進入非同步狀態後,攻擊者可以偽造傳送序號在有效接收視窗內的報文,,也可以截獲報文,篡改內容後,再修改傳送序號,而接收方會認為資料是有效資料。
TCP 劫持的關鍵在於使通訊雙方進入非同步狀態。有多種方法可以達到此目的。
如四次揮手狀態圖所示,在主機 A 傳送 SYN 請求後,B 傳送 ACK &
SYN 進行應答,則 A 認為連線已經建立。此時,攻擊者偽裝成 A 向 B 傳送一個 RST 報文,則 B 釋放連線,攻擊者繼續偽裝成 A 用自己的初始序列號和 B 建立新的連線,而 A 和 B 對此毫不覺察。當攻擊者偽裝成 A 和 B 建立連線後,A 和 B 就已經進入了非同步狀態。
利用 Telnet 協議的 NOP 命令也可以使通訊雙方進入非同步狀態。主機 B 接收到 NOP 命令後,並不進行任何操作,但確認序列號將會加 1。如果攻擊者偽裝成 A 向 B 傳送大量的 NOP 命令,則會造成 A 和 B 的非同步狀態。
應對措施
檢測 TCP 劫持的關鍵在於檢測非同步狀態。如果不斷收到在接收視窗之外的資料或確認報文,則可以確定遭到 TCP 劫持攻擊。或者設定禁止 RST 報文。
TCP 偽裝
TCP 偽裝主要是獲取其他客戶端的初始序列號進行偽裝。
攻擊原理
要進行 TCP 偽裝,就意味著在建立連線時,攻擊者需要知道被偽裝者的當前初始序列號。
序列號的生成演算法一般有三種,一是不斷增加一個常量,二是不斷增加一個與時間相關的變數,三是偽隨機數。對於前兩種演算法而言,其規律都能通過測試觀察得到。也就是說,如果攻擊者與被欺騙的目標主機處於同一網路,那麼在排除了被偽裝身份主機的干擾以後,可以比較簡單地通過網路嗅探分析出初始序列號來。
當攻擊者與可以通訊的兩臺主機不在同一網路時,由於攻擊者無法接收到響應包,這種攻擊較為困難。但它並非萬全,因為攻擊者仍可配合路由欺騙的方法將響應包轉發出來,從而實現上述攻擊。
應對措施
TCP 偽裝利用 TCP 協議本身的設計,最自然、直接和本質的思路是不在有安全需求的場合使用 TCP,而是考慮 TLS 等對連線雙方有認證、對網路會話有加密的協議。
也有一些其他的方法能夠從外部防止該攻擊:將序列號生成演算法換為偽隨機數能避免初始序列號被推解,或是在路由器拒絕來自外網但使用內網源 IP 地址的資料包。
文 / blank
編 / 熒聲
本文已由作者授權釋出,版權屬於創宇前端。歡迎註明出處轉載本文。
想要看到更多來自知道創宇開發一線的分享,請搜尋關注我們的微信公眾號:創宇前端(KnownsecFED)。歡迎留言討論,我們會盡可能回覆。
感謝您的閱讀。