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