slowhttptest的幾種慢***DOS原理

 slowhttptest是一款對服務器進行慢***的測試軟件,所謂的慢***就是相對於cc或者ddos的快而言的,並不是只有量大速度快才能把服務器搞掛,使用慢***有時候也能到達同一效果。slowhttptest包含了之前幾種慢***的***方式,包括slowloris, Slow HTTP POST, Slow Read attack等。那麼這些慢***工具的原理就是想辦法讓服務器等待,當服務器在保持連接等待時,自然就消耗了資源。

slowhttptest

slowloris

slowloris的***方式說起來類似於基於HTTP協議的SYN Flood,但是影響的範圍要小得多,比如同一個服務器上的兩個Apache服務,可能一個給搞掛了,另一個還是正常運行。舉個例子,在進行***時,***者發送這樣的請求到服務器:

GET / HTTP/1.1\r\n
Host: Victim host\r\n
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n
Content-Length: 42\r\n

完整的http請求結尾應該是兩次的\r\n\r\n,因此這裏少了一次,服務器將會一直等待,隔一段時間之後,再發送一個

X-a: b\r\n

這時服務器都要崩潰了,心中萬千草泥馬呼嘯喝過,你這是鬧哪樣啊!!

上面只是提到的一個簡單的例子,影響的服務器比較多,不過都是幾年前的事情了,現在應該很多都進行了修復。官網公佈的受影響的Web服務器程序有:

  • Apache 1.x
  • Apache 2.x
  • dhttpd
  • GoAhead WebServer
  • WebSense “block pages” (unconfirmed)
  • Trapeze Wireless Web Portal (unconfirmed)
  • Verizon’s MI424-WR FIOS Cable modem (unconfirmed)
  • Verizon’s Motorola Set-Top Box (port 8082 and requires auth – unconfirmed)
  • BeeWare WAF (unconfirmed)
  • Deny All WAF (unconfirmed)

 

Slow HTTP POST

這種***方式與前一種有類似的原理,在POST提交方式中,允許在HTTP的頭中聲明content-length,也就是POST內容的長度。

在提交了頭以後,將後面的body部分卡住不發送,這時服務器在接受了POST長度以後,就會等待客戶端發送POST的內容,***者保持連接並且以10S-100S一個字節的速度去發送,就達到了消耗資源的效果,因此不斷地增加這樣的鏈接,就會使得服務器的資源被消耗,最後可能宕機,但是可能對很多Web服務器程序已經失效了。

 

Slow Read attack

Slow Read attack採用的***方式是採用調整TCP協議中的滑動窗口大小,來對服務器單次發送發送的數據大小進行控制,使得服務器需要對一個迴應分成很多個包來發送。

例如構造一個這樣的請求

GET /img/delivery.png HTTP/1.1
Host: victim
User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.7.0; U; Edition MacAppStore; en) Presto/2.9.168 Version/11.50

然後得到服務器的迴應

HTTP/1.1 200 OK
Date: Mon, 19 Dec 2011 00:12:28 GMT
Server: Apache
Last-Modified: Thu, 08 Dec 2011 15:29:54 GMT
Accept-Ranges: bytes
Content-Length: 24523
Content-Type: image/png
?PNG

同時我們抓包得到的結果如下

