SlowHTTPTest筆記-1


以下內容僅為研究請勿隨意攻擊他人伺服器

安裝

sudo apt-get install slowhttptest -y

簡介

slowhttptest是一種利用L7 HTTP Protocol進行DoS的測試工具,主要有三種攻擊模式(外加一種針對舊版Apache)分別是

  • slow headers (Sloworis)
  • slow body (R-U-Dead-Yet)
  • slow read (Slow Read)
  • Apache attack, range attack (Apache Killer)

在預設模式中sloworis主要是利用RFC規範中request header連續兩個換行符號(CRLF) \r\n\r\n =0x0d 0x0a 0x0d 0x0a 代表請求結束的特點,故意不連續傳送兩個換行符號使得HTTP Server被占用連線資源,藉此將HTTP Server的資源耗盡

正常連線會是連續兩個換行符號做結尾如下圖

使用slowhttptest預設模式攻擊可以看到攻擊封包僅會傳遞一個換行符號作為封包結尾,故意占用被害者HTTP Server的資源

Reqtimeout Module

mod_reqtimeout 是Apache預設模組之一,主要功能是讓我們去限制接收的Request可以容許之Timeout時間以及最小的傳輸速率,減緩因連線緩慢或者惡意攻擊者刻意攻擊伺服器造成的資源耗費。

我們可以從/etc/apache2/mods-availabe/reqtimeout.conf 設定檔中看到對於該設定參數的描述對其進行了解或者去官網查閱相關描述。若要確認是否已經載入使用則可以使用apachectl -t -D DUMP_MODULES去察看目前載入的Apache模組。

mod_reqtimeout 設定主要可以使用以下幾種組合

  • header=<sec>
  • header=<sec>,MinRate=<Bytes/sec>
  • body=<sec>
  • body=<sec>,MinRate=<Bytes/sec>
  • header=<sec> body=<sec>
  • header=<sec> body=<sec>,MinRate=<Bytes/sec>
  • header=<sec>,MinRate=<Bytes/sec> body=<sec>
  • header=<sec>,MinRate=<Bytes/sec> body=<sec>,MinRate=<Bytes/sec>

例外還有針對TLS連線的參數 handshake可以使用

基本概念是可以針對超過指定時間內未將http request header以及body傳輸完畢的連線進行阻擋並將資源釋放,當有設定大於多少傳輸速率 (MinRate) 時,他的含意是大於多少傳輸速率會將對應的值 (header or body) Timeout時間增加1,因此就有兩種可能的組合

  1. header=5,MinRate=500
  2. header=5-20,MinRate=500

第一種代表的是限制為速率未超過 500bytes/sec 的http request會在5秒鐘後被apache server回傳408 Request Timeout結束如下圖

然而如果該request不停地傳送封包讓速率大於 500bytes/sec,那就會在每一秒接收到超過該速率時將Timeout時間加1秒

第二種則代表即使傳送封包速率大於 500bytes/sec 仍會在加到20秒 (T1+20) 後回傳408 Request Timeout

攻防模擬

以下環境是在Ubuntu 20.04 LTS 使用Apache的預設設定進行,攻擊機IP:192.168.0.25、主機IP:192.168.0.27, Server version: Apache/2.4.41 (Ubuntu)

Slowloris

範例一

使用HTTP GET每秒建立10條連線 (每10秒會送封包維持連線) 共1000條連線,並使用apache-default當檔名建立統計資料 (.html以及.csv) 且在超過三秒沒收到server response認定apache server被DoS成功

slowhttptest -c 1000 -H -i 10 -r 10 -g -o apache-default -t GET -u  http://192.168.0.27 -p 3

可以看見攻擊機 (192.168.0.25) 送出第一個PAH, ACK (HTTP GET)封包後會間格每10秒送出下一個封包

測試結果可以從產生的CSV以及HTML檔案中看到在第18秒後HTTP Server就掛掉了

對於設定簡單的slowloris 攻擊我們可以通過在相關apache設定檔下加入以下設定後,使用 apache2ctl restart 重啟Apache 利用reqtimeout module去有效的減緩攻擊

  • Ubuntu 20.04 LTS 中apache的設定檔在/etc/apache2/apache2.conf
  • 使用apache2ctl -X 可以測試config正確性
  • a2enmod以及a2dismod分別可以載入以及卸載模組

重新使用測試指令可以發現此次攻擊成功被阻擋,在測試過程中的240秒內都是維持可使用的。相關阻擋成功資訊可以從 /var/log/apache2/access.log 看到status code 408 即可確認

範例二

從前面介紹reqtimeout module中可以看到兩種有使用Minrate類型的設定,針對設定中使用Minrate來增加彈性的apache server,克制手法是將傳輸速率提高到超過mod_reqtimeout內Minrate速率就可以讓連線占用時間增長。下面攻擊指令將每個連線傳送封包時間縮短到1秒並將傳送的header payload增加,達到成功延長連線占用的功效

slowhttptest -c 1000 -H -i 1 -x 512 -r 10  -g -o apache-reqtimeout_module_2 -t GET -u  http://192.168.0.27 -p 3

從下面結果可以看到使用範例一reqtimeout的設定可以成功利用slowloris將apache連線占滿,每條連線皆被占用20秒才被釋放

假如reqtimeout module header有設定Minrate但沒有設定sec range 進行測試

則可從圖形看到它並非在我們設定header要在5秒內傳完,這主要是因為有設定Minrate卻沒設定增加的最長Timeout時間,因此可以長時間占用連線。打開側錄的封包可以進一步判斷連線被中斷的理由為傳送到最後超過了正常apache可以接受封包內容才被釋放

小節

使用reqtimeout module可以有效地減緩較不複雜的Slowloris攻擊,但必須注意的是相關設定如果需使用Minrate則必須在對應的值上設定範圍,否則仍可以透過增大攻擊封包來躲過緩解,較複雜的攻擊則需搭配其餘的方案進行緩解如引入qos_module。

#dos #slowhttptest #apache







你可能感興趣的文章

Codewars Kyu 4 Python 3

Codewars Kyu 4 Python 3

Day 151

Day 151

[JS] 陳述式(Statement)與表達式(Expression)

[JS] 陳述式(Statement)與表達式(Expression)






留言討論