Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 原始套接字程式設計實戰:從原理到 SYN Flood 攻擊代碼解析

編輯:Linux 教學

前言:深入核心協議棧的鑰匙

原始套接字讓應用程式繞過傳輸層,直接操作 IP 層封包,是網路安全研究、協議分析、客製化協議實作的利器。本文將系統講解原始套接字建立流程、關鍵結構體操作,並通過一個 SYN Flood 攻擊範例(僅供教學與防禦研究使用,嚴禁用於非法攻擊),深度剖析 TCP/IP 封包手工構造與發送機制。

一、原始套接字的建立與核心參數

int sockfd = socket(AF_INET, SOCK_RAW, protocol);

關鍵在於第三個參數 protocol,決定封包處理層級:

  • IPPROTO_ICMP:接收/發送 ICMP 封包(如 ping 實作)
  • IPPROTO_TCP:直接操作 TCP 封包(需自行填寫 TCP 標頭)
  • IPPROTO_UDP:直接操作 UDP 封包
  • IPPROTO_RAW:完全手工構造 IP 標頭(含 IP 選項)

權限提示:建立原始套接字需 root 權限(或 CAP_NET_RAW capability),普通用戶需透過 setuid 或 sudo 執行。

二、關鍵系統呼叫與選項設定

1. IP_HDRINCL 選項——掌握 IP 標頭控制權

int on = 1;
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));

啟用後,核心不再自動填寫 IP 標頭,應用程式必須完整構造 struct iphdr。若不設定,核心會根據目的地址自動填寫 IP 標頭(僅適用於 TCP/UDP 原始套接字)。

2. 封包發送介面

sendto(sockfd, buffer, len, 0, (struct sockaddr *)&dest, sizeof(dest));

目的地址結構體 sockaddr_in 僅用於路由查找與鏈路層封裝,實際 IP 封包內容完全由 buffer 內容決定。

三、實戰範例解析:SYN Flood 攻擊程式

代碼功能:偽造隨機來源 IP,向目標 80 埠發送大量 SYN 封包,耗盡目標半連接佇列導致拒絕服務。

核心代碼流程拆解

  1. 參數解析與地址解析:支援主機名/IP 直接輸入,inet_aton 失敗時回退 gethostbyname。
  2. 建立 TCP 原始套接字並啟用 IP_HDRINCL:socket(AF_INET, SOCK_RAW, IPPROTO_TCP)。
  3. 手工構造 IP 標頭(struct iphdr):
    • 版本 ip_v=4、標頭長度 ip_hl=5(20 bytes)
    • 服務類型 ip_tos=0、總長度 ip_len(IP+TCP 標頭)
    • 識別碼 ip_id=0(核心自動填充)、片段偏移 ip_off=0
    • TTL ip_ttl=255、協議 ip_p=IPPROTO_TCP
    • 校驗和 ip_sum=0(核心自動計算)
    • 目的 IP ip_dst、來源 IP ip_src(攻擊迴圈中隨機偽造)
  4. 手工構造 TCP 標頭(struct tcphdr):
    • 來源埠 source=8888、目的埠 dest=80
    • 序號 seq=random()、確認號 ack_seq=0
    • 資料位移 doff=5(20 bytes)、SYN 標誌 syn=1
    • 視窗大小、校驗和、緊急指標均為 0
  5. 攻擊迴圈:while(1) 持續偽造來源 IP、計算 TCP 校驗和、sendto 發送。

校驗和計算函數

unsigned short check_sum(unsigned short *addr, int len) {
    register int sum = 0, nleft = len;
    unsigned short *w = addr, answer = 0;
    while (nleft > 1) { sum += *w++; nleft -= 2; }
    if (nleft == 1) { *(unsigned char *)(&answer) = *(unsigned char *)w; sum += answer; }
    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);
    answer = ~sum;
    return answer;
}

標準 RFC 1071 算法:16 位元字組求和、進位回卷、取反碼。

四、編譯與執行實驗(僅限本機測試)

gcc -o dos dos.c
chown root:root dos
chmod +s dos          # 設定 setuid bit,允許普通用戶以 root 權限執行
./dos localhost       # 僅對本機測試,嚴禁指向他人主機

觀察現象:目標機 netstat -an 將出現大量 SYN_RECV 狀態連接,服務回應變慢或拒絕新連接。

五、總結與防禦思考

原始套接字將「核心自動封裝」轉為「應用程式手工構造」,賦予了完全控制權,也帶來了安全風險。理解其機制有助於:

  • 開發客製化協議、網路測試工具、封包捕獲分析器
  • 理解 SYN Flood、IP 欺騙、TCP 會話劫持等攻擊原理
  • 部署防禦:啟用 tcp_syncookies、限制半連接佇列、部署 IDS/IPS 異常流量檢測

警示:任何未經授權的網路攻擊均屬違法。本文代碼僅供在受控實驗環境中學習協議細節與防禦策略,請嚴格遵守網路安全法律法規。

Copyright © Windows教程網 All Rights Reserved