附圖:Cisco Guard XT 5650-B 阻斷式攻擊防禦設備

前言
對於阻斷式攻擊的防禦理論以及瞭解,讀者們必須把握住IP,TCP,UDP,HTTP,SMTP等常用的通訊協定,也就是說,對於上述的通訊協定的瞭解必須要有一定的深度,例如:TCP連線建立的三向交握(Three Way Handshake),IP定址的計算(例如:10.1.3.24/14的網路及廣播位址為何?),TCP表頭中每個旗標(Flag)所代表的意義為何等,都是Ben老師認為瞭解通訊協定的開始,如果讀者們目前並不是很瞭解Ben老師剛剛所提的問題,那麼建議往後再來看看這篇文章。

在DDoS的上集,Ben老師向各位讀者介紹了防範DDoS的各種方法,每個方法都有其優缺點,但是有一個共通的缺點就是:當DDoS的防禦機制啟動後,無論正常的或是不正常的連線,完全都無法到達提供服務的伺服器,這樣只保護了該伺服器而已,但是對於目的在讓該伺服器停止提供服務的駭客們,事實上已經達到了某種程度的目的了。

所以,Ben老師在這篇專欄中,會以理論為基礎,向各位讀者解釋較為簡單且流行的DDoS方式。

簡述TCP的攻擊方式
Ben老師在此提供一些常用的TCP DDoS方式:
1.SYN Flood
2.ACK-Flood
3.SYN+ACK Flood
4.SYN+RST Flood
5.RST Flood
6.Established Flood
7.FIN Flood
8.TCP Options Flood
9.X-Tree Flood

各位讀者可以看到有相當多的旗標在這些攻擊的方式裡,這也是在本專欄內容的中後段,會簡單的介紹TCP連線方式及原理的原因。

每每談到DDoS,大部分的人會想到SYN Flood,但是Ben老師在這裡要特別提出一個想法,SYN Foold並不是唯一的一種DDoS攻擊方式,也不是攻擊的終極目的,在現實的網路環境中,SYN Flood的攻擊通常是為了另一種攻擊鋪路,而達到植入後門或是竊取資料等目的。

TCP連線的建立及結束
在瞭解TCP的連線建立及結束前,讀者們必須先對TCP表頭的各個領域的功能稍作瞭解,Ben老師特別在此提供TCP的表頭,並且簡單的解釋一下其中的一些領域功能:


跟DDoS相關性較高的領域就是所謂的旗標(Code或是Flag),下面的表格解釋了部分旗標的功能:

建立TCP連線的建立大致上可以分為三個部分:
1.連線的建立 - 三向交握 (Three-Way Handshake)。
2.傳輸資料。
3.結束連線。
如下圖所示:

由此,讀者們可以知道到對於TCP連線的瞭解,必須要深入到棋標的用途以及各個領域的瞭解,才能真正的掌握TCP連線的效能調整,以及攻擊的防範。

簡述SYN Flooding
對於TCP稍作瞭解後,Ben老師會提出一些不同的狀況讓各位讀者知道大概會有哪些狀況發生;下圖表示了一般TCP的正常三向交握。

但是如果TCP的用戶端(Client)因為某種原因無法在三向交握中的最後一個步驟確認連線,會有什麼樣的狀況發生呢?

所以我們現在來看看,TCP的伺服器端 (Server)要如何因應用戶端不回應連線確認(ACK封包)的狀況? 伺服器端會等待用戶端的ACK封包,如果等不到的話,會再重新傳送一個SYN+ACK的封包,再一直等不到的話,就會持續的傳送SYN+ACK封包,直到逾時(timeout)為止,接著送出一個RST封包來中斷該TCP的連線,如下圖所示。


DoS,DDoS的攻擊理論
DoS及DDoS的攻擊所涵蓋的面相當廣,DNS、HTTP、SMTP等協定也有其相關的漏洞可被攻擊,今天Ben老師所要討論的是專門就TCP的SYN Flood角度來探討。

SYN Round Trip Time (RTT)定義當機器送出SYN+ACK封包後的第一時間,到收到另一端所發出的ACK封包所需的時間;當伺服器收到用戶端的第一個TCP SYN封包時,該TCP連線就會進入SYN_RCVD的狀態,也就是SYN的封包被RECEIVED的意思,RCVD也就是RECEIVED的縮寫,SYN_RCVD的狀態在收到相關的ACK封包的之後,就會轉成ESTABLISHED的狀態,因而TCP的連線就建立完成,開始傳送資料。

重點來了,每台機器聽取TCP連線的都有其一定數目的限制(queue),因此,當伺服器端的SYN_RCVD到達queue的極限時,最老的SYN_RCVD就會被刪除掉以便接受新的連線;假設Ben老師很快的發出了數量相當多的SYN封包,對某伺服器作連線,第一個送出去的SYN封包,在伺服器端所產生的TCP SYN_RCVD狀態,已經因為過多的後繼SYN_RCVD給推擠掉了,所以,就算Ben老師的機器已經送出ACK封包想要建立連線,也因為相對應的SYN_RCVD狀態不存在,而無法建立連線。

所以,在TCP層面上的阻斷式攻擊,只要能夠迅速的把SYN_RCVD狀態消耗掉,就可以達到目的。



SYN Flood基本上有兩種類型:Non-Spoofed(不偽裝IP位址)以及Spoofed(偽裝的IP位址);Non-Spoofed的攻擊方式並不偽裝其發出攻擊的的IP位址,所以會收到伺服器端所發出的SYN+ACK封包,這種方式會暴露攻擊者的位址;Spoofed的攻擊方式使用了假的IP位址,所以伺服器端所送出的SYN+ACK封包會送到那個假的IP位址去,因此很難發現攻擊機器的位址,但是,這種攻擊方式會送出大量的封包到擁有那個假IP的機器,這也是另一種的攻擊方式,如下圖所示。

結論
阻斷式攻擊是一個既便宜又有效的攻擊方式,攻擊工具隨處可得,就算是系統上的指令ping,或是Apache套件內所附的指令ab(Apache Benchmark)等,都可以拿來當成阻斷式攻擊的利器;除了Cisco的 Guard跟Detector外,目前並沒有專門針對阻斷式攻擊的專門設備,另外,頻寬的攻擊並不是企業端可以防制的,因此,也必須仰賴服務提供商(ISP)提供相關的防禦措施,方才能達到完全的解決方案。