【漏洞學習】slowHTTPtest 慢速 DOS 攻擊方法 修復方案



日期:2018-05-28 21:41:59
更新:2019-07-05 23:15:21
作者:Bay0net
介紹:學習一下 slowHTTPtest 的攻擊及防御。


0x01、 安裝

下載鏈接
https://github.com/shekyan/slowhttptest

安裝介紹
https://github.com/shekyan/slowhttptest/wiki/InstallationAndUsage

KALI

git clone https://github.com/shekyan/slowhttptest
cd slowhttptest
./configure
make

MAC:
brew update && brew install slowhttptest

0x02、攻擊模式

服務器在接收到請求時,完全接收以后才會處理請求,如果攻擊者發送的比較緩慢或者發送的不完整,服務器會保留其連接,占用資源池,如果請求數量較多,就會形成 DOS 攻擊。

2.1 三種攻擊模式

1、slowloris:完整的http請求是以 \r\n\r\n 結尾,攻擊時僅發送 \r\n,少發送一個 \r\n,服務器認為請求還未發完,就會一直等待直至超時。

slowhttptest -c 1000 -H -g -o my_header_stats -i 10 -r 200 -t GET -u "url" -x 24 -p 3

2、slow post:通過聲明一個較大的content-length后,body緩慢發送,導致服務器一直等待。

slowhttptest -c 3000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u "url" -x 10 -p 3

3、slow read:向服務器發送一個正常合法的read請求,請求一個很大的文件,但把TCP滑動窗口設置得很小,服務器就會以滑動窗口的大小切割文件,然后發送,這是文件會長期存放在內存中,消耗資源。

slowhttptest -c 8000 -X -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u "url" -p 3

4、Range Header test:在 HTTP 請求的 RANGE HEADER 中包含大量字段,使得服務器在服務端將一個很小的文件分割成大量的更小的片段再壓縮。分段壓縮過程消耗大量的服務器資源,導致 DOS。

slowhttptest -R -u "url" -t HEAD -c 1000 -a 10 -b 3000 -r 500

5、測試的時候,添加代理

slowhttptest -c 1000 -X -r 1000 -w 10 -y 20 -n 5 -z 32 -u url -p 5 -l 350 -e lhost:lport

2.2 參數說明

 -g      在測試完成后,以時間戳為名生成一個CVS和HTML文件的統計數據
 -H      SlowLoris模式
 -B      Slow POST模式
 -R      Range Header模式
 -X      Slow Read模式
 -c      number of connections 測試時建立的連接數
 -d      HTTP proxy host:port  為所有連接指定代理
 -e      HTTP proxy host:port  為探測連接指定代理
 -i      seconds 在slowrois和Slow POST模式中,指定發送數據間的間隔。
 -l      seconds 測試維持時間
 -n      seconds 在Slow Read模式下,指定每次操作的時間間隔。
 -o      file name 使用-g參數時,可以使用此參數指定輸出文件名
 -p      seconds 指定等待時間來確認DoS攻擊已經成功
 -r      connections per second 每秒連接個數
 -s      bytes 聲明Content-Length header的值
 -t      HTTP verb 在請求時使用什么操作,默認GET
 -u      URL  指定目標url
 -v      level 日志等級(詳細度)
 -w      bytes slow read模式中指定tcp窗口范圍下限
 -x      bytes 在slowloris and Slow POST tests模式中,指定發送的最大數據長度
 -y      bytes slow read模式中指定tcp窗口范圍上限
 -z      bytes 在每次的read()中,從buffer中讀取數據量

0x03、netstat 的相關操作

查看連接數
netstat -ant | grep $ip:80 | wc -l

查看當前連接數
netstat -ant | grep $ip:80 | grep EST | wc -l

0x04、修復方法

XAMPP 的配置路徑

/opt/lampp/etc/httpd.conf
/opt/lampp/etc/original/httpd.conf
/opt/lampp/apache2/conf/httpd.conf

方法1:啟用 Apache 的 reqtimeout_module 模塊

配置文件里,默認啟用了這個模塊,
LoadModule reqtimeout_module modules/

在 httpd.conf 里面,添加上

mod_reqtimeout.so
<IfModule reqtimeout_module>
    RequestReadTimeout header=5-40,MinRate=500 body=20,MinRate=500
</IfModule>

再攻擊的話,提示

也可以安裝兩個新的模塊 mod_qosmod_security

<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>

方法2:設置每個 IP 只能建立20個連接

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

查看建立的連接數
netstat -ant | grep $ip:80 | grep EST | wc -l

設置完 iptables 后,立即生效,但是使用工具進行攻擊的時候,還是會提示攻擊成功,因為攻擊者自己只能與服務器建立20個連接,超過20個連接后,會提示服務不可用。

服務器建立的連接數

方法3:Tomcat 的修復

Tomcat 在 server.xml 中修改超時時間即可

修改以后,攻擊如下:

修復的效果立竿見影,攻擊對服務器基本沒影響了。。。

方式4:weblogic 的修復

console 控制台修改兩個參數。

Reference

How To Mitigate Slow HTTP DoS Attacks in Apache HTTP Server - Acunetix

科普HTTP Slow Attack 和 Apache DOS 漏洞的修復 - 安大叔 - 博客園


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM