分享

技术分享丨慢速攻击的三种形式和防护思路

 牛人的尾巴 2023-03-08 发布于浙江
图片

慢速攻击

慢速攻击是 DoS 或 DDoS 攻击的一种,依赖一小串非常慢的流量,可以针对WEB服务器资源发起攻击,攻击者利用HTTP合法机制,在建立连接后,尽量长时间保持连接不释放,达到对HTTP服务攻击目的,如果攻击者使用多线程或大量的傀儡机去做同样操作,WEB服务器很快就被占满TCP连接而不再接受正常请求。

慢速攻击分为Slowloris Header、Slowloris Body和Slowloris Read三种方式。今天,我们使用wireshark工具通过实验的方式了解慢速攻击的工作原理和攻击过程。

#01

实验环境

攻击端:10.10.100.180 安装slowhttptest工具

WEB服务器:10.10.100.184 安装WEB服务

#02

慢速攻击的三种方式

第一种:Slowloris Header

Slowloris Header攻击是一种针对WEB服务器的慢速HTTP攻击,在HTTP协议中规定,HTTP头部以连续“\r\n\r\n”作为结束标志。服务器在处理HTTP请求的头部信息时,会等待头部传输结束后再进行处理。如果WEB服务器没有接收到连续的“\r\n\r\n”,就会一直接收数据并保持与客户端的连接,利用这个特性,攻击者能够长时间与WEB服务器保持连接,并慢慢耗尽WEB服务器的连接资源。

正常请求:

10.10.100.180攻击端通过curl正常请求测试机器WEB服务器地址

http://10.10.100.184/,并通过wireshark查看数据包通信过程,如下图所示:

图片

上图表示一个正常的HTTP数据包通信过程,从TCP三次握手>>客户端和服务器数据传输确认>>TCP连接断开,整个请求响应时间正常,且请求头部符合HTTP标准格式,这里需要关注的是请求头“ACCEPT”字段后面“\r\n\r\n”字符,它表示HTTP请求头部内容已完全发送。

Slowloris Header攻击原理图:

图片

上图表示攻击端发送HTTP请求时,请求头部的内容每隔一段时间发送一次,WEB服务器在没有收到“\r\n\r\n”时,会长时间保持TCP连接,直到连接超时,等待过程中占用连接数达到服务器连接数上限,WEB服务器便无法处理其他请求。

数据包分析

在攻击器10.10.100.180使用slowhttptest工具对10.10.100.184的WEB服务器80端口进行Slowloris Header攻击,命令如下:

图片

这里我们主要关注几个参数:

-c number of connections 测试时建立的连接数

-H SlowLoris Header模式

-i seconds指定发送数据间的间隔。

-r connections per second 每秒连接个数

-l seconds 测试维持时间

本次攻击测试中,设置“-i”为10,表示每隔10秒发送一次数据。

在服务器上抓取攻击数据包,通过wireshark查看某一个TCP会话流,可以看到攻击端每10秒向WEB服务器发送一次数据,如下图所示:

图片

在90秒左右,服务器主动发送“FIN”断开本次连接请求,整个连接从建立到断开使用了60秒时间(TCP连接建立完成在第30秒左右),试想一下,一个连接保持60秒,如果有大量的攻击端请求,WEB服务器可能无法响应正常HTTP连接请求,造成拒绝服务。

攻击数据如下图所示:

图片

第二种:Slowloris Body

攻击者在发送HTTP POST请求时,在请求头部中将“Content-Length”设置一个很大的值,并将HTTP BODY以非常缓慢的速度向WEB服务器发送。这样,Web服务器就需要一直维护与客户端的连接并等待数据传输结束,利用这个特性,攻击者能够长时间与WEB服务器保持连接,并慢慢耗尽WEB服务器的连接资源。

Slowloris Body攻击原理图:

图片

从上图可以看出,攻击端告之服务器有2000个字节需要传输,但是每次只传输两个字符。

数据包分析:

在攻击器10.10.100.180使用slowhttptest工具对10.10.100.184的WEB服务器80端口进行Slowloris Body攻击,命令如下:

图片

这里我们主要关注几个参数:

-c number of connections 测试时建立的连接数

-B Slowloris Body模式

-i seconds指定发送数据间的间隔。

-r connections per second 每秒连接个数

-s 设置Content-Length字节大小

-l seconds 测试维持时间

本次攻击测试中,设置“-i”设置3,表示每隔3秒发送一次数据,“-s”设置1000,表示“Content-Length”长度为1000,告之服务器端消息实体的传输长度为1000字节。

在WEB服务器抓取攻击数据包,通过wireshark查看某一个TCP会话流,可以看到攻击端发送“Content-Length”长度为1000,每3秒向WEB服务器发送一次数据,如下图所示:

