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


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


0x0一、 安裝

下載連接
https://github.com/shekyan/slowhttptestgit

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

KALIweb

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

MAC:
brew update && brew install slowhttptestapache

0x0二、攻擊模式

服務器在接收到請求時,徹底接收之後纔會處理請求,若是攻擊者發送的比較緩慢或者發送的不完整,服務器會保留其鏈接,佔用資源池,若是請求數量較多,就會造成 DOS 攻擊。服務器

2.1 三種攻擊模式

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

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

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

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

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

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

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

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

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中讀取數據量

0x0三、netstat 的相關操做

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

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

0x0四、修復方法

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 漏洞的修復 - 安大叔 - 博客園

相關文章
相關標籤/搜索