DDoS攻擊憑借其嚴(yán)重的后果以及簡單的操作,一直都是攻防中重要的攻擊方式。隨著DDoS攻擊的演變,信息安全的防御也在同步升級。發(fā)展到今天,DDoS攻擊已經(jīng)多種多樣。本文簡要分析了CC攻擊中的慢速攻擊以及防護(hù)策略。
作者:武漢研發(fā)中心 彭元
CC攻擊的本名叫做HTTP-FLOOD,是一種專門針對于Web的應(yīng)用層FLOOD攻擊,攻擊者操縱網(wǎng)絡(luò)上的肉雞,對目標(biāo)Web服務(wù)器進(jìn)行海量http request攻擊,直到服務(wù)器帶寬被打滿,造成了拒絕服務(wù)。
由于偽造的http請求和客戶正常請求沒有區(qū)別,對于沒有流量清洗設(shè)備的用戶來說,這無疑就是噩夢。而我們今天談的這種攻擊方式,就是CC攻擊的一個變異品種——慢速攻擊。
什么是慢速攻擊
一說起慢速攻擊,就要談?wù)勊某擅麣v史了。HTTP Post慢速DoS攻擊第一次在技術(shù)社區(qū)被正式披露是2012年的OWASP大會上,由Wong Onn Chee 和 Tom Brennan共同演示了使用這一技術(shù)攻擊的威力。
這個攻擊的基本原理如下:對任何一個開放了HTTP訪問的服務(wù)器HTTP服務(wù)器,先建立了一個連接,指定一個比較大的content-length,然后以非常低的速度發(fā)包,比如1-10s發(fā)一個字節(jié),然后維持住這個連接不斷開。如果客戶端持續(xù)建立這樣的連接,那么服務(wù)器上可用的連接將一點(diǎn)一點(diǎn)被占滿,從而導(dǎo)致拒絕服務(wù)。
和CC攻擊一樣,只要Web服務(wù)器開放了Web服務(wù),那么它就可以是一個靶子,HTTP協(xié)議在接收到request之前是不對請求內(nèi)容作校驗的,所以即使你的Web應(yīng)用沒有可用的form表單,這個攻擊一樣有效。
在客戶端以單線程方式建立較大數(shù)量的無用連接,并保持持續(xù)發(fā)包的代價非常的低廉。實際試驗中一臺普通PC可以建立的連接在3000個以上。這對一臺普通的Web server,將是致命的打擊。更不用說結(jié)合肉雞群做分布式DoS了。
鑒于此攻擊簡單的利用程度、拒絕服務(wù)的后果、帶有逃逸特性的攻擊方式,這類攻擊一炮而紅,成為眾多攻擊者的研究和利用對象。
慢速攻擊的分類
發(fā)展到今天,慢速攻擊也多種多樣,其種類可分為以下幾種:
- Slow headers:Web應(yīng)用在處理HTTP請求之前都要先接收完所有的HTTP頭部,因為HTTP頭部中包含了一些Web應(yīng)用可能用到的重要的信息。攻擊者利用這點(diǎn),發(fā)起一個HTTP請求,一直不停的發(fā)送HTTP頭部,消耗服務(wù)器的連接和內(nèi)存資源。抓包數(shù)據(jù)可見,攻擊客戶端與服務(wù)器建立TCP連接后,每30秒才向服務(wù)器發(fā)送一個HTTP頭部,而Web服務(wù)器再沒接收到2個連續(xù)的\r\n時,會認(rèn)為客戶端沒有發(fā)送完頭部,而持續(xù)的等等客戶端發(fā)送數(shù)據(jù)。
- Slow body:攻擊者發(fā)送一個HTTP POST請求,該請求的Content-Length頭部值很大,使得Web服務(wù)器或代理認(rèn)為客戶端要發(fā)送很大的數(shù)據(jù)。服務(wù)器會保持連接準(zhǔn)備接收數(shù)據(jù),但攻擊客戶端每次只發(fā)送很少量的數(shù)據(jù),使該連接一直保持存活,消耗服務(wù)器的連接和內(nèi)存資源。抓包數(shù)據(jù)可見,攻擊客戶端與服務(wù)器建立TCP連接后,發(fā)送了完整的HTTP頭部,POST方法帶有較大的Content-Length,然后每10s發(fā)送一次隨機(jī)的參數(shù)。服務(wù)器因為沒有接收到相應(yīng)Content-Length的body,而持續(xù)的等待客戶端發(fā)送數(shù)據(jù)。
- Slow read:客戶端與服務(wù)器建立連接并發(fā)送了一個HTTP請求,客戶端發(fā)送完整的請求給服務(wù)器端,然后一直保持這個連接,以很低的速度讀取Response,比如很長一段時間客戶端不讀取任何數(shù)據(jù),通過發(fā)送Zero Window到服務(wù)器,讓服務(wù)器誤以為客戶端很忙,直到連接快超時前才讀取一個字節(jié),以消耗服務(wù)器的連接和內(nèi)存資源。抓包數(shù)據(jù)可見,客戶端把數(shù)據(jù)發(fā)給服務(wù)器后,服務(wù)器發(fā)送響應(yīng)時,收到了客戶端的ZeroWindow提示(表示自己沒有緩沖區(qū)用于接收數(shù)據(jù)),服務(wù)器不得不持續(xù)的向客戶端發(fā)出ZeroWindowProbe包,詢問客戶端是否可以接收數(shù)據(jù)。
使用較多的慢速攻擊工具有:Slowhttptest和Slowloris。
哪些服務(wù)器易被慢速攻擊
慢速攻擊主要利用的是thread-based架構(gòu)的服務(wù)器的特性,這種服務(wù)器會為每個新連接打開一個線程,它會等待接收完整個HTTP頭部才會釋放連接。比如Apache會有一個超時時間來等待這種不完全連接(默認(rèn)是300s),但是一旦接收到客戶端發(fā)來的數(shù)據(jù),這個超時時間會被重置。正是因為這樣,攻擊者可以很容易保持住一個連接,因為攻擊者只需要在即將超時之前發(fā)送一個字符,便可以延長超時時間。而客戶端只需要很少的資源,便可以打開多個連接,進(jìn)而占用服務(wù)器很多的資源。
經(jīng)驗證,Apache、httpd采用thread-based架構(gòu),很容易遭受慢速攻擊。而另外一種event-based架構(gòu)的服務(wù)器,比如nginx和lighttpd則不容易遭受慢速攻擊。
如何防護(hù)慢速攻擊
Apache服務(wù)器現(xiàn)在使用較多的有三種簡單防護(hù)方式。
- mod_reqtimeout :Apache2.2.15后,該模塊已經(jīng)被默認(rèn)包含,用戶可配置從一個客戶端接收HTTP頭部和HTTPbody的超時時間和最小速率。如果一個客戶端不能在配置時間內(nèi)發(fā)送萬頭部或body數(shù)據(jù),服務(wù)器會返回一個408REQUEST TIME OUT錯誤。配置文件如下:< IfModule mod_reqtimeout.c >
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
< /IfModule > - mod_qos:Apache的一個服務(wù)質(zhì)量控制模塊,用戶可配置各種不同粒度的HTTP請求閾值,配置文件如下:
< IfModule mod_qos.c >
/# handle connections from up to 100000 different IPs
QS_ClientEntries 100000
/# allow only 50 connections per IP
QS_SrvMaxConnPerIP 50
/# limit maximum number of active TCP connections limited to 256
MaxClients 256
/# disables keep-alive when 180 (70%) TCP connections are occupied
QS_SrvMaxConnClose 180
/# minimum request/response speed (deny slow clients blocking the server, keeping connections open without requesting anything
QS_SrvMinDataRate 150 1200
< /IfModule > - mod_security:一個開源的WAF模塊,有專門針對慢速攻擊防護(hù)的規(guī)則,配置如下:
SecRule RESPONSE_STATUS “@streq 408” “phase:5,t:none,nolog,pass, setvar:ip.slow_dos_counter=+1, expirevar:ip.slow_dos_counter=60, id:’1234123456′”
SecRule IP:SLOW_DOS_COUNTER “@gt 5” “phase:1,t:none,log,drop,
msg:’Client Connection Dropped due to high number of slow DoS alerts’, id:’1234123457′”
傳統(tǒng)的流量清洗設(shè)備針對CC攻擊,主要通過閾值的方式來進(jìn)行防護(hù),某一個客戶在一定的周期內(nèi),請求訪問量過大,超過了閾值,清洗設(shè)備通過返回驗證碼或者JS代碼的方式。這種防護(hù)方式的依據(jù)是,攻擊者們使用肉雞上的DDoS工具模擬大量http request,這種工具一般不會解析服務(wù)端返回數(shù)據(jù),更不會解析JS之類的代碼。因此當(dāng)清洗設(shè)備截獲到HTTP請求時,返回一段特殊JavaScript代碼,正常用戶的瀏覽器會處理并正常跳轉(zhuǎn)不影響使用,而攻擊程序會攻擊到空處。
而對于慢速攻擊來說,通過返回驗證碼或者JS代碼的方式依然能達(dá)到部分效果。但是根據(jù)慢速攻擊的特征,可以輔助以下幾種防護(hù)方式:1、周期內(nèi)統(tǒng)計報文數(shù)量。一個TCP連接,HTTP請求的報文中,報文過多或者報文過少都是有問題的,如果一個周期內(nèi)報文數(shù)量非常少,那么它就可能是慢速攻擊;如果一個周期內(nèi)報文數(shù)量非常多,那么它就可能是一個CC攻擊。2、限制HTTP請求頭的最大許可時間。超過最大許可時間,如果數(shù)據(jù)還沒有傳輸完成,那么它就有可能是一個慢速攻擊。