2013年10月27日 星期日

WWW 阻斷服務攻擊 (1)

前言

我在這裡想寫的,是只需很少的網路流量,或者是只需要一台筆電,就可以將硬體配備相對高檔很多的伺服器,弄到無法回應的技術。一般阻斷服務攻擊主要有兩種,一種是目前認為比較常見的分散式阻斷服務攻擊 (DDoS),通常是利用許多台電腦,以及許多的網路資源,可能是殭屍網路,眾多電腦同時連線到一個特定目標,擠爆該目標的網路頻寬或者伺服器資源,有點像是動員一堆人,一起站在一家店門口,只要人數夠多,把店門口佔滿,這樣原本要到那家店去消費的客人,就根本擠不進去了。所謂分散式,就是說攻擊的電腦分散在網際網路上,不是只有單一台電腦發動攻擊而已。

另外一種的攻擊,稱為阻斷服務攻擊 (DoS),和分散式不同的地方,其實可以望文生義,也就是通常並沒有像分散式攻擊這麼多台電腦,這麼多的網路資源。這種攻擊的手法,反而是利用對方弱點,在沒有擠爆對方店門口的情況下,同樣讓一般正常消費的客人,無法達到消費的目的。舉例來說,去速食店點餐,原本點好了餐,又一直改一直改,以至於後面大排長龍,抓準了店員不好意思趕你走的弱點,因此能夠淋漓盡致發揮這項弱點的人,可能需要很ㄏㄨㄢ又毫不在意臉皮的大叔(或大嬸?)來執行,假設速食店有三個點餐窗口,我只需要派三個這樣的大叔去點餐,就可以讓一家速食店幾十分鐘無法正常做生意(咦?)。

總而言之,阻斷服務攻擊的重點,在於找到對方的軟肋,用極少的資源去戳那個軟肋,讓對方無法正常服務,就算是攻擊成功了。這也就是我這篇文章的主題,本篇只針對 WWW 服務作討論。

WWW 服務主要透過 HTTP 協定運作,HTTP 協定基本上是由使用者先送出 request,等到 request 完全送出後,也就是送出 \r\n\r\n 字串後,伺服器根據 request 的內容,送回 response。
如果 request 一直沒送完,或者傳輸速度非常慢,則伺服器會一直保持著所需要回應使用者的狀態,預備著一定量的資源,耐心地等待,而當連線數目一多,預備的資源量也越多,伺服器就可能會變得不穩定,或者完全停止服務。

或者另外一種情況,使用者很快地送出了 request,而當伺服器送出 response 後,使用者因為必須花費相當久的時間,才能夠完整接收所有的 response,而在這一段時間內,伺服器也必須一直保持著傳送的狀態,預備著需要送出的資源,當連線數目一多,伺服器也同樣可能變得不穩定,或者完全停止服務。

所以原則上,這裡談論的 WWW 阻斷服務攻擊,總共有兩種策略,一種是在攻擊者送出許多的 request 給伺服器,同時保持許多的連線,但是每一個連線中,送出完整 request 的速度卻極慢,導致伺服器需要預備過多的資源,並且造成不穩定的狀態;另一種則是攻擊者同樣送出許多連線到伺服器端,但是接收 response 的時候,每次只接收一點點,導致需要非常久的時間才能夠完成整個程序,在過程中伺服器因為必須預備過多的資源,導致不穩定或者當機。

其中,第一種攻擊策略又可以細分為兩種不同的手法,第一是很慢地送出 HTTP header 資訊,第二則是很慢地送出 HTTP body 資訊。有些時候要視狀況才知道,哪一種攻擊手法對伺服器是有效的。以上,整理如下:
  • 很慢地送出 HTTP request header,以下稱此手法為 request header
  • 很慢地送出 HTTP request body,以下稱此手法為 request body
  • 很慢地接收 HTTP response,以下稱此手法為 response read
實際上 Apache 伺服器在某個版本前有另一個漏洞,是它的 byterange filter 有問題,因此可以透過 HTTP 表頭 Range 來實踐攻擊,但是因為那是 Apache 伺服器某些版本的特定漏洞,並非一般性的攻擊,因此我將那種手法和以上三種分別出來。


沒有留言:

張貼留言