DDoS和CC攻擊原理(中)
0、前言
本主題研究DDoS和CC的實現原理以及其具體的實現方法,并對如何檢測和防護進行說明。
文章一共分為(上)(中)(下)三篇
1、DDoS攻擊
1.1 IP Spoofing/syn flood攻擊
IP Spoofing也叫IP欺騙,其原理是攻擊者機器A利用軟件構造一個虛假不存在的IP地址,并以此不存在地址為源IP地址向受害者機器B發送SYN報文,請求建立TCP/IP連接。目標機器B接收到這個SYN報文后,會將收到的SYN報文中的源IP地址提取出來,并將此IP作為目的IP,回復一個ACK/SYN確認報文給B,并等待接收來自B的確認報文。由于這個目的IP是攻擊者A偽造的,實際網絡中根本不存在,所以這個ACK/SYN確認報文也就無法到達,B也就不可能接收到它的確認報文。
但是,根據TCP/IP協議規范,受害者B必須一直等待接收A回復的確認報文,直到受害者B內部的定時器超時才放棄等待。這就是一次IP Spoofing攻擊,假如攻擊者A使用軟件以每秒幾百次幾千次乃至幾萬次的速度向同一個受害者B發送虛假SYN報文,那么受害者機器B上就會產生大量的TCP/IP半連接,并且都要等待這些半連接超時(在等待的時候要專心,不能干別的事情的,呵呵),從而使系統資源(CPU、內存、數據緩沖區、數據包處理隊列)耗盡不能及時響應正常的服務請求。
如果攻擊者A控制幾百幾千臺乃至幾萬臺機器同時使用軟件分別以每秒幾百次幾千次乃至幾萬次的速度向同一個受害者B發送虛假SYN報文,這樣,受害者B所建立的TCP/IP半連接數量會呈指數上升,即使B的處理能力再強,網絡帶寬再寬,系統也會在瞬間崩潰,這就是DDoS攻擊。
另外還有一種利用大量真實ip的肉雞實施的syn攻擊,也屬于syn flood攻擊。
1.2 land攻擊
Land攻擊其實是IP Spoofing攻擊的一個變種。其原理是攻擊者機器A向受害者機器B發送一個偽造的SYN報文,此SYN報文的源IP地址和目的IP地址都被設成受害者機器B的IP地址,源端口號和目的端口號也相同。
受害者機器B接收到此SYN報文后,提取報文的源IP地址(其實是B機器自己的IP地址),并將其作為目的IP地址發送一個SYN/ACK 報文(其實是向它自己發送了一個SYN/ACK報文),結果這個地址又發回ACK確認報文,從而創建了一個空連接,每一個這樣的空連接都將保留到內部定時器超時后才釋放,從而消耗掉大量的系統資源。對于Land 攻擊,各種操作系統的反應也有所不同UNIX 系統將會崩潰,而NT 系統將變的極其緩慢,時間大約持續五分鐘。
1.3 ack攻擊
系統在收到一個ACK報文時,如果目的端口未開放,那么端系統會直接向源IP發送RST報文, 如果系統的相關端口是對外開放的,那么其在收到ACK報文時,首先會檢查這個ACK報文是否屬于TCP連接表中的一個已有連接(這個過程會對端系統主機CPU資源造成一定的消耗),如果是的話,則正常處理如果不屬于任何一個已有連接,那么系統會向源IP發送RST報文。
因此,單純的偽造IP進行ack攻擊對系統的影響并不大,ack攻擊需要配合SYN flood攻擊才能產生較好的攻擊效果,原因為針對防護SYN flood攻擊的一種技術 ——SYN cookie技術。當某些啟用SYN cookie技術進行SYN flood攻擊防護的中間設備(專業抗DOS設備、防火墻、IPS、負載均衡、路由器等),在收到ACK報文時,需要計算cookie值,這個過程會消耗一部分中間設備的CPU資源,如果大量的ACK報文過來的話,很可能很快就會導致設備資源耗盡,達到拒絕服務的效果。
另外,高于10kpps的ACK Flood會造成服務器網卡中斷頻率過高,負載過重而停止響應。
1.4 syn、ack混合攻擊
建立TCP連接后再進行流量型攻擊,能夠繞過純流量型防御算法(絕大部分防火墻會先檢查連接跟蹤表)。如果連接較多該種攻擊對服務器的危害較大。

1.5 udp flood攻擊
UDP Flood攻擊的原理是攻擊者機器A偽造一個并不存在的IP地址,并以此為源IP地址向受害者機器B發送一個UDP報文,B收到UDP報文后,發現上層沒有任何應用程序在等待UDP端口,于是B就會生成一個ICMP報文發給該偽造的源IP地址,告訴對方剛才所發的UDP報文無法連接。如果A向B發送的足夠多的UPD報文,受害者B將忙于處理這些無用的UDP報文,造成系統資源耗盡,導致癱瘓。

