首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

TCP 三次交握原理深度解析與 MITM 攻擊案例實戰

     編輯:關於SqlServer

TCP 協議基礎

TCP/IP 實為協議套件,TCP (Transmission Control Protocol) 位於 OSI 第 4 層 (傳輸層),提供可靠、面向連線的位元組流傳輸服務。TCP 透過序號 (Sequence Number) 確保資料有序、無重複送達;IP 負責路由與封包轉發,TCP 負責端到端可靠性保證 (握手、流量控制、錯誤檢測重傳)。

TCP 封包頭結構 (最小 20 Bytes)

欄位長度說明
Source Port16 bits來源連接埠,標識發送端應用程式
Destination Port16 bits目的連接埠,標識接收端應用程式
Sequence Number32 bits序號。SYN 時為初始序號 (ISN),資料第一位元組為 ISN+1
Acknowledgment Number32 bits確認號。ACK=1 時有效,表示期望接收的下一個序號
Data Offset (HLEN)4 bitsTCP 頭長度 (以 4 bytes 為單位),指示資料起始位置
Reserved6 bits保留,必須為 0
Flags (Code Bits)6 bitsURG、ACK、PSH、RST、SYN、FIN (由高位至低位)
Window16 bits滑動視窗大小,流量控制關鍵
Checksum16 bits首部+資料+偽首部檢驗和,驗證完整性
Urgent Pointer16 bitsURG=1 時有效,指向緊急資料結束位置
Options可變MSS、Window Scale、SACK、Timestamps 等
Padding可變補齊至 32 bits 整數倍

六大旗標 (Flags) 功能詳解

  • URG (Urgent):緊急指標有效,優先處理該段資料 (如 Telnet 中斷訊號)。
  • ACK (Acknowledgment):確認號欄位有效。大多數封包 ACK=1,確認號 = 已收到位元組數 + 1。
  • PSH (Push):接收端立即將資料交給應用層,不緩衝等待。互動式應用 (SSH、Telnet) 常設定。
  • RST (Reset):重置連線。拒絕非法連線、異常中斷連線時使用。
  • SYN (Synchronize):同步序號,僅用於三次交握建立連線階段。攜帶初始序號 (ISN)。
  • FIN (Finish):發送端無資料再傳送,發起連線關閉。對方仍可回應資料 (半關閉)。

三次交握 (Three-Way Handshake) 詳細流程

  1. Client → Server : SYN (seq=x) Client 發送 SYN,進入 SYN-SENT 狀態。
  2. Server → Client : SYN+ACK (seq=y, ack=x+1) Server 回應 SYN+ACK,進入 SYN-RECEIVED 狀態。
  3. Client → Server : ACK (seq=x+1, ack=y+1) Client 確認,雙方進入 ESTABLISHED 狀態,連線建立完成。

狀態機關鍵狀態:CLOSED → LISTEN → SYN-RECEIVED → ESTABLISHED → FIN-WAIT-1 → FIN-WAIT-2 → TIME-WAIT → CLOSED

經典攻擊案例:TCP 會話劫持與 SYN Flood

MITNICK 攻擊 (TCP Session Hijacking)

場景:A (攻擊者)、B (受信任伺服器)、C (受害者/目標伺服器)。B 信任 C (如 .rhosts)。

  1. A 對 C 發送大量 SYN (SYN Flood),使 C 忙於回應 SYN+ACK,無暇處理 B 的合法連線。
  2. A 對 B 偽造來源 IP 為 C 發送 SYN,B 回應 SYN+ACK 給 C (實際到達 A,因 C 正忙)。
  3. A 預測 B 的 ISN (早期 TCP ISN 可預測),偽造 C 發送 ACK 完成三次交握。
  4. B 認為與 C 建立連線,A 成功劫持會話,可向 B 發送惡意指令。

核心弱點:(1) TCP 連線資源消耗 (半開連線佔用記憶體) (2) ISN 可預測性 (RFC 793 早期演算法)。現代作業系統採用隨機化 ISN (RFC 6528) 大幅緩解。

SYN Flood (同步洪流攻擊)

攻擊者大量發送 SYN,不回應 SYN+ACK,導致伺服器半開連線佇列 (Backlog) 滿載,合法連線被拒。防禦:SYN Cookie、增加 Backlog、防火牆速率限制、TCP Intercept。

TCP 狀態變數與序號運算

類別變數含義
發送端SND.UNA最早未確認序號
SND.NXT下一個發送序號
SND.WND發送視窗大小
SND.UP發送緊急指標
ISS初始發送序號 (ISN)
接收端RCV.NXT期望接收序號 (視窗左邊界)
RCV.WND接收視窗大小
RCV.UP接收緊急指標
IRS初始接收序號
當前段SEG.SEQ段首序號
SEG.ACK段確認號
SEG.LEN段資料長度
SEG.WND段通告視窗
SEG.UP段緊急指標
SEG.PRC段優先權

確認邏輯:累積確認。SEG.SEQ + SEG.LEN - 1 <= SEG.ACK 表示該段已被確認。滑動視窗機制實現流量控制與可靠傳輸。

防禦與最佳實務建議

  • 啟用 SYN Cookie (Linux: net.ipv4.tcp_syncookies=1) 緩解 SYN Flood。
  • 確保作業系統支援 隨機化 ISN (現代核心預設開啟)。
  • 關鍵服務部署 TCP MD5 Signature Option (RFC 2385) 或 TCP-AO (RFC 5925) 保護 BGP 等關鍵連線。
  • 監控 netstat -s 中 embryonic connection resets、SYN to LISTEN dropped 等計數器。
  • 應用層實作 心跳機制 偵測半開/僵死連線。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved