要點梳理:TCP 鏈接及常見攻擊手法分析

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() 操做便可產生揮手操做。socket

第一次揮手(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)。歡迎留言討論,咱們會盡量回復。

感謝您的閱讀。
相關文章
相關標籤/搜索