1.6 ICMP flood攻擊/Smurf攻擊
ICMP Flood攻擊的原理就在在較短時間內向受害者機器發送大量的ICMP請求報文,使受害者機器忙于向外發送ICMP應答報文,造成系統資源耗盡導致癱瘓。
Smurf攻擊的原理是攻擊者A向廣播地址發送ICMP請求廣播報文,不過該廣播報文的源IP地址不是攻擊者A本身,而是偽造成受害者B的IP地址,這樣,廣播域內所有收到該ICMP請求報文的機器都會給受害者B回復ICMP應答報文,因而產生大量的通信業務,從而導致受害者B的網絡擁塞及系統癱瘓。對于Smurf攻擊,廣播域內的機器數量越多,攻擊效果就越明顯。
1.7 DNS(UDP53)反射放大攻擊

1.8 DNS Query Flood攻擊
攻擊采用的方法是向被攻擊的服務器發送大量的域名解析請求,通常請求解析的域名是隨機生成或者是網絡上根本不存在的域名,被攻擊的DNS 服務器在接收到域名解析請求的時候首先會在服務器上查找是否有對應的緩存,如果查找不到并且該域名無法直接由服務器解析的時候,DNS 服務器會向其上層DNS服務器遞歸查詢域名信息,直到該域名的最終解析服務器。域名解析的過程給服務器帶來了很大的負載,每秒鐘域名解析請求超過一定的數量(根據購買套餐不同)就會造成DNS服務商停止對該域名的解析服務。

1.9 XSSDoS攻擊
當網站存在XSS漏洞時,攻擊者可以在用戶的自定義頭像中插入邪惡的javascript代碼。所以當合法的用戶訪問這些存在漏洞的頁面時(這些頁面包含了攻擊者的評論,評論中包含頭像),攻擊者藏在頭像中的惡意javascript代碼就會被執行,這段代碼向用戶瀏覽器中插入一個隱藏的iframe,其地址指向DDos攻擊者的C&C服務器。攻擊者使用一個基于 Ajax-script 的DDos工具控制著DDos攻擊的頻率。當每個10分鐘的視頻每分鐘都有成千上萬的用戶進行觀看的時候,這些看似不起眼的訪問就會變成一場可怕的DDos風暴。

1.10 CPDoS攻擊
Cache-Poisoned Denial-of-Service (CPDoS) 一種新式的web緩存污染攻擊
https://cpdos.org/
基本攻擊流程描述如下,如圖所示:
- 攻擊者發送一個簡單的HTTP請求,其中包含針對某些Web服務器提供的受害者資源的惡意標頭。該請求由中間緩存處理,而惡意標頭保持不顯眼。
- 高速緩存將請求轉發到原始服務器,因為它不存儲目標資源的新副本。在原始服務器上由于請求處理中包含惡意頭因此請求處理會引發錯誤。
- 結果,原始服務器返回一個錯誤頁面該頁面由緩存而不是請求的資源存儲。
- 攻擊者作為響應檢索到錯誤頁面時,知道攻擊是成功的。
- 合法用戶嘗試通過后續請求獲取目標資源...
- ...將獲得緩存的錯誤頁面,而不是原始內容。

1.11 ReDoS攻擊
寫得不好的正則表達式可能會導致正則表達式引擎耗費大量的時間在回溯上,達到輸入長度的指數級!一個不太長的字符串(幾十或幾百)就能讓正則引擎這輩子都跑不出匹配結果,從而導致拒絕服務攻擊(Denial of Service),因為是正則表達式導致的,縮寫成ReDoS。

1.12 反射放大攻擊
1.12.1 NTP(UDP123)
NTP (網絡時間同步協議)包含一個 monlist 功能,也被稱為 MON_GETLIST,主要用于監控 NTP 服務器,NTP 服務器響應 monlist 后就會返回與 NTP 服務器進行過時間同步的最后 600 個客戶端的 IP,響應包按照每 6 個 IP 進行分割,最多有 100 個響應包。當攻擊者偽造目標ip對NTP服務器發起monlist請求時,目標ip將受到來自NTP服務器的monlist響應包,請求包的大小為 234 字節,每個響應包為 482 字節,如果單純按照這個數據我們可以計算出放大的倍數是:482*100/234 = 206 倍。

