聊聊Slowloris与慢速攻击

Posted by     "Miaoyu" on Thursday, September 7, 2023

聊聊Slowloris与慢速攻击

Slowloris回来了?

Slowloris这个DDoS攻击工具的出现,已经至少十多年的历史了,本来已经不怎么关注了,最近却突然又回到了视野当中。

一次是微软今年6月份的时候遭受了DDoS攻击,并影响到了Azure、Outlook、OneDrive等业务。当时国内媒体也有大量的报道,如:

最终微软官方披露了这次攻击事件,详细内容可以参考:

Microsoft Response to Layer 7 Distributed Denial of Service (DDoS) Attacks | MSRC Blog | Microsoft Security Response Center

值得注意的是,这里面专门提到了攻击手段包含Slowloris:

还有一次是最近群里面分享的一张图片,前几天日本开始排放核污水,有博主模拟了对日本各政府网站的攻击(当然,是虚拟环境模拟直播)。仔细一看,诶?有点意思,直播演示的就是在打慢速攻击。

因为这2个事情,作为引子吧,也摆一摆Slowloris和慢速攻击。

Slowloris历史

Slowloris最早是一个perl脚本,发布在http://ha.ckers.org/,这个网站目前作者已经关停了,感兴趣的可以看看https://web.archive.org/web/20150426090206/http:/ha.ckers.org/slowloris

现在github上有很多各种语言重写了的版本,都可以使用,自行搜索即可。

Slowloris在当年是一个非常好用的攻击工具,也正是其作者首创或者说让慢速攻击这种攻击方式进入了大家的视野。

Anonymous这个攻击组织在2016年发布了一个常用攻击工具包,还有专门的演示视频,这里面也出现了Slowloris,也让这个工具更广泛的被攻击者所使用。

重新去跑了一下Slowloris的最初版本,当看到运行时弹出的logo,真是满满的都是回忆啊。

当年天天讨论这个工具的原理和防护算法,测试验证过程,看到这个logo太亲切了。

Slowloris与慢速攻击原理及防护建议

最终回到干货吧,现在慢速攻击的攻击手段已经发展了很多种,kali也已经集成了各种慢速攻击工具,直接使用slowhttptest就行。目前已集成了4种攻击工具:

-H slow headers a.k.a. Slowloris (default)

-B slow body a.k.a R-U-Dead-Yet

-R range attack a.k.a Apache killer

-X slow read a.k.a Slow Read

Slow header

攻击原理:

在正常的HTTP包头中,是以两个CLRF表示HTTP Headers部分结束的。如果Web Server只收到了一个\r\n,将认为HTTP Headers部分没有结束,并保持此连接不释放,继续等待完整的请求。此时客户端再发送任意HTTP头,保持住连接,这样就会耗尽服务器线程池,导致服务器无法回复其他人拒绝服务。

这种类型的攻击只使用少量带宽,通过非常缓慢的、看起来是正常访问速率的请求来耗尽服务器资源,同时规避DDoS检测。

正常的http报文举例:

攻击报文,只有一个\r\n:

Slow body

攻击原理:

在http post报文中,声明一个较大的content-length,但body缓慢发送,导致服务器一直处于等待状态,从而达到耗尽服务器资源的目的。

正常报文,一次post发送内容与content-length一致,比如只发送43字节:

Slow body攻击声明了4096字节,但每次只缓慢发送30多字节:

Slow read

攻击原理:

Slow read攻击方式,向服务器发送一个正常合法的read请求,请求一个很大的文件,但人为的把TCP滑动窗口设置得很小。这时服务器就会以滑动窗口的大小切割文件,然后发送。文件长期滞留在内存中,消耗资源。

TCP窗口设置比服务器的socket缓存小,这样数据发送很慢。同时请求的文件比服务器的socket缓存大,使得服务器无法一下子将文件放到缓存,而是必须不停的将文件切割成窗口大小,再放入缓存。

正常TCP窗口的size会比较大,而且随着数据量增大,协议支持了放大比,一般都非常大:

A white screen with black text Description automatically generated

而攻击流量的TCP窗口size特别小:

Range attack

攻击原理:

Range attack可以算是漏洞利用导致的DDoS攻击,攻击利用Apache HTTPD服务器上的漏洞,通过少量的请求,就可能导致服务器上的内存和CPU占用率巨大,从而影响服务器提供正常服务。漏洞详情:

VU#405811 - Apache HTTPD 1.3/2.x Range header DoS vulnerability (cert.org)

攻击报文举例,利用了Range或Request-Range头:

常用防护方法

1、提高服务器可用性:增加服务器在任何时候允许的最大客户端数量,这会增加攻击者在服务器过载之前必须建立的连接数量。

2、限制传入请求个数:限制单个IP 地址允许建立的最大连接数。

3、基于云/安全设备的保护:使用可以充当反向代理的服务,在开始向源服务器发送任何内容之前缓冲传入请求,保护源服务器。

4、限制HTTP头部传输的最大许可时间:超过指定时间HTTP Header还没有传输完成,判定源IP地址为慢速连接攻击,中断连接并加入黑名单。

5、通过server.xml内定义的连接器的connectionTimeout属性,配置一个合适的超时时间。

6、检查判断content-length、window的大小,判定异常则中断连接并加入黑名单。

写在最后

攻防博弈是一个永久的话题。

DDoS攻击虽然是一个历史悠久且暴力的攻击方式,但也在一直在不断演进,每隔一段时间也经常会有新的攻击手法、工具出现。

让我们以slowloris结束吧:

A small animal holding a feather Description automatically generated