Slowhttptest其实是一个DoS压力测试工具,它集成有三种慢速攻击模式(slowloris、slow http post、slow read attack),并且能导出日志报告,节约了部分写文档的时间,是一个特别好用且强大的工具,下面笔者将逐个分析它主要的攻击模式及防御方法。
一、Slowhttptest安装
Mac安装命令:
brew update && brew install slowhttptest
安装好Slowhttptest之后可以直接执行命令Slowhttptest检测是否成功安装
下面截图是笔者Mac上装的Slowhttptest。
大家也可以利用GitHub安装,有兴趣的可以自己研究,命令如下:
git clone https://github.com/shekyan/slowhttptest
二、Slowloris模式
Slowloris攻击原理:
1.Slowloris也称为slow headers,是通过耗尽server的并发连接池来达到攻击目的的一种DoS攻击方式,这和前面讲的Syn-Flood有点相似,不过Slowloris是应用层的攻击
2.正常情况下当client和server通信时,client发送的header请求头信息的结尾应该是"0d0a0d0a"。但是如果启用Slowloris这种模式则只会发送"0d0a",而HTTP协议默认在服务器接收到全部信息之后才会开始处理,如果始终没有接收到完整的request信息那么服务器会为其保留连接池并持续等待后续信息直到连接超时
3.通常配置不太好的的服务器的并发连接池数并不多,当攻击者连续不间断的建立连接并占满server的连接池资源之后,server就不能为正常用户提供服务,达到DoS攻击效果
如果对上述原理不太理解,笔者给大家描述一个生活中常见的场景:当大家在麦当劳点餐的时候,最前面点餐的那个人点了一个汉堡,然后他还准备点其他东西,但是又一直不说要啥,就一直霸站着收银台导致后面的客人无法点餐,如果德克士的每个收银台都被这样的客人霸占着,那么最后就会导致麦当劳无法做生意了,也就造成了DoS
Slowloris攻击实战
环境准备:
Mac端的Slowhttptest
靶机metasploitable 2.0 IP=192.168.1.103
实战演示:
ulimit -n 1024 && slowhttptest -c 1000 -H -g -o /Users/apple1/Desktop/my_header_stats -i 10 -r 100 -t GET -u https://host.example.com/index.html -x 24 -p 3
参数解释:
[ ulimit -n 1024 ] 指定同一时间能并发打开的文件数为 1024;
[ -c 1000 ] 指定测试过程中与目标建立的连接数为1000;
[ -H ] 指定开始SlowLoris攻击模式并发送未完成的HTTP请求;
[ -g -o my_header_stats ] 让Slowhttptest生成CSV和HTML的报告文件,并指定路径/文件名 ;
[ -i 10 ] Specifies the interval between follow up data ;
[ -r 100 ] 指定连接速率为100/s ; [ -t GET ] 通过GET方式连接 ;
[ -u https://host.example.com/index.html ]指定URL;
[ -x 24 ] 启用慢速读取测试;
[ -p 3 ] 官方:在判断server被DoS之前,发送连接请求之后,等待HTTP response的时间间隔为3S || 笔者:client发送request请求3S内没接收到server的response就标志服务器被DoS
三、Slow Http Post模式
Slow Http Post攻击原理
1.Slow Http Post也称作Slow body,其本质也是通过耗尽服务器的连接池来达到攻击目的,而且攻击过程和上面提到的Slowloris差不多
2.在Post攻击中http header头是完整发送的,但是这里会利用header头里面的content-length字段,正常情况下content-length的长度就是所要发送的数据长度,但是攻击者可以定制client发送的content-length,于是如果攻击者发送一个content-length特别大的值,那么server就会等待后续没有传完的body内容
3.此时攻击者会延迟发送后续的body甚至是不发送,但是server端依旧会在等待并为其保留连接池并持续等待后续信息直到连接超时
4.问题来了,如果攻击者与服务器建立大量连接,而且都告诉server后续还要传输数据,那么server的连接池到达一定程度时就会被占满达到DoS攻击
如果对上述原理不太理解,笔者给大家描述一个生活中常见的场景:当大家在麦当劳点餐的时候,最前面点餐的那个人点了一个汉堡,于是开始付钱,先付了一毛,给收银员说等我找找钱放哪了再付剩下的钱,但是又一直找不到不给,就一直霸站着收银台导致后面的客人无法点餐,如果德克士的每个收银台都被这样的客人霸占着,那么最后就会导致麦当劳无法做生意了,也就造成了DoS
Slow Http Post攻击实战
ulimit -n 4096 && slowhttptest -c 3000 -B -g -o /Users/apple1/Desktop/my_body_stats -i 110 -r 100 -s 8192 -t GET -u http://host.example.com/loginform.html -x 10 -p 3
参数解释:
[ -B ] 启用Slow Http Post模式发送未完成的HTTP消息体;
[ -s ] 指定content-length长度为8192;
四、Slow Read attack模式
Slow Read attack攻击原理
1.正如名字所描述的那样,就是慢速读取server传输过来的数据,如果大家看过我的sockstress那篇文章可知client可以通过控制TCP的window size来控制传输速率
2.如果攻击者将window size置为一个特别小的值,但是却又请求一个特别大的资源,那么服务器就会与这个连接进行长时间通信,如果建立的连接数足够大就会塞满server的连接池
3.当server端缓冲区未发送的资源堆积过多时还会导致缓冲区溢出,也无法响应其他请求
4.正如漏斗一样,漏斗口很小,但是我们却一个劲的往里面装沙子,这样迟早把漏斗涨满
Slow Read attack攻击实战
ulimit -n 8000 && slowhttptest -c 8000 -X -r 100 -g -o /Users/apple1/Desktop/my_header_stats -w 512 -y 1024 -n 5 -z 32 -k 3 -u https://host.example.com/resources/index.html -p 3
**参数解释**
[ -X ] 指定使用Slow Read attack模式,缓慢读取HTTP响应请求;
[ -w 512 -y 1024 ] 指定window size大小为512~1024 byte;
[ -n 5 ] 指定读取数据的间隔为5S;
[ -z 32 ] 指定每次从接收数据的缓冲区中读取数据的长度为5 byte;
[ -k 3 ] 在同一连接中重复请求的次数为3次
这次服务器不仅被DoS了,而且因为缓冲区溢出导致CPU被大量占用,导致无法执行其它系统命令
五、防御策略
1.将标题和消息体限制在最小的合理长度上。针对接受数据的每个资源,设置更严格的特定于URL的限制。
2.设置合理的连接超时时间
3.定义最小传入数据速率,并删除比该速率慢的连接
4.如果Web服务器从相同的IP接收到数千个连接,同一个用户代理在短时间内请求相同的资源,直接禁掉IP并且记录日志
具体的防御策略大家可以参考这篇文章:
http://blog.shekyan.com/2011/11/how-to-protect-against-slow-http-attacks.html
六、结语
笔者的英文水平不是很好,但是这个工具国内资源又很少,不得不去看英文文章,所以可能有部分参数内容翻译不准确,还望大家多多指正!!
如果使用更安全,高防的服务器笔者推荐佛山德胜电信机房在国内来说防御效果还是不错的,(www.deshengidc.cn)他们官方网站。