1.12.2 SNMP(UDP168)
SNMP第二版里面引入了getbulk,在單個請求里面能獲得大量的管理數據一次bulk請求就可以收到一個包含70條信息的響應包從而實現放大攻擊。

1.12.3 TFTP(UDP69)
tftp沒有認證過程,這樣就可以隨意登錄讀取文件,同時偽造源(攻擊目標)IP地址,為反射做好準備,而tftp重傳機制,當服務端在沒有收到我們的攻擊目標的ACK包時,就會重傳一定的次數給攻擊目標,達到放大的目的。

1.12.4 SSDP(UDP1900)
簡單服務發現協議(SSDP,Simple Service Discovery Protocol)是一種應用層協議,是構成通用即插即用(UPnP)技術的核心協議之一,廣泛應用于無線路由器、網絡攝像頭、打印機、智能家電等UPnP設備。
攻擊者通過偽造SSDP請求源地址,使UPnP設備將SSDP應答消息發往攻擊目標,由于UPnP設備數量較多,攻擊者實現將大量流量引入特定攻擊目標。據統計,SSDP放大倍數在30倍左右。

1.12.5 Chargen(UDP15)
Chargen 字符發生器協議(Character Generator Protocol)是一種簡單網絡協議,設計的目的是用來調試TCP 或UDP 協議程序、測量連接的帶寬或進行QoS 的微調等。它的默認端口為19,分為基于TCP 和UDP 兩種方式,TCP 方式下建立連接后,服務器會不斷傳送任意字符到客戶端,直到客戶端關閉連接。UDP 方式下每當服務器收到客戶端的一個UDP數據包后向客戶端返回一個數據包,長度為0~512 字節之間隨機值數據包的負載可以是任意字符。
Chargen 協議的設計初衷是為了網絡測試,并沒有嚴格的訪問控制和流量控制機制,在UDP 模式下任何人都可以向開放該服務的主機請求服務,這種簡單的請求-回復模式便為DDoS 攻擊者提供了便利。這個漏洞早在1996年就被發現(CVE-1999-0103),該漏洞被利用最主要的原因是實現過程沒有設計必要的訪問控制。
1.12.6 BT
廣泛使用的BitTorrent客戶端如uTorrent、Mainline和Vuze,被發現都存在弱點,可被利用發動DDoS攻擊, 允許一個人輕而易舉的癱瘓一個網站。分布式反射拒絕服務攻擊漏洞存在于BitTorrent協議之中,它允許一名BitTorrent用戶向其它 BitTorrent用戶發送偽造請求。BitTorrent客戶端收到請求之后將能以50倍到120倍于原始請求的流量攻擊目標計算機。讓這種攻擊變為可能的關鍵在于BitTorrent使用的用戶數據報文協議沒有包含防止IP地址纂改的機制。

1.12.7 memcached
很多管理員在安裝memcache時將服務錯誤監聽在0.0.0.0,且未進行防火墻規則設置,導致攻擊者可發送大量偽造攻擊目標IP的UDP請求包給memcache服務器,服務器將在不需要認證的情況下直接回應請求包,且回應包比請求包的大小高出上萬倍,形成巨大的反射放大流量,其倍數能達到五萬倍。

2、CC攻擊
2.1 webcc之http get/post
這種攻擊是指攻擊源和服務器建立正常的TCP連接,并不斷的向腳本程序提交查詢、列表等大量耗費數據庫資源的調用,典型的以小博大的攻擊方法。一般來說,提交一個GET或POST指令對客戶端的耗費和帶寬的占用是幾乎可以忽略的,而服務器為處理此請求卻可能要從上萬條記錄中去查出某個記錄,這種處理過程對資源的耗費是很大的,常見的數據庫服務器很少能支持數百個查詢指令同時執行,而這對于客戶端來說卻是輕而易舉的,因此攻擊者只需通過Proxy代理向主機服務器大量遞交查詢指令,只需數分鐘就會把服務器資源消耗掉而導致拒絕服務,常見的現象就是網站慢如蝸牛、ASP程序失效、PHP連接數據庫失敗、數據庫主程序占用CPU偏高。

2.2 webcc之http head
http HEAD方法跟GET方法相同,只不過服務器響應時不會返回消息體。一個HEAD請求的響應中,HTTP頭中包含的元信息應該和一個GET請求的響應消息相同。這種方法可以用來獲取請求中隱含的元信息而不用傳輸實體本身。

2.3 變異http攻擊
變異GET提交的數據大致模擬IE訪問時的數據包..包含有完整的User-Agent 等信息...因為包體比普通CC的要大.所以受肉雞網絡環境所影響..對WEB端口的拒絕服務效率要低于前者..但是因為偽造完整正常的數據包..所以在穿透防火墻的效果上要高于普通的CC..

