「網絡安全」常見攻擊篇(17)——SYN洪水攻擊

什麼是SYN洪水攻擊?

SYN Flood 或稱 SYN洪水、SYN洪泛是一種阻斷服務攻擊,起因於攻擊者傳送一系列的SYN請求到目標系統。

TCP連接三次握手

當一個客戶端嘗試和一個服務器建立TCP連接,客戶端和服務端會交換一系列報文。 這種連接技術廣泛的應用在各種TCP連接中,例如telnet,Web,email,等等。 SYN(synchronous)是TCP/IP建立連接時使用的握手信號,用戶和服務器之間的正常連接需要正確執行3次握手,具體流程如下圖所示:

「網絡安全」常見攻擊篇(17)——SYN洪水攻擊

TCP連接三次握手圖

當客戶端嘗試與服務器建立TCP連接時,客戶端和服務器在正常情況下交換一組信息,如下所示:

  1. 客戶端將SYN同步信息發送到服務器並請求連接設置。
  2. 服務器響應客戶端SYN-ACK響應請求。
  3. 客戶端承諾ACK並建立連接。

這是在所謂的TCP 3次握手中使用TCP傳輸協議的每個連接的基礎。

SYN洪水原理

「網絡安全」常見攻擊篇(17)——SYN洪水攻擊

正常情況下,客戶端發送一個SYN報文給服務端,服務端發送一個SYN-ACK包以回應客戶端,接著,客戶端就返回一個ACK包來實現一次完整的TCP連接。

然而,在服務端返回一個確認的SYN-ACK包的時候有個潛在的弊端,他可能不會接到客戶端回應的ACK包。這個也就是所謂的半開放連接,服務端需要耗費一定的數量的系統內存來等待這個未決的連接,雖然這個數量是受限的,但是惡意者可以通過創建很多的半開放式連接來發動SYN洪水攻擊 。

通過ip欺騙可以很容易的實現半開放連接。攻擊者發送SYN包給服務端系統,這個看起來是合法的,但事實上所謂的客戶端根本不會回應這個 。SYN-ACK報文,這意味著服務端將永遠不會接到ACK報文。 而此時,半開放連接將最終耗用受害者所有的系統資源,受害者將不能再接收任何其他的請求。通常等待ACK返回包有超時限制,所以半開放連接將最終超時,而受害者系統也會自動修復。雖然這樣,但是在受害者系統修復之前,攻擊者可以很容易的一直髮送虛假的SYN請求包來持續攻擊。

在大多數情況下,受害者幾乎不能接受任何其他的請求,但是這種攻擊不會影響到已經存在的進站或者是出站連接。雖然這樣,受害者系統還是可能耗盡系統資源,以導致其他種種問題。 攻擊系統的位置幾乎是不可確認的,因為SYN包中的源地址多數都是虛假的。當SYN包到達受害者系統的時候,沒有辦法找到他的真實地址 ,因為在基於源地址的數據包傳輸中,源ip過濾是唯一可以驗證數據包源的方法。

什麼是SYN cookie?

SYN cookie是一個防止SYN洪水攻擊技術。現在SYN cookie已經是linux內核的一部分了(默認的stat是no),但是在linux系統的執行過程中它只保護linux系統。如果創建一個linux防火牆,他可以為整個網絡和所有的網絡操作系統提供SYN COOKIE保護你可以用這個防火牆來阻斷半開放式tcp連接,所以這個受保護的系統不會進入半開放狀態(TCP_SYN_RECV)。當連接完全建立的時候,客戶機到服務器的連接要通過防火牆來中轉完成。

SYN cookie就是用一個cookie來響應TCP SYN請求的TCP實現,根據上面的描述,在正常的TCP實現中,當服務端接收到一個SYN數據包,他返回 一個SYN-ACK包來應答,然後進入TCP-SYN-RECV(半開放連接)狀態來等待最後返回的ACK包。服務端用一個數據空間來描述所有未決的連接, 然而這個數據空間的大小是有限的,所以攻擊者將塞滿這個空間。 在TCP SYN COOKIE的執行過程中,當服務端接收到一個SYN包的時候,他返回一個SYN-ACK包,這個數據包的ACK序列號是經過加密的,也就 是說,它由源地址,端口源次序,目標地址,目標端口和一個加密種子計算得出。然後服務端釋放所有的狀態。如果一個ACK包從客戶端返回, 服務端將重新計算它來判斷它是不是上個SYN-ACK的返回包。如果這樣,服務端就可以直接進入TCP連接狀態並打開連接。從而使服務端避免守侯半開放連接。


什麼是SYN COOKIE 防火牆 ?

SYN COOKIE 防火牆是SYN cookie的一個擴展,SYN cookie是建立在TCP堆棧上的,他為linux操作系統提供保護。SYN cookie防火牆是linux的一大特色,你可以使用一個防火牆來保護你的網絡以避免遭受SYN洪水攻擊。
下面是SYN cookie防火牆的原理
client firewall server
------ ---------- ------
1. SYN----------- - - - - - - - - - ->
2. 3. ACK----------- - - - - - - - - - ->
4. - - - - - - -SYN--------------->
5. 6. - - - - - - -ACK--------------->
7. -----------> relay the ------->
1:一個SYN包從客戶端發送到服務端。
2:防火牆在這裡扮演了服務端的角色來回應一個帶SYN cookie的SYN-ACK包給客戶端。
3:客戶端發送ACK包,接著防火牆和客戶端的連接就建立了。
4:防火牆這個時候再扮演客戶端的角色發送一個SYN給服務端。5:服務端返回一個SYN給客戶端 。
6:防火牆扮演客戶端發送一個ACK確認包給服務端,這個時候防火牆和服務端的連接也就建立了 。
7:防火牆轉發客戶端和服務端之間的數據 。
如果系統遭受SYN Flood,那麼第三步就不會有,而且無論在防火牆還是服務端都不會收到相應在第一步的SYN包,所以我們就擊退了這次SYN洪水攻擊。

如何檢測SYN攻擊?

檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊。我們使用系統自帶的netstat 工具來檢測SYN攻擊:

# netstat -n -p TCP
tcp 0  0 10.11.11.11:23 124.173.152.8:25882  SYN_RECV 
tcp 0  0 10.11.11.11:23 236.15.133.204:2577  SYN_RECV -
tcp 0  0 10.11.11.11:23 127.160.6.129:51748  SYN_RECV -
tcp 0  0 10.11.11.11:23 222.220.13.25:47393  SYN_RECV -
tcp 0  0 10.11.11.11:23 212.200.204.182:60427 SYN_RECV -
tcp 0  0 10.11.11.11:23 232.115.18.38:278  SYN_RECV -
tcp 0  0 10.11.11.11:23 239.116.95.96:5122 SYN_RECV -
tcp 0  0 10.11.11.11:23 236.219.139.207:49162 SYN_RECV -

上面是在LINUX系統中看到的,很多連接處於SYN_RECV狀態(在WINDOWS系統中是SYN_RECEIVED狀態),源IP地址都是隨機的,表明這是一種帶有IP欺騙的SYN攻擊。

LINUX環境下查看某個端囗的未連接隊列的條目數:

#netstat -n -p TCP | grep SYN_RECV | grep :22 | wc -l

如何防範SYN攻擊?

關於SYN攻擊防範技術,主要有兩大類,一類是通過防火牆、路由器等過濾網關防護,另一類是通過加固TCP/IP協議棧防範。



上一篇:

下篇預告:「網絡安全」常見攻擊篇(18)——UDP FLood攻擊 敬請關注


分享到:


相關文章: