一. 什么是 DoS & DDoS ?
拒絕服務攻擊(Denial-of-Service Attack)亦稱洪水攻擊,是一種網絡攻擊手法,其目的在於使目標電腦的網絡或系統資源耗盡,使服務暫時中斷或停止,導致其正常用戶無法訪問。
分布式拒絕服務攻擊(Distributed Denial-of-Service Attack),是使用網絡上兩個或兩個以上被攻陷的電腦作為 “僵屍” 向特定的目標發動 “拒絕服務” 式攻擊。
二. 常見類型及攻擊原理
(1)被攻擊特征
受害主機在 DDoS 攻擊下,明顯特征就是大量的不明數據報文流向受害主機,受害主機的網絡接入帶寬被耗盡,或者受害主機的系統資源(存儲資源和計算資源)被大量占用,甚至發生死機。前者可稱為帶寬消耗攻擊,后者稱為系統資源消耗攻擊。兩者可能單獨發生,也可能同時發生。
DDOS按拒絕對象可以分為:帶寬消耗型攻擊、資源消耗型攻擊。

從協議層次划分:
| OSI 層級 | 攻擊內容 |
| Network Based (2-4層) | IP Fragment |
| Tear Drop | |
| SYN Flood (Dirt Jumper) | |
| TCP (connection) Flood | |
| e.g. SYN-ACK, ACK & PUSH-ACK, RST or FIN and Fragmented ACK | |
| Christmas Tree | |
| Fake Session | |
| LAND | |
| Redirect Traffic Attack | |
| ICMP Flood, Ping Floods and SMURF Attacks | |
| Ping of Death ICMP | |
| DNS based (4層) | UDP Flood |
| UDP Fragment | |
| DNS Flood (Distributed and DNS Blacklisting) | |
| e.g. DNS UDP Flood, DNS Query Flood and DNS NXDOMAIN Flood | |
| SSL/TLS based (5–6層) | SSL Floods, Malformed SSL (e.g. empty SSL HELLO) |
| SSL THC attack (Extending from SSL Renegotiation vulnerability) | |
| Application based (6–7層) | Slowloris (Nuclear DDoSer, Slowhttptest) |
| Keep-Dead | |
| Slow POST (R-U-Dead-Yet, Tor Hammer, Nuclear DDoSer, Slowhttptest) | |
| HashDoS | |
| Apache Killer (Slowhttptest) | |
| HTTP GET Flood, Recursive GET Flood (Web Scraping), Dirt Jumper (HTTP Flood) | |
| #RefRef (exploit SQLi - OWASP Top 10 vulnerability as entry) | |
| XML “Bomb” (DTD attack), XML External Entity DoS |
(2)下面簡單介紹一些常見的DDOS攻擊類型:
普通DDOS
普通拒絕服務攻擊是指一些傳統的攻擊方式,如SYN FLOOD攻擊、ACK FLOOD攻擊、CC攻擊、UDP FLOOD攻擊等等。
新型DDOS
Websocket、臨時透鏡、慢速DDOS、ReDOS
1. SYN FLOOD攻擊
SYN FLOOD攻擊是利用TCP協議的一些特性發動的,通過發送大量偽造的帶有SYN標志位的TCP報文使目標服務器連接耗盡,達到拒絕服務的目的。要想理解SYN FLOOD的攻擊原理必須要先了解TCP協議建立連接的機制。SYN FLOOD攻擊就是在三次握手機制的基礎上實現的。攻擊者通過偽造IP報文,在IP報文的原地址字段隨機填入偽造的IP地址,目的地址填入要攻擊的服務器IP地址,TTL、Source Port等隨機填入合理數據,TCP的目的端口填入目的服務器開放的端口,如80、8080等,SYN標志位置1。然后不停循環將偽造好的數據包發送到目的服務器。
2. ACK FLOOD攻擊
ACK FLOOD攻擊同樣是利用TCP三次握手的缺陷實現的攻擊,ACK FLOOD攻擊利用的是三次握手的第二段,也就是TCP標志位SYN和ACK都置1,攻擊主機偽造海量的虛假ACK包發送給目標主機,目標主機每收到一個帶有ACK標志位的數據包時,都會去自己的TCP連接表中查看有沒有與ACK的發送者建立連接,如果有則發送三次握手的第三段ACK+SEQ完成三次握手建立TCP連接;如果沒有則發送ACK+RST斷開連接。但是在這個過程中會消耗一定的CUP計算資源,如果瞬間收到海量的SYN+ACK數據包將會消耗大量的CPU資源使得正常的連接無法建立或者增加延遲,甚至造成服務器癱瘓、死機。
3. UDP FLOOD攻擊
UDP FLOOD攻擊顧名思義是利用UDP協議進行攻擊的,UDP FLOOD攻擊可以是小數據包沖擊設備也可以是大數據包阻塞鏈路占盡帶寬。不過兩種方式的實現很相似,差別就在UDP的數據部分帶有多少數據。相比TCP FLOOD攻擊,UDP FLOOD攻擊更直接更好理解,有一定規模之后更難防御,因為UDP攻擊的特點就是打出很高的流量,一個中小型的網站出口帶寬可能不足1G,如果遇到10G左右的UDP FLOOD攻擊,單憑企業自身是無論如何也防御不住的,必須需要運營商幫你在上游清洗流量才行,如果遇到100G的流量可能地方的運營商都沒有能力清洗了,需要把流量分散到全國清洗。UDP FLOOD攻擊就像是一塊大石頭,看着普普通通的好像跟現代機槍炸彈不是一個等級的武器,但是如果石頭足夠大,就不一樣了。
4. CC攻擊
CC攻擊全稱Challenge Collapsar,中文意思是挑戰黑洞,因為以前的抗DDOS攻擊的安全設備叫黑洞,顧名思義挑戰黑洞就是說黑洞拿這種攻擊沒辦法,新一代的抗DDOS設備已經改名為ADS(Anti-DDoS System),基本上已經可以完美的抵御CC攻擊了。CC攻擊的原理是通過代理服務器或者大量肉雞模擬多個用戶訪問目標網站的動態頁面,制造大量的后台數據庫查詢動作,消耗目標CPU資源,造成拒絕服務。我們都知道網站的頁面有靜態和動態之分,動態網頁是需要與后台數據庫進行交互的,比如一些論壇用戶登錄的時候需要去數據庫查詢你的等級、權限等等,當你留言的時候又需要查詢權限、同步數據等等,這就消耗很多CPU資源,造成靜態網頁能打開,但是需要和數據庫交互的動態網頁打開慢或者無法打開的現象。這種攻擊方式相對於前兩種實現要相對復雜一些,但是防御起來要簡單的多,提供服務的企業只要盡量少用動態網頁並且讓一些操作提供驗證碼就能抵御一般的CC攻擊。
5. 反射DDOS
很多協議的請求包要遠小於回復包,以一個字節的數據換十個字節的數據回來這就是一種放大,但是你這單純的放大攻擊的是自己,所以說想要攻擊別人就要在發送請求包時把源地址寫成要攻擊的人的地址,這樣回復的大字節報文就去你要攻擊的人那里了。
這里放大主要利用的是NTP的monlist(listpeers也行)、DNS的AXFR(ANY也行)、SNMP的getbulkrequest。
monlist是返回最近600個與當前NTP服務器通信過的IP地址;
AXFR是區域傳送(有地方叫域傳送),比如freebuf.com下的所有域名返回給請求者;
SNMPV2版本中新加的getbulkrequest用於一次請求大量的信息,減少管理站與被管理設備的交互次數。
6. Websocket
websocket是HTML5一種新的協議,它實現了瀏覽器與服務器全雙工通信(full-duple)。目前主流的瀏覽器都能很好地支持websocket,而且用它實現DOS攻擊也並不是很難,只要在js代碼中寫入相應的代碼,當人們打開這個網頁時瀏覽器會自動執行js代碼去請求連接要攻擊的IP地址。
7. 臨時透鏡
這種攻擊是一種典型的通過時間延時進行流量放大攻擊的方法。如果攻擊者可以控制多個時間段的多個數據包,讓它們同時到達目標,這樣就能使流量瞬間到達一個峰值,對目標造成很大危害。這個攻擊方式道理不難理解,但是實現起來可是不容易,要讓相同源和目的IP的IP報文走不同的路徑到達目的地,這一點就是要實現臨時透鏡攻擊的關鍵所在,我國的互聯網基本上是由四張網(電信、聯通、移動、教育網)通過互聯互通組成的,任意兩點之間的路徑都能有千千萬萬條,但是怎么才能有我們自己控制報文的路線呢?我想到的第一個辦法就是用IP協議的寬松源路由選項,學過或者平時比較了解TCP/IP的童鞋們可能聽說過這個寬松源路由,但我估計很少有人用。IP數據在傳輸時通常由路由器自動為其選擇路由,但是網絡工程師為了使數據繞開出錯網絡或者為了測試特定線路的吞吐率,需要在信源出控制IP數據報的傳輸路徑,源路由就是為了滿足這個要求設計的。源路由有兩種,一種叫嚴格源路由另一種就是我們要說的寬松源路由。IP選項部分可以最多帶上9個IP地址作為這個數據報要走的路徑,嚴格源路由是每一跳都必須按照指定的路由器去走,但是寬松源路由的不用這么嚴格。我國大部分運營商都禁止了源路由,不過有人說在國外不禁止源路由,國外有服務器的朋友可以去測試一下是不是真的。
8. 慢速DDOS
一說起慢速攻擊,就要談談它的成名歷史了。HTTP Post慢速DoS攻擊第一次在技術社區被正式披露是2012年的OWASP大會上,由Wong Onn Chee和Tom Brennan共同演示了使用這一技術攻擊的威力。對任何一個開放了HTTP訪問的服務器HTTP服務器,先建立了一個連接,指定一個比較大的content-length,然后以非常低的速度發包,比如1-10s發一個字節,然后維持住這個連接不斷開。如果客戶端持續建立這樣的連接,那么服務器上可用的連接將一點一點被占滿,從而導致拒絕服務。和CC攻擊一樣,只要Web服務器開放了Web服務,那么它就可以是一個靶子,HTTP協議在接收到request之前是不對請求內容作校驗的,所以即使你的Web應用沒有可用的form表單,這個攻擊一樣有效。在客戶端以單線程方式建立較大數量的無用連接,並保持持續發包的代價非常的低廉。實際試驗中一台普通PC可以建立的連接在3000個以上。這對一台普通的Web server將是致命的打擊。更不用說結合肉雞群做分布式DoS了。鑒於此攻擊簡單的利用程度、拒絕服務的后果、帶有逃逸特性的攻擊方式,這類攻擊一炮而紅,成為眾多攻擊者的研究和利用對象。發展到今天,慢速攻擊也多種多樣。
9. ReDoS
ReDoS(Regular expression Denial of Service)正則表達式拒絕服務攻擊。開發人員使用了正則表達式來對用戶輸入的數據進行有效性校驗,當編寫校驗的正則表達式存在缺陷或者不嚴謹時, 攻擊者可以構造特殊的字符串來大量消耗服務器的系統資源,造成服務器的服務中斷或停止。
正則表達式引擎分成兩類,一類稱為DFA(確定性有限狀態自動機),另一類稱為NFA(非確定性有限狀態自動機)。兩類引擎要順利工作,都必須有一個正則式和一個文本串,一個捏在手里,一個吃下去。DFA捏着文本串去比較正則式,看到一個子正則式,就把可能的匹配串全標注出來,然后再看正則式的下一個部分,根據新的匹配結果更新標注。而NFA是捏着正則式去比文本,吃掉一個字符,就把它跟正則式比較,然后接着往下干。一旦不匹配,就把剛吃的這個字符吐出來,一個一個吐,直到回到上一次匹配的地方。
參考文章
http://blog.csdn.net/qq_32400847/article/details/63262965
http://361531.blog.51cto.com/351531/1035717/
