DDOS淺談

  • 2019 年 10 月 3 日
  • 筆記

一、DDOS攻擊的來源

任何攻擊都不會憑空產生,DDOS也有特定的來源。絕大多數的DDOS攻擊都來自於殭屍網路。殭屍網路就是由數量龐大的可聯網殭屍主機組成,而殭屍主機可以是任何電子設備(不僅是X86架構的設備,更多反而是物聯網中的ARM架構設備),只要被植入殭屍程式即可!

殭屍網路有一個特點:控制者和殭屍主機之間存在一對多的關係,在控制者發布命令後就可以斷開與殭屍網路的連接,之後控制命令會在殭屍主機之間自行傳播和執行。

  殭屍網路架構一般有以下兩種:

    1、client—to—server型:

      client—to—server型殭屍網路是一種典型的星型拓撲,由若干殭屍主機和控制伺服器兩部分組成。

這種殭屍網路相對比較傳統,殭屍主機在被植入殭屍程式後會主動連接一個固定的地址(即控制伺服器),然後由控制伺服器進行集中管理。

      這類的殭屍網路控制相對較容易,而且能快速分發控制者的命令,但是這種控制方式也存在兩個重要的不足:

        ①、控制伺服器一旦故障則整張網路失效

        ②、從殭屍主機側可以查出控制伺服器的地址(容易被抓)

     P2P型:

相比client—to—server型P2P型就顯得略微複雜一些。在P2P型殭屍網路中充當控制伺服器的節點不再單一,而是每台殭屍主機既扮演控制伺服器的角色又扮演客戶端角色。這樣就解決了傳統client—to—server型殭屍網路控制伺服器單點故障的問題。當然,隨之而來的是更加複雜的網路拓撲維護演算法。

這種殭屍網路每台殭屍主機都有一張有限的鄰居表,並周期性的向其鄰居表內的主機發送keeplive包來維護整個殭屍網路。每台殭屍主機在被植入殭屍程式的時候會將上游的鄰居表一同植入,並將上游殭屍主機作為主下一跳,鄰居表內的其他主機作為備下一跳(主失效後備上位,確保網路不中斷),然後繼續感染其他主機,在成功感染下一台主機後將對自身鄰居表進行優化(將自身作為鄰居表中的一員,並隨機刪掉一個老鄰居)後傳遞給被感染主機,以此遞歸循環下去,最終構成一張龐大的殭屍網路。(學過網路的同學一定覺得這跟路由協議如出一轍)

那麼攻擊者是怎樣來控制這樣一張殭屍網路呢? 攻擊者只需要與這張網路中的任意一台殭屍主機進行通訊(一般需要經過認證)即可從此節點注入其控制命令,然後指令就如同蜻蜓點水的水波一樣向周圍擴散,直到擴散至這張網路的邊緣。當然,在殭屍主機收到指令後會先判斷該指令是否已經存在,如已存在則不處理(殭屍網路也需要防環)

站在監察者的角度來說,通過捕獲一個節點可以發現此殭屍網路的許多殭屍主機,但卻很難看到其全貌(這根繩子不知道捋到什麼時候算個頭)

 

二、DDOS攻擊類型:

  攻擊服務端的:

    1、攻擊頻寬型:

      ①、直接攻擊目標型:

      向目標發送大量數據包,以佔滿被攻擊者的頻寬,從而實現拒絕服務的目的。例:

        UDP洪水攻擊:

這是一種最簡單粗暴的方法,利用UDP協議直接向目標發送大量的數據包來堵塞對方頻寬。但是這種方法對自身要求也極高,屬於傷敵一千自損也一千的行為(假如對方頻寬10G,那自己這邊也需要10G的頻寬才可以)。

往往攻擊者在頻寬資源方面處於劣勢,這時他們就會想,有沒有可以以小博大的方法呢?有!那就是利用反射攻擊。。。即:自身發出1G的流量,經過反射器放大後變為10G甚至更大的流量!

反射攻擊的原理:

攻擊者使用殭屍主機向放大器發送大量請求數據包,這些數據包的特別之處在於源IP地址為被被攻擊目標的IP地址。反射器在收到數據包時會認為數據包是由攻擊目標所發來的請求,所以會將響應數據發送給攻擊目標。當大量的響應數據包發向攻擊目標時就會耗盡攻擊目標的網路頻寬,造成拒絕服務攻擊。

