1. 程式人生 > >泛洪攻擊C#實現

泛洪攻擊C#實現

SYN Flood是當前最流行的DoS(拒絕服務攻擊)與DDoS(分散式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,傳送大量偽造的TCP連線請求,從而使得被攻擊方資源耗盡(CPU滿負荷或記憶體不足)的攻擊方式。TCP是基於連線的,為了在服務端和客戶端之間傳送TCP資料,必須先建立一個虛擬電路,也就是TCP連線,建立TCP連線的過程是:第一步,客戶主機向伺服器傳送一個包含SYN標誌的TCP報文初始化連線,SYN即同步(Synchronize),同步報文會指明客戶端使用的埠以及TCP連線的初始序號,客戶時間戳的值等資訊;第二步,伺服器在收到客戶端的SYN報文後,設定ACK位,同時TCP序號被加一,這說明伺服器接受了客戶的連線請求,伺服器將返回一個
SYN+ACK的報文給客戶端,表示客戶端的請求被接受,ACK即確認(Acknowledgement)。第三步,客戶端也設定ACK位,返回一個確認報文ACK給伺服器端,同樣TCP序列號被加一,到此一個TCP連線完成。以上的連線過程在TCP協議中被稱為三次握手(Three-way Handshake)。而洪水攻擊就是利用了這三次握手的資訊互動特性。在TCP連線的三次握手中,假設一個客戶端向伺服器傳送了SYN報文後突然宕機或掉線,那麼伺服器在發出應答SYN+ACK報文後將是無法收到客戶端的ACK迴應報文的,這樣第三次握手將無法完成,在設計TCP時,由於考慮到資料包有可能在傳輸過程中丟失或傳錯方向,伺服器端一般會重試,再次傳送
SYN+ACK迴應報文給客戶端,並等待一段時間,同時把其記憶體用在等待來自源地址的ACK上,這段等待時間的長度我們稱為SYN Timeout,一般來說這個時間是分鐘的數量級(大約為30-2分鐘);一個使用者出現異常導致伺服器的一個執行緒等待1分鐘並不是什麼很大的問題,但如果有一個惡意的攻擊者大量模擬這種情況,伺服器端將為了維護一個非常大的半連線列表而消耗非常多的記憶體資源,即使是簡單的儲存並遍歷也會消耗非常多的CPU時間和記憶體,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。如果伺服器的TCP/IP棧不夠充足,最後的結果往往是堆疊溢位崩潰,伺服器端也將忙於處理攻擊者偽造的TCP半連線請求而無暇顧及客戶的正常連線請求,此時從正常客戶的角度看來,伺服器失去響應而癱瘓,這種情況被稱為伺服器端受到了
SYN Flood攻擊