**阻斷服務(DoS,Denial of Service)**是最單純的網路攻擊形式之一。它不試圖竊取資訊,只是阻止對某服務或資源的存取。
兩大類 DoS#
- 讓服務崩潰(crash):更接近程式漏洞利用而非網路攻擊,常依賴特定廠商的糟糕實作。緩衝區溢位失手時通常就是讓目標程式崩潰。
- 淹沒服務(flood):試圖用大量流量壓垮網路資源,使其無法回應。
由於作業系統處理網路堆疊,這段程式碼的崩潰會拖垮核心,讓整台機器都無法服務。現代作業系統多半已修補這些弱點,但思考這些技術如何套用到不同情境仍很有用。
崩潰型攻擊#
SYN Flooding#
SYN flood 試圖耗盡 TCP/IP 堆疊中的狀態。TCP 維持「可靠」連線,每條連線都得被追蹤——核心中的 TCP/IP 堆疊負責此事,但它的追蹤表有限。
攻擊者用偽造、不存在的來源位址向受害者灌大量 SYN 封包。受害機器回 SYN/ACK 給偽造位址、等待預期的 ACK,這些等待中的**半開連線(half-open connection)**進入空間有限的 backlog 佇列。由於偽造來源根本不存在,用來完成連線、清除佇列項目的 ACK 永遠不來,每個半開連線只能慢慢逾時。只要攻擊持續,佇列就滿載,真正的 SYN 幾乎無法進入。
synflood.c 用 libnet 建構帶偽造隨機來源 IP、只設 TH_SYN 旗標的封包並注入:
libnet_build_ip(..., libnet_get_prand(LIBNET_PRu32), dest_ip, ...); // 隨機來源 IP
libnet_build_tcp(..., TH_SYN, ...); // 只設 SYN
用 libnet 編譯時需
-lnet,但還需一組強制的 define 旗標——用$(libnet-config --defines)動態插入編譯命令即可。
有些作業系統(如 Linux)用 syncookies 防禦:TCP 堆疊依主機細節與時間調整回應 SYN/ACK 的初始確認號(防重放攻擊)。TCP 連線要等交握的最後一個 ACK 通過檢查才真正啟用;序號不符或 ACK 不來,連線就不建立。這有助於防止偽造的連線嘗試。
Ping of Death 與 Teardrop#
兩個歷史崩潰攻擊:Ping of Death 與 Teardrop
Ping of Death:依 ICMP 規格,ICMP echo 訊息的資料部分最多 2¹⁶(65,536)位元組。ICMP 封包的資料部分常被忽略(重要資訊在標頭),於是有些作業系統收到超過此大小的 ICMP echo 就崩潰——這種超大 ping 被暱稱為 Ping of Death。它利用的正是「沒人想過這種可能」的弱點。
歷史往往重演。超大 ICMP 封包如今不再讓電腦崩潰,但新技術有時重蹈覆轍:手機常用的 Bluetooth 協定在 L2CAP 層有類似的 ping 封包,許多實作同樣有超大 ping 問題——這個攻擊被稱為 Bluesmack。
Teardrop:利用多家廠商 IP 分片重組實作的弱點。通常分片的偏移值會對齊、無重疊地重建原封包;teardrop 送出偏移重疊的分片,讓未檢查此異常狀況的實作崩潰。這類早期實作的錯誤,常在新產品上重複發生(例如 OpenBSD 核心一個與 IPv6 分片封包有關的遠端漏洞)。
淹沒型攻擊#
Ping Flooding#
最簡單的淹沒形式,目標是耗盡受害者的頻寬,讓合法流量無法通過。攻擊者送大量大型 ping 封包蠶食受害者的頻寬。
這個攻擊沒什麼巧妙之處,純粹是頻寬之戰——頻寬大於受害者的攻擊者,能送出比對方接收更多的資料。
放大攻擊#
**放大攻擊(amplification attack)**用偽造與廣播定址,把單一封包流放大百倍:
- 找一個放大系統:允許與廣播位址通訊、且有相當多活躍主機的網路。
- 攻擊者以受害者的偽造來源位址,向放大網路的廣播位址送大型 ICMP echo request。
- 放大器把封包廣播給網路上所有主機,這些主機各自回 ICMP echo reply 給偽造來源(即受害者)。
這讓攻擊者只需送出相對小的 ICMP echo request 流,受害者卻被多達數百倍的 echo reply 淹沒。用 ICMP 與 UDP echo 封包做,分別稱為 smurf 與 fraggle 攻擊。

圖 0x400-9:放大攻擊——以受害者為偽造來源、送往放大網路廣播位址的封包
分散式 DoS(DDoS)#
淹沒型 DoS 的分散式版本。既然頻寬消耗是目標,攻擊者能動用的頻寬越多、破壞越大。
攻擊者先入侵大量其他主機、安裝守護程式——這些被裝上軟體的系統常被稱為 bot,組成 botnet(殭屍網路)。攻擊者用某種控制程式,讓所有 bot 同時對受害者發動淹沒攻擊。大量分散主機不僅倍增淹沒效果,也讓追查攻擊來源困難得多。