反射攻擊一般用來做放大攻擊使用,很多網路協議的請求和響應數據量差別很大(有的協議最大響應數據可以是請求數據的成百上千倍),反射放大攻擊也正是利用了這點,故反射器的放大倍數越大攻擊所產生的流量也就越大。

在互聯網上可以用來做反射器的設備很多,通常只需無需認證或握手就行。因為增加了一個反射步驟,所以更加難以溯源攻擊來源。

下面列舉一些比較常見的反射放大攻擊類型:

DNS反射攻擊

NTP反射攻擊

SNMP反射攻擊 

       ②、攻擊中間鏈路型:

攻擊鏈路型與攻擊目標型相比,最根本的區別在於攻擊的目標不同。攻擊鏈路型攻擊的目標不是作為互聯網端點的伺服器頻寬資源,而是骨幹網上的鏈路頻寬資源。當黑客將用戶到達目標伺服器中間的鏈路頻寬資源耗盡時,用戶的流量就不能正確轉發至目標伺服器了,從而造成拒絕服務工具。(不過這種攻擊有一個副作用,就是被攻擊骨幹網下游的所有伺服器都將受牽連。筆者所在公司就曾因為微博被打而誤傷)

 

 

    2、攻擊系統資源型:

很多雲安全廠商在宣傳時都會以“我們防住了XXXGB流量的DDOS攻擊”來描述攻擊的猛烈程度,這種宣傳方式容易讓人誤以為只有大流量才是DDOS。實際上是除了頻寬資源,DDOS攻擊還可以是消耗系統(比如CPU、記憶體、網路連接表等)。例如SYN洪水攻擊,很多時候人們容易把它認為是消耗頻寬型的DDOS攻擊,實則不然,它最大的危害在於消耗系統連接表資源。

在消耗系統資源型中大致可分為這麼三類:

①、消耗網路連接表型

  在TCP三次握手進行中,伺服器會創建並保存TCP連接的資訊,這個資訊通常被保存在連接表結構中。但是連接表的大小是有限的,linux默認一個埠最大支援1024個連接(可以通過ulimit -n來查看支援最大連接數),一旦伺服器的連接表滿了就無法再創建新的TCP連接了。

  此時,攻擊者就可以利用大量殭屍主機,通過建立大量惡意的TCP連接佔滿被攻擊目標的連接表,使目標無法接受新的TCP連接請求,從而達到拒絕服務的目的。

②、消耗記憶體型

在服務端優化了最大連接數後連接數將不再是瓶頸,但是每條連接總要佔用記憶體資源吧,這麼說來只要和目標建立足夠多的TCP連接就可以將目標設備記憶體佔滿了。但是有個前提,就是建立TCP連接後不能撒手。

相比其他洪水攻擊來講這種方式在速度上可以不用那麼快,不是一拳就把對方打到,而是在前面壓力不釋放的前提下一點一點的給對方累加壓力,直到到達對方的性能瓶頸為止。這種攻擊也俗稱:慢速DOS攻擊!

  面對web服務有這麼幾種常見的維持長鏈接手段:

1、將content-length設為一個較大的值,但是每次http body只緩慢的發送一個較小的值,這樣將一個大數據分多次且有間隔時間的發送就可延長和服務端的連接

2、攻擊者將自身的TCP窗口調為一個很小的值,這樣目標就會將一個較大的數據切成很小的塊分多次返回,以此來拖延傳輸時長

3、在http協議中規定,http頭部以連續的’rnrn’作為結束標誌,因此攻擊者可以一直不發’rnrn’好讓服務端以為客戶端的請求還沒發送完畢而處於等待狀態

  經典的慢速DOS攻擊工具:slowhttptest

③、消耗CPU型

在系統資源里還有最重要的一項資源,那就是cpu! 如果目標設備開啟的服務里有需要大量計算的地方那對於攻擊者來說將會是很大的誘惑。比如說你提供的服務有3項功能,其中一項明顯比另外兩項更加消耗cpu資源,那攻擊者就可以專挑你這個最耗cpu的功能來瘋狂使用,直至將你的cpu資源耗盡!

最常見的消耗cpu攻擊為ssl攻擊。在ssl協議握手過程中需要使用非對稱密鑰演算法進行加解密運算,而非對稱加解密運算又十分消耗cpu資源,所以ssl協議成了攻擊者實行DOS攻擊的樂土。攻擊者可以通過反覆不斷地進行ssl協商來耗盡目標cpu資源,以達到拒絕服務的目的

