首頁>技術>

CDN 2021 完全攻擊指南 (二)中主要介紹了協議層管制下的放大攻擊和HPACK編碼攻擊,本篇文章是完結篇,將會介紹另外兩種擴充套件的攻擊手段。

基於HTTP慢速訪問的預請求攻擊

HTTP慢速攻擊(HTTP Slow Dos Attack)是針對應用層的拒絕服務攻擊,主要針對的協議為HTTP,攻擊相對DDOS來說,更加隱蔽和高效。

HTTP協議建立連線後會保持開啟狀態,直到資料接收完成為止,所以HTTP慢速攻擊利用了HTTP的合法機制,以極低的速度往伺服器傳送HTTP請求,同時長時間的保持連線不釋放。

若是達到了Web Server對於併發連線數的上限,同時惡意佔用的連線沒有被釋放,那麼伺服器端將無法接受新的請求,導致了拒絕服務,攻擊的成本非常低。

先來看一個簡單的GET請求:

我用burp發了一個簡單的GET請求,但是確什麼響應也沒有,Response直接卡住,這類問題其實平常大家測試時候肯定都有遇見過。

原因就是紅框中的 \r\n ,又稱為CRLF,在正常的HTTP資料包頭部,是以2個CRLF空紅標記表示結束的。

由於此次GET請求中,我的伺服器只收到了一個 \r\n 標記,因此將認為HTTP請求頭部分沒有結束,並保持此連線不釋放,繼續等待我傳遞完整的請求。

此時輸入回車,再發送資料包,就可以正常得到響應了,因為用2個CRLF標記表示當前請求的HTTP頭已經結束,body為空,伺服器正常處理。

那麼當我們作為客戶端傳送一個HTTP請求,故意只構造一個 CRLF 標記,剩下的內容分為10s傳送一次,那麼伺服器需要一直等待客戶端最後的的 CRLF 標記通知,然後才能解析這個報文。

那麼併發呢?我們透過程式或者指令碼併發傳送更多的這樣的請求,那麼伺服器會給客戶端預留處更多的系統資源來等待和處理一直未傳送完成的報文。

假設伺服器的最大連線數是100個,我們使用指令碼併發先連線上100次伺服器,並且報頭部connection欄位啟用Keep-Alive,那麼其他正常的使用者就無法正常訪問網站了。

實際測試中我們使用 SlowHTTPTest,SlowHTTPTest 是一個可配置的應用層拒絕服務攻擊測試工具,它可以工作在Linux,OSX和Cygwin環境以及Windows命令列介面,可以幫助安全測試人員檢驗伺服器對慢速攻擊的處理能力。

這裡選擇手動構建、原始碼安裝,因為簽名和源的問題可能導致直接 apt-get install 安裝產生問題。

安裝 openssl 和 libssl-dev 依賴:

sudo apt-get install opensslsudo apt-get install libssl-dev

克隆 SlowHTTPTest 專案到本地:

git clone https://github.com/shekyan/slowhttptest

配置和安裝:

# ./configure # make && make install

這樣我們就原始碼構建好了,然後看是否正常啟動:

檢視幫助:

幫助說明裡面告訴我們,攻擊的型別支援 Slowloris 、Slow body 和 Slow read 三種,下面分別介紹。

Slowloris

針對於HTTP請求頭部的慢速攻擊,前面已經講到過並舉例,透過畸形的 CRLF 標記對請求進行長時間連線。

# slowhttptest -c 1000 -H  -i 10 -r 100 -s 4096 -t GET -u http://xxx.com -p 3 -x 10 -g -o Attack_status

解釋一下引數:

-c : 指定連線數-H : 攻擊型別為 Slowloris-i : 傳送資料間隔-r : 連線速率-s : 指定 Content-legth 大小-t : 使用的請求型別-u : 目標網站-p : 響應超時時間-x : 每次傳送的最大資料長度-g : 生成統計報告-o : 輸出報告檔案

執行後可以看到,幾秒鐘後web伺服器的連線池就被佔滿無法訪問,當前連線數為996,目標伺服器服務已不可用:

Slow body

該攻擊會構造一個POST資料包,將資料緩慢傳輸,使伺服器端一直等待接收報文。

slowhttptest -c 1000 -B -i 110 -r 100 -s 8192 -t GET -u http://xxx.com -x 10 -p 3 -g -o Attack_status.html

-B 參說明啟用Slow Http Post模式傳送未完成的HTTP訊息體。

Slow read

Slow read 會在Web伺服器響應內容傳輸回來的時候,客戶端緩慢的讀取響應報文,就是慢速讀取web伺服器傳輸過來的資料,如果攻擊者將window size置為一個特別小的值,但是卻又請求一個特別大的資源,那麼伺服器就會與這個連線進行長時間通訊,如果建立的連線數足夠大就會佔滿web伺服器的連線池。

當web伺服器緩衝區未傳送的資源堆積過多時還會導致緩衝區溢位,也無法響應其他請求。

slowhttptest -c 1000 -X -r 100  -w 512 -y 1024 -n 5 -z 32 -k 3 -u http:// -p 3 -g -o Attack_status.html

其中:

-X : 使用Slow Read attack模式,緩慢讀取HTTP響應請求; -w -y : 指定window size大小-n : 指定讀取資料的間隔;-z : 指定每次從接收資料的緩衝區中讀取資料的長度 -k : 在同一連線中重複請求的次數

在HTTP /1.x 中,這種攻擊的損耗比為 1:1,於是可以採用 HTTP2 複用 http 流來實現減少損耗比,達成放大攻擊。

基於全球訪問的出口阻斷攻擊

這種攻擊源於CDN設計中的一種特性Shield,設想如下場景:

當多個地區的客戶端請求後端伺服器新的未被快取的資源時,CDN會將請求分發到不同的節點,不同節點的 CDN 再去請求伺服器,這樣在大量客戶端訪問時,這樣的設計是不合理的,很容易造成伺服器癱瘓。

於是CDN廠商使用了Shield,進行了入口/出口的IP分配機制,來提供資源利用率和減少連線汙染:

將請求流量統一整理,交由CDN廠商的Shield再去請求後端伺服器獲取資源,一下子就減小了對伺服器的請求壓力。

那麼 入口/出口 IP 是否存在一些通用的規律呢,可以見下表統計:

不難發現,大多數CDN廠商的入口 IP 數量遠遠大於出口 IP 數量,並且在同一個時間區段內,超過90%以上的出口 IP 是同一個,那麼現在只需要攻擊出口 IP 的 CDN 節點,即可實現出口阻斷攻擊,將造成單位時間區域內,全球客戶端無法訪問該節點保護的伺服器群。

實際的攻擊案例如圖:

當全球不同地區的客戶透過CDN Shield請求國內的目標伺服器時,在單位時間內,Shield節點的 IP 地址大多數是一樣的。

此時攻擊者透過提交敏感的封禁關鍵詞請求,因為請求國內的網站需要經過 GFW 防火牆,此時觸發了規則,GFW 直接封禁該出口 IP,導致其他客戶的訪問出口也被鎖死,因此無法訪問目標伺服器。

(完)

8
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 乾貨丨金倉JDBC讀寫分離介紹和最佳實踐