日期:2014-05-16  浏览次数:20686 次

Ajax 让网页木马“悄悄的执行”
关于Ajax的执行,开发人员是这样想的“Ajax要做到,在用户浏览网页时应该感觉不到的它的执行(异步),不需要等待页面刷新就可以自动完成验证数据”,比如用户名是否可以注册等。每当我想到“感觉不到的它的执行”这句话,就会联想到还有很多网络安全相关的东西(比如木马)都希望可以做到在用户感觉不到执行,或者可以在用户感觉不到的时候做些什么。

许多“研究网络安全的朋友”都应该感觉到,微软的操作系统已经很久没有像以前那样可以“ms05039.exe www.microsoft.com 7758”拿到SYSTEM权限了。于是大家都把目光放到了浏览器上,希望用户一旦浏览某个网页就能自动下载真正的木马服务端文件,然后在后台执行,这样的网页被成为“网页木马”。这样做有几点明显的好处:

1、不必想方设法突破层层防火墙,局域网内用户会自己通过“反弹连接”方式被轻易的控制。

2、如果这个有木马的网页在点击率高的网站上,会有很大的攻击面,只要浏览该页就可能中木马,比苦苦的等待扫描结果爽的多。

3、发送的电子邮件也可以附带这样的网页。

于是各种各样的IE漏洞出现了,从刚开始想办法在用户浏览网页时“56K猫的网速竟然要在后台下载300K左右的木马服务端”,到各类“11k下载者”的出现,大家唯一的目的就是想做到“让用户感觉不到的时候执行”。也是出于这个目的,我决定再研究下把Ajax融入网页木马,让木马“悄悄的进庄,打枪的不要”。

研究Ajax首先要研究“XmlHttp”,来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议。客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft? XML Document Object Model (DOM)处理回应。通常一个简单的Ajax是这样写的:



从第四步开始,浏览器就不再等待服务器返回的结果,而是继续处理“其他的事情”,这就是“用户感觉不到的时候(异步执行)”,等服务器返回结果时,才开始处理服务器返回的信息,所以这个时候最适合去服务器下载木马。关于异步执行,有个比较形象的比方,小李和女朋友上街,看到一家女士专卖店,小李不愿意进去,就在门口等,这个时候,他可以选择两种方式:1、在门口一直等着女朋友出来(同步执行),之后继续逛街;2、两个人事先商量好,然后闪人,等女朋友出来时会打电话叫他回来,之后继续逛街。

Xmlhttp对象有4个属性,用来描述服务器返回的不同数据类型,让JAVASCRIPT的变量接收。开始研究时,我有个思路: Javascript语言的变量是弱类型的,变量被定义后,初始化为什么类型,就是什么类型的变量。其中有一个属性“responseStream”,返回“Ado Stream” 对象,该对象有个方法用来把返回的数据保存为文件,可以完成“下载木马”这个过程。于是写了个脚本,把返回的对象alert出来,竟然没有返回 object,而是发生错误,提示类型不支持。于是搜索“responseStream”的资料, MSDN里没有详细信息,使用“.Net2005”编译器调试时看不到返回类型,code.google.com里也找不到相关代码(哪位大侠有相关可以操作responseStream的资料,麻烦给一份)。

破解网页木马加密篇:

为了继续研究,只好“探探虎穴”,在QQ 群里查看聊天记录,找QQ尾巴给出的网站,这样的网站通常都是被挂了马的。开启杀毒软件后打开网站,果然报有病毒:



停止杀毒软件的实时监控,使用EditPlus编辑网页源代码,代码内容被加密了。



基于javascript的网页加密都是对称的,可以还原回来。代码很凌乱,可见这段代码的作者不希望大家能看到。排版后看的清楚些,把重要的拿出来:



加密流程如下:



我们其实不用关心具体加密解密算法是什么,只关心如何解密就可以了,下面是解密的流程:



这样加密后,用户看到的就是加密后的页面,而浏览器会自动执行解密流程。破解这样的加密很简单,把源代码另存为htm文件,然后修改代码,解密的结果在一个文本域输出。



再次使用浏览器打开看到了解密后的真实代码在文本域里。因为这段代码会被杀毒软件查杀,所以不能给出文字的,排版后再次抓图:



这段代码就是真正的网页木马代码。
改良网页木马篇:

用户浏览该网页时,浏览器自动下载Http://m2126.com/web/exe/data/1.exe,保存到windows目录然后执行。杀毒软件会查杀它,是因为杀毒软件在这段代码中找到了“特征码”,既然有源代码。我们也来找找,看看是它哪点写的太过分惹火了我的瑞星。找起来很简单,打开杀毒软件,删除某行,然后保存就好了,如果删除的地方不是特征码,杀毒软件会报告病毒。



这就是引起瑞星不满的代码,看名字就能想到,这段代码要执行下载的木马。分析这段代码有两点不好的地方:

1、在x.open()这里,最后一个参数是“0”(false),使用了非异步传输,就是说代码执行到某个地方需要等待服务器返回结果才能继续执行。很明显不符合“感觉不到的它的执行”原则。

2、因为代码想做到下载完成后立刻执行,所以刚下载了文件就去执行。

对于第一点,为什么没有用异步传输呢?因为代码并不是Ajax,没有判断服务器返回的状态,使用了“传统的网页木马的模式”。如果这里强行把“0”改成 “1”,会造成木马还没有下载完成,就执行,结果当然出错。代码的作者可能没有想到Ajax,所以只好使用了传统模式。然而现在网站都“web2.0” 了,网页木马为什么不紧随潮流呢? 对于第二点,考虑到杀毒软件猛如虎,我们要“敌进我退”,不立刻执行木马,等用户下次重新启动电脑时再执行。要知道个人机器和服务器最大的差别就是,个人机器可能一天重新启动N次,服务器可能N年重新启动1次。

可能已经有些读者会想到修改注册表。那么恭喜你,答错了!因为杀毒软件会监控注册表,这样做不是虎口拔牙么?我们的原则是要“悄悄的”。推荐的想法是:在 windows系统里有些特殊文件夹,启动系统时会自动执行目录下的文件,比如“C:\Documents and Settings\All Users\「开始」菜单\程序\启动”目录。这样,我们的思路就清晰了,首先使用Ajax技术默默的下载木马,然后悄悄的复制到这个目录里,如果你够狠还可以顺便弹出消息框“对不起!您的操作系统产生严重错误,为您带来不便,为了避免重要文件丢失,请立刻手动重新启动系统!”。

下面是我更改后的代码,使用了Ajax技术:



注意,在保存文件路径那里,路径最前面“\\..\\”是不能少,因为木马默认下载的位置是windows,或winnt。

在我的虚拟机(windows xp sp2)中访问这个页面,可以看到执行成功了。



注意启动项以及目标文件夹。大家可以根据自己的需求更改代码,本篇只是一个简单应用的例子,把一个网页木