1、三次握手的具體流程
所謂三次握手,即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立。在socket編程中,這一過程由客戶端執行connect來觸發,整個流程如下圖所示:

(1)第一次握手:客戶機的TCP首先向服務器的TCP發送一個連接請求報文段。這個特殊的報文段中不含應用層數據,其首部中的SYN標志位被置為1。另外,客戶機會隨機選擇一個起始序號seq=J(連接請求報文不攜帶數據,但要消耗一個序號)。
(2)第二次握手:服務器的TCP收到連接請求報文段后,如同意建立連接,就向客戶機發回確認,並為該TCP連接分配TCP緩存和變量。在確認報文段中,SYN和ACK位都被置為1,確認號字段的值為J+1,並且服務器隨機產生起始序號seq=K(確認報文不攜帶數據,但也要消耗一個序號)。
(3)第三次握手:當客戶機收到確認報文段后,還要向服務器給出確認,並且也要給該連接分配緩存和變量。這個報文段的ACK標志位被置1,確認字段為K+1,該報文段可以攜帶數據,若不攜帶數據則不消耗序號。
成功進行以上三步后,就建立了TCP連接。
2、TCP三次握手缺陷引起的SYN泛洪攻擊
SYN泛洪攻擊利用TCP三次握手協議的缺陷,向目標主機發送大量的偽造源地址的SYN連接請求,使得被攻擊方資源耗盡,從而不能夠為正常用戶提供服務。
在TCP協議三次握手的連接過程中,如果一個用戶向服務器發送了SYN報文,服務器又發出 SYN+ACK 應答報文后未收到客戶端的 ACK 報文,這種情況下服務器端會再次發送SYN+ACK給客戶端,並等待一段時間后丟棄這個未完成的連接,這段時間的長度稱為SYN Timeout,一般來說這個時間是分鍾的數量級。
SYN 泛洪攻擊所做的就是利用這個SYN Timeout和TCP/IP協議族中的另一個漏洞: 報文傳輸過程中對報文的源 IP 地址完全信任進行攻擊。SYN 泛洪攻擊通過發送大量的偽造 TCP 連接報文而造成大量的 TCP 半連接,服務器端將為了維護這樣一個龐大的半連接列表而消耗非常多的資源。這樣服務器端將忙於處理攻擊者偽造的TCP連接請求而無法處理正常連接請求,甚至會導致堆棧的溢出崩潰。
造成SYN泛洪攻擊最主要的原因是TCP/IP協議的脆弱性。TCP/IP是一個開放的協議平台,它將越來越多的網絡連接在一起,它基於的對象是可信用戶群,所以缺少一些必要的安全機制,帶來很大的安全威脅。例如常見的IP欺騙、TCP連接的建立、ICMP數據包的發送都存在巨大的安全隱患,給SYN泛洪攻擊帶來可乘之機。在本次實驗下我們將采用kali linux虛擬機進行泛洪攻擊。
3、kali下Hping3工具介紹
Hping是一個命令行下使用的TCP/IP數據包組裝/分析工具,其命令模式很像Unix下的ping命令,但是它不是只能發送ICMP回應請求,它還可以支持TCP、UDP、ICMP和RAW-IP協議,它有一個路由跟蹤模式,能夠在兩個相互包含的通道之間傳送文件。Hping常被用於檢測網絡和主機,其功能非常強大,可在多種操作系統下運行,如Linux,FreeBSD,NetBSD,OpenBSD,Solaris,MacOs X,Windows。
(1)Hping3工具主要功能:
防火牆測試
實用的端口掃描
網絡檢測,可以用不同的協議、服務類型(TOS)、IP分片
手工探測MTU(最大傳輸單元)路徑
先進的路由跟蹤,支持所有的協議
遠程操作系統探測
遠程的運行時間探測
TCP/IP堆棧審計
(2)hping3命令主要參數
-h --help 顯示幫助
-v --version 顯示版本
-c --count 發送數據包的數目
-i --interval 發送數據包間隔的時間 (uX即X微秒, 例如: -i u1000)
--flood 盡最快發送數據包,不顯示回復。
-n --numeric 數字化輸出,象征性輸出主機地址。
-q --quiet 安靜模式
-I --interface 網卡接口 (默認路由接口)
-V --verbose 詳細模式
-D --debug 調試信息
-z --bind 綁定ctrl+z到ttl(默認為目的端口)
-Z --unbind 取消綁定ctrl+z鍵
-a 源地址欺騙。偽造IP攻擊,防火牆就不會記錄你的真實IP了,當然回應的包你也接收不到了
UDP/TCP 模式
-s --baseport // 缺省隨機源端口
-p --destport // 缺省隨機源端口
-k --keep // 保持源端口
-w --win winsize (default 64)// win的滑動窗口。windows發送字節(默認64)
-O --tcpoff // 設置偽造tcp數據偏移量
-Q --seqnum // 僅顯示tcp序列號
-b --badcksum (嘗試)發送具有錯誤IP校驗和數據包。許多系統將修復發送數據包的IP校驗和。所以你會得到錯誤UDP/TCP校驗和。
-M --setseq 設置TCP序列號
-L --setack 設置TCP的ack
-F --fin set FIN flag
-S --syn set SYN flag
-R --rst set RST flag
-P --push set PUSH flag
-A --ack set ACK flag
-U --urg set URG flag
-X --xmas set X unused flag (0x40)
-Y --ymas set Y unused flag (0x80)
4、虛擬機模擬泛洪攻擊
在同一個局域網下,在兩台虛擬機之間進行SYN Flood攻擊,其中攻擊者為Kali Linux,被攻擊者為ubuntu。
首先查看兩個虛擬機的IP地址,看是否在同一個網段下,並測試之間的連通性。
發現二者之間能夠ping通。
接下來我們在kali linux下發動泛洪攻擊,同時觀察ubuntu的cpu使用情況。
未發動泛洪攻擊前,ubuntu的cpu使用情況如下所示,cpu使用率很低。
發動泛洪攻擊后,其cpu使用情況如下所示,當在ubuntu內進行一些操作時,系統變得非常卡,連打開一個文件夾都反應非常慢,當把hping3發送數據包的間隔時間進一步縮小,ubuntu虛擬機直接黑屏。
最后在ubuntu下使用wireshark進行抓包分析
因為在進行泛洪攻擊時隱藏了源IP地址,偽造IP地址為10.0.1.1,所以發現有大量的源地址為10.0.1.1的包在給目的主機發送連接請求,進行SYN泛洪攻擊,目的主機處理不過來,SYN一直持續攻擊,一直消耗系統的資源,最終導致系統崩潰。
再詳細看一下
目的主機向收到的連接請求進行了確認,但是卻收不到回復,服務器端會再次發送SYN+ACK給客戶端,服務器端將忙於處理攻擊者偽造的TCP連接請求而無法處理正常連接請求,如果這些半連接的握手請求是惡意程序發出,並且持續不斷,那么就會導致服務端較長時間內喪失服務功能——這樣就形成了DoS攻擊。
5、如何防御SYN泛洪攻擊
(1)縮短SYN timeout時間
(2)使用防火牆
防火牆位於客戶端和服務器之間.因此利用防火牆來阻止DoS攻擊能有效地保護內部的服務器。針對SYN Flood,防火牆通常有三種防護方式:SYN網關、被動式SYN網關和SYN中繼。
1)SYN網關: 防火牆收到客戶端的SYN包時,直接轉發給服務器:防火牆收到服務器的SYN/ACK包后,一方面將SYN/ACK包轉發給客戶端,另一方面以客戶端的名義給服務器回送一個ACK包.完成TCP的三次握手,讓服務器端由半連接狀態進入連接狀態。當客戶端真正的ACK包到達時。有數據則轉發給服務器,否則丟棄該包。由於服務器能承受連接狀態要比半連接狀態高得多。所以這種方法能有效地減輕對服務器的攻擊。
2)被動式SYN網關:設置防火牆的SYN請求超時參數,讓它遠小於服務器的超時期限.防火牆負責轉發客戶端發往服務器的SYN包,服務器發往客戶端的SYN/ACK包、以及客戶端發往服務器的ACK包。這樣,如果客戶端在防火牆計時器到期時還沒發送ACK包,防火牆則往服務器發送RST包,以使服務器從隊列中刪去該半連接。由於防火牆的超時參數遠小於服務器的超時期限,這樣能有效防止SYN Flood攻擊。
3)SYN中繼: SYN中繼防火牆在收到客戶端的SYN包后.並不向服務器轉發而是記錄該狀態信息后主動給客戶端回送SYN/ACK包,如果收到客戶端的ACK包。表明是正常訪問,由防火牆向服務器發送SYN包並完成三次握手。這樣由防火牆作為代理來實現客戶端和服務器端的連接,可以完全過濾不可用連接發往服務器。
參考:https://blog.csdn.net/qq_38684504/article/details/84308100