图片

由于Content-Length被设置成1000,而HTTP BODY传输速度又非常缓慢,攻击就可以长时间占用这个连接,如果攻击者利用大量的攻击端发送这种缓慢的HTTP POST请求并持续占用这些连接,就会耗尽WEB服务器的连接资源,导致其他用户的HTTP请求无法被处理,造成拒绝服务。

第三种:Slowloris Read

攻击者在发送HTTP请求时,通常情况下请求的资源为较大的文件,然后以很低的速度读取服务器回应的数据,通过发送“TCP ZeroWindow”数据包到服务器,让服务器误以为自己很忙,无法处理服务回应的数据,服务器收到攻击者“TCP ZeroWindow”数据包后,发送“TCP KeepAlive”数据包给攻击者来保活连接,因连接长时间无法断开,所以消耗了服务器的连接和资源。

Slowloris Read攻击原理图:

图片

数据包分析:

在攻击端10.10.100.180使用slowhttptest工具对10.10.100.184的WEB服务器80端口进行Slowloris Read攻击,命令如下:

图片

这里我们主要关注几个参数:

-c number of connections 测试时建立的连接数

-X Slowloris Read模式

-r connections per second 每秒连接个数

-z 指定每次从接收数据的缓冲区中读取数据的长度16byte

-n 指定读取数据的间隔

-w 指定window size最小512byte

-y 指定window size最大1024 byte

本次攻击测试中,攻击端请求一个较大的图片文件1.jpg,大概6M多文件,设置“-z”为16byte,表示客户端每次从缓冲区中读取的数据长度只有16byte。

在WEB服务器抓取攻击数据包,通过wireshark查看某一个TCP会话流,如下图:

图片

上图第142个数据包可以看到攻击端缓冲区满了后,已经达到的接受窗口的上限,服务器发送“TCP Window Full”给攻击端,表示已停止发送数据,等待攻击端新接收窗口的通告,第144个数据包表示客户端缓冲区已满,发送“TCP ZeroWindow”告诉WEB服务器,没办法处理更多的数据,第158个数据包表示WEB服务器收到客户端“TCP ZeroWindow”,知道攻击端已经无法处理更多的数据,所以发送“TCP Keep-Alive”来保持这个连接,因连接长时间无法断开,所以消耗了服务器的连接和资源。

#03

防护思路

关于慢速攻击原理,有个比喻非常的形象,可以把被攻击的WEB服务器看作一个咖啡厅,通常用餐的步骤是:点单、付款、用餐,而攻击者就像是这个咖啡厅竞争对手,他雇佣了许多看似正常的客人进来用餐,结果就会发生了许多不正常的情况。

Slowloris Header攻击就像那种点餐犹豫不决的人,不停的说又一直说不清自己要点什么菜,Slowloris Body攻击就好比顾客结账,但却是从口袋一个一个摸硬币出来付款,Slowloris Read攻击就像吃完饭不离开一直霸占座位的客人,导致新的顾客无法进来就餐。

上面三种类型的顾客,其实共性就一个字:慢!如果咖啡厅想正常营业,就只能通过阻止这些捣乱的顾客,清理这些点餐慢、付款慢的顾客,限定用餐时长。

回到慢速攻击的真实场景,上面说到餐厅需要限制用餐时长,那我们就需要限制HTTP请求和响应时长,关于防护策略可以从安全设备层面和中间件层面考虑。

安全设备层面

某些安全厂商的WEB应用防火墙或是抗拒绝设备,对慢速攻击可以进行有效防护,防护策略包括但不仅限于:

(1)连续多个HTTP POST报文的总长度“Content-Length”都很大,但是其HTTP载荷长度都很小,触发设定阈值后,安全设备认为请求异常,将攻击端加入IP黑名单或是拦截请求。

(2)连续多个HTTP GET 报文的报文头都没有结束标识,触发设定阈值后,安全设备认为请求异常,将攻击端加入IP黑名单或是拦截请求。

(3)HTTP慢速攻击基本上是通过自动化工具实现攻击,抗拒绝设备可以在收到HTTP慢速请求时,返回JS脚本给攻击端,由于攻击端无法像浏览器完成验证,认为请求异常,将攻击端加入IP黑名单或是拦截请求。

中间件层面

设置WEB服务器的HTTP头部传输时间限制,比如Apache2.2.15版本之后,通过mod_reqtimeout模块配置HTTP头部超时时间,如果在超时时间内没有完成传输,将断开连接,对于NGINX可以在配置文件中设置client_body_timeout和client_header_timeout超时时间来防护慢速攻击,其他中间件同样有类似的防护参数,其防护的思想基本相同,在此就不再赘述。

作者丨解义庆    校对丨技术服务中心

责编丨汤纪龙    审核丨总经办

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多