經典的SSL協商DOS攻擊工具:thc-ssl-dos

 

3、攻擊應用資源型:

  一些應用程式可能自身就存在拒絕服務漏洞,此時不用大量的殭屍主機,只需要使用一台設備向目標程式發送指定惡意程式碼就可使目標服務程式崩潰,以此達到拒絕服務攻擊的目的。

 

4、攻擊場景舉例(彩蛋!  站在攻擊者視角來進行一次DDOS攻擊,請勿用於實際環境):

①、DNS攻擊:

小明想讓某小區不能上網。但由於自己手頭頻寬資源有限,沒有能力來堵塞小區出口頻寬。於是小明就想,大家上網除了要使用網路外還需要什麼呢?對!DNS伺服器!而且小區用戶的DNS大多是使用DHCP的方式來獲取的,那就是說有很大概率他們用的是同一台伺服器,而且這台伺服器的地址很容易獲取到(假設這裡的DNS伺服器地址是1.1.1.1)。

現在被攻擊目標就確定了,只需要把這台DNS伺服器搞定就可以搞定一片用戶。那麼這台DNS伺服器該怎麼拿下呢? 滲透?一時半會兒恐怕搞不定。。。 社工?好像有點難度。。。 拒絕服務?好像可以琢磨琢磨。。。

小明想,DNS的正常業務邏輯是提供域名解析服務,那隻需要讓它超負荷工作就能起到拒絕服務攻擊的目的了呢。那怎麼才能讓它超負荷工作呢?正常情況下DNS伺服器收到一個查詢請求後先看是否能命中自己的快取,如果不命中才會向上級DNS進行查詢。。。就是這!DNS的快取機制緩解了它很大一部分壓力,我只需要讓它的快取機制失靈就可以增大它的壓力了!於是小明使用多台肉雞向該DNS伺服器瘋狂發送不同域名的解析請求,導致該DNS伺服器的快取不斷被刷新,而大量解析請求不能命中快取從而必須消耗額外的資源進行迭代查詢,最終導致這台DNS不堪重負不能及時處理正常的業務請求。

隨後小區居民紛紛向運營商投訴寬頻不給力,網太卡甚至網不通。(網路工程師們哭暈在廁所,又躺槍!)

 

②、WEB攻擊

小明這次又瞄上了某網站,為了讓用戶不能正常的訪問該網站小明真是撓破了頭,偵查了半個月也沒找到可以滲透的點。於是小明決定來個魚死網破,直接D它!

還是由於上面那個原因,小明這種個體戶手裡的頻寬資源比較有限,打大流量的DDOS不太現實。然後小明就想了,雖然我手裡的肉雞都比較“瘦”,但麻雀雖小五臟俱全啊,它再“瘦”也總有65535個埠吧! 打打慢連接攻擊消耗消耗目標設備的記憶體還是可以的嘛!

小明想,既然目標提供的是web服務,那隻需要和目標建立HTTP後不撒手就好了。在HTTP的頭部資訊中正好有一種頭部資訊可以用在這裡,那就是Content-Length。當web伺服器收到含有Content-Length的請求時,服務會將該欄位的值作為http請求包的body長度,利用這個特點就可以長時間與web伺服器保持連接。如果目標伺服器上新來的全是這種只握手不撒手的連接,那用不了多久服務端的記憶體資源就耗盡了。想到這裡小明還有有點小激動呢。。。

心動不如行動,於是小明將手裡肉雞的每個埠都儘可能的利用起來,向目標發送一個Conetent-Length為10000的POST請求,然後將POST body以非常緩慢的速度一個位元組一個位元組的向web伺服器發送。此時,目標伺服器需要一直維持與小明的連接來等待其數據傳輸結束。由於小明一台肉雞就可產生幾萬的並發,那麼沒用多少台肉雞就成功將目標伺服器記憶體撐滿(假設目標伺服器記憶體為32G,32G記憶體最大也就支援幾十萬並發),最終導致目標伺服器不能與新來的正常用戶建立連接。

  

  攻擊客戶端的:

在傳統概念里一般提到DDOS一般都是打服務端,其實不然,攻擊客戶端側也有類似的攻擊。比如說RST洪水攻擊!