09:06:02.088947 IP attacker.63643 > victim.http: Flags [S], seq 3550589098, win 65535, options [mss 1460,nop,wscale 1,nop,nop,TS val 796586772 ecr 0,sackOK,eol], length 0
09:06:02.460622 IP victim.http > attacker.63643: Flags [S.], seq 1257718537, ack 3550589099, win 5792, options [mss 1460,sackOK,TS val 595199695 ecr 796586772,nop,wscale 6], length 0
09:06:02.460682 IP attacker.63643 > victim.http: Flags [.], ack 1, win 33304, length 0
09:06:02.460705 IP attacker.63643 > victim.http: Flags [P.], seq 1:219, ack 1, win 33304, length 218
09:06:02.750771 IP victim.http > attacker.63643: Flags [.], ack 219, win 108, length 0
09:06:02.762162 IP victim.http > attacker.63643: Flags [.], seq 1:1449, ack 219, win 108, length 1448
09:06:02.762766 IP victim.http > attacker.63643: Flags [.], seq 1449:2897, ack 219, win 108, length 1448
09:06:02.762799 IP attacker.63643 > victim.http: Flags [.], ack 2897, win 31856, length 0
...
...
09:06:03.611022 IP victim.http > attacker.63643: Flags [P.], seq 24617:24738, ack 219, win 108, length 121
09:06:03.611072 IP attacker.63643 > victim.http: Flags [.], ack 24738, win 20935, length 0
09:06:07.757014 IP victim.http > attacker.63643: Flags [F.], seq 24738, ack 219, win 108, length 0
09:06:07.757085 IP attacker.63643 > victim.http: Flags [.], ack 24739, win 20935, length 0
09:09:54.891068 IP attacker.63864 > victim.http: Flags [S], seq 2051163643, win 65535, length 0

這是一次普通的請求和迴應,看起來非常正常,TCP的三次握手,然後傳送數據然後斷開。如果我們把TCP的滑動窗口,也就是win的值人爲地調小呢,看看結果,在同樣的請求同樣的迴應下。

13:37:48.371939 IP attacker.64939 > victim.http: Flags [S], seq 1545687125, win 28, options [mss 1460,nop,wscale 0,nop,nop,TS val 803763521 ecr 0,sackOK,eol], length 0
13:37:48.597488 IP victim.http > attacker.64939: Flags [S.], seq 3546812065, ack 1545687126, win 5792, options [mss 1460,sackOK,TS val 611508957 ecr 803763521,nop,wscale 6], length 0
13:37:48.597542 IP attacker.64939 > victim.http: Flags [.], ack 1, win 28, options [nop,nop,TS val 803763742 ecr 611508957], length 0
13:37:48.597574 IP attacker.64939 > victim.http: Flags [P.], seq 1:236, ack 1, win 28, length 235
13:37:48.820346 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:37:49.896830 IP victim.http > attacker.64939: Flags [P.], seq 1:29, ack 236, win 98, length 28
13:37:49.896901 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:37:51.119826 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:37:51.119889 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:37:55.221629 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:37:55.221649 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:37:59.529502 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:37:59.529573 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:38:07.799075 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:38:07.799142 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:38:24.122070 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:38:24.122133 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:38:56.867099 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:38:56.867157 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:40:01.518180 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:40:01.518222 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:42:01.708150 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:42:01.708210 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:44:01.891431 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:44:01.891502 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:46:02.071285 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:46:02.071347 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:48:02.252999 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:48:02.253074 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0
13:50:02.436965 IP victim.http > attacker.64939: Flags [.], ack 236, win 98, length 0
13:50:02.437010 IP attacker.64939 > victim.http: Flags [.], ack 29, win 0, length 0

在人爲調小窗口值以後,服務器只能根據窗口值,擠牙膏似地一點一點地把數據擠出來,然後***者一直跟服務器說,我收不到我收不到我收不到。。直到最後超時。

但是這種做法無法消耗服務器的資源,因爲在把數據放到socket的緩存裏面後,服務器就去處理其他東西了,就好像把豆子一把倒進了漏斗裏面,讓它自己慢慢漏下去,快慢也就不理會了。

要做到DOS的效果,我們就要使得系統不停地等等待漏斗裏面的豆子下去再往裏面加,使得系統無法抽身離開,達到消耗系統資源的目的。

那麼達到DOS的條件就簡單了:

1.把TCP窗口調節得比服務器的發送緩存小,服務器socket默認緩存大概是65Kb到128Kb,從而形成一個漏斗的效果,發送緩慢。
2.我們需要服務器返回的數據比服務器的socket緩存大,這樣服務器就無法一下把數據放進去了,好比豆子比漏斗的容量多,要在旁邊等豆子少了繼續倒,從而消耗了資源。

尋找web服務器大文件

要做到第二點,我們必須要找到一個比較大的資源,比如大一點的頁面資源等。如果沒有找到,但是服務器支持HTTP_pipelining的話,可以採用在同一鏈接中多次請求同一資源的方法來增大返回內容的大小。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章