2.4 變參http攻擊
GET提交數據包 與變異CC一樣..只不過他不僅僅是針對一個頁面..而是有規則的同時GET多個頁面..比如攻擊目標使用%d作為通配符 .將%d定義為 1~10(.php) 那么它會依次查詢目標的(1.php,2.php,3.php....)等頁面..【一般應用于網站子頁面有規則的動態站點,例如 論壇,CMS系統等等,特別是對數據庫的壓力非常之大.因為不停對動態頁面的查詢會讀寫數據庫..目前這種攻擊方式也被防火墻所關注.效率也低了】

2.5 https攻擊
由于對 HTTPS 協議的處理相對 HTTP 會消耗更多的資源,因此無論是網站運營者還是安全服務商在面對 HTTPS CC 資源消耗型攻擊時,防護能力會面臨巨大挑戰。

2.6 慢速攻擊(1)
對任何一個開放了HTTP訪問的服務器HTTP服務器,先建立了一個連接,指定一個比較大的content-length(用于描述HTTP消息實體的傳輸長度),然后以非常低的速度發包,比如1-10s發一個字節,然后維持住這個連接不斷開。如果客戶端持續建立這樣的連接,那么服務器上可用的連接將一點一點被占滿,從而導致拒絕服務。

2.7 慢速攻擊(2)
Slow headers:Web應用在處理HTTP請求之前都要先接收完所有的HTTP頭部,因為HTTP頭部中包含了一些Web應用可能用到的重要的信息。攻擊者利用這點,發起一個HTTP請求,一直不停的發送HTTP頭部,消耗服務器的連接和內存資源。抓包數據可見,攻擊客戶端與服務器建立TCP連接后,每30秒才向服務器發送一個HTTP頭部,而Web服務器再沒接收到2個連續的\r時,會認為客戶端沒有發送完頭部,而持續的等等客戶端發送數據。
Slow body:攻擊者發送一個HTTP POST請求,該請求的Content-Length頭部值很大,使得Web服務器或代理認為客戶端要發送很大的數據。服務器會保持連接準備接收數據,但攻擊客戶端每次只發送很少量的數據,使該連接一直保持存活,消耗服務器的連接和內存資源。抓包數據可見,攻擊客戶端與服務器建立TCP連接后,發送了完整的HTTP頭部,POST方法帶有較大的Content-Length,然后每10s發送一次隨機的參數。服務器因為沒有接收到相應Content-Length的body,而持續的等待客戶端發送數據。
Slow read:客戶端與服務器建立連接并發送了一個HTTP請求,客戶端發送完整的請求給服務器端,然后一直保持這個連接,以很低的速度讀取Response,比如很長一段時間客戶端不讀取任何數據,通過發送Zero Window到服務器,讓服務器誤以為客戶端很忙,直到連接快超時前才讀取一個字節,以消耗服務器的連接和內存資源。抓包數據可見,客戶端把數據發給服務器后,服務器發送響應時,收到了客戶端的ZeroWindow提示(表示自己沒有緩沖區用于接收數據),服務器不得不持續的向客戶端發出ZeroWindowProbe包,詢問客戶端是否可以接收數據。
使用較多的慢速攻擊工具有:Slowhttptest和Slowloris
2.8 空連接/少包攻擊
依靠大量的肉雞ip對服務器發起連接,連接建立后不發數據包或發少量包(導致不會觸發防御閥值),占用連接資源導致服務器崩潰。(這種攻擊比較難防,威力較大)

2.9 gamecc之假人攻擊
假人攻擊就是黑客利用肉雞做到很多虛擬帳號同一個時間登陸進服務器,假人數據包和真實玩家數據包完全無差異,真實玩家先是卡之后就進不去了,達到攻擊服務器使開服失敗的目的!多為發布站之間惡性競爭!比如你在www.123.com做廣告!www.456.com的就會攻擊你!
游戲一般有游戲網站(客戶端、游戲列表)、登錄網關端口、角色網關端口、游戲網關端口等組成,任何一個環節的攻擊都將導致游戲服務器業務受影響。

3、小結
根據上面的內容,其實不難看出,DDoS和CC能夠實現攻擊的基礎是:源、目的ip地址偽造,數據包參數偽造,具體是什么使得DDoS和CC攻擊成為現實,在最后一篇文章中,我們再來進行總結以及探討如何對其進行防護。
聲明:文章內容均來自互聯網,并且僅是對攻擊原理進行理論性描述,未具體提供任何可用于直接進行攻擊實現的手段,目的是為了進行學習交流,請讀者們潔身自好,不要嘗試利用,以免誤入歧途。