在已經建立TCP握手的連接中,如果收到對方發來的RST置位的TCP包,該TCP連接將強制斷開。正是利用這點,攻擊者可以冒充客戶端來向服務端發送RST報文以打斷客戶端與服務端的連接,起到對客戶端拒絕服務的目的。但是想要讓服務端接受自己偽造的RST報文需要埠號和序列號都對得上才行。大多數環境下攻擊者又難以捕獲實際流量,此時攻擊者就可以利用大量殭屍主機冒充客戶端向服務端發送隨機的埠號和序列號組合來撞運氣,一旦撞對了該客戶端就將失去與服務端的連接關係。

 

 

三、DDOS的緩解方案

  DDOS這種攻擊現在誰也不能保證可以100%根治,只能是最大限度的緩解這種攻擊帶來的影響。常用的緩解DDOS手段有三種:

  1、CDN:

CDN技術的初衷其實是為了提高互聯網用戶對網站靜態資源的訪問速度。但由於其分散式的特點,用戶訪問過來的流量其實是分散在不同機房的。同樣的,它也能夠對分散式拒絕服務攻擊的流量產生稀釋分散作用。

其實CDN的本質就是在互聯網範圍內設置多個節點作為代理快取,並將用戶的訪問請求導向最近的快取節點,以減少網路訪問延遲的一種技術。

那用戶是怎麼就被導向最近的快取節點了呢?這個裡面就要用到DNS調度了。在DNS系統中,一個域名會對應一張IP地址表,當收到域名解析請求時,DNS會查看DNS請求的源IP地址,再根絕這個源IP地址來決定將域名解析解析至哪個CDN節點。當CDN節點收到用戶的請求時,首先在其快取內容中尋找用戶請求的資源,如果找到則直接返回給用戶;如果找不到,則CDN節點會作為代理伺服器向源站請求該資源,獲取資源後再將結果快取並返回給用戶。

根據這個原理,在發生DDOS時,DNS會將來自不同位置的攻擊流量分散到就近位置的CDN節點上,從而達到稀釋流量、緩解攻擊的效果。

不過這種方式也有兩個弱點: 1、如果攻擊者攻擊的不是域名,而是一個IP的話就沒轍了 2、這種技術只適用於靜態業務,對於動態業務就沒轍了(所以遊戲業務往往是DDOS的重災區)

  2、IP_Anycast

IP_Anycast是一種基於路由協議實現負載均衡的技術。在網路中部署多台IP地址相同的伺服器,並使用動態路由協議對外進行宣告,此時由於路由開銷原因對於請求報文會被網路路由到拓撲中最近的一台伺服器上去。

其實IP_Anycast本質上也是通過分散式部署來稀釋攻擊流量,從而達到緩解DDOS攻擊的效果

3、流量清洗系統

在市面上有這樣一種流量清洗系統,它一般由DDOS攻擊預警模組和DDOS攻擊清理集群兩部分組成。 攻擊預警模組負責攻擊發現,攻擊清理集群負責流量清洗。

流量清洗系統可以從全部的網路流量中區分出正常流量和惡意流量,然後將惡意流量丟棄,只將正常的流量交付給後端業務伺服器。

流量清洗系統部署方式:

在網路入口處部署一個分光器來將流量鏡像一份給DDOS攻擊預警模組,當攻擊預警模組發現攻擊流量時將進入機房內的流量牽引至DDOS攻擊清理集群進行流量清洗,清洗完後將乾淨流量再回注至後端業務伺服器

清理集群常用的惡意流量檢測方式有這麼幾種:

基於威脅情報的過濾:對數據包的源IP地址進行檢查,將其和威脅情報庫內的IP進行比對,如果存在於威脅情報庫則丟棄相應數據包。

特徵碼匹配:特徵碼分為靜態特徵碼和動態特徵碼。靜態特徵碼是與事先規定好的特徵碼進行比對;動態特徵碼是基於機器學習現場學習攻擊特徵。

速率檢查與限制:一些攻擊方法在數據包載荷上可能不存在明顯特徵,沒有辦法進行攻擊特徵匹配。這時就可以通過速率檢查來進行清洗了

協議完整性校驗:大多數攻擊往往只發送攻擊請求,而不接收伺服器響應數據,此時清理集群就可以代替後端業務伺服器向數據包的源IP地址進行應答,如果數據包的源IP沒有響應則認為該IP為攻擊者IP。

向客戶端發起挑戰:對於協議完整性校驗可以還有漏網之魚,這時可以主動向客戶端發送一個問題,需客戶端進行正確應答後方可通過,例如驗證碼等。