关于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)中访问这个页面,可以看到执行成功了。
注意启动项以及目标文件夹。大家可以根据自己的需求更改代码,本篇只是一个简单应用的例子,把一个网页木马使用Ajax技术进行了改良。推荐大家以后编写的网页木马,在下载木马的过程中,使用Ajax技术下载木马,这样的好处显而易见。
Ajax网页木马深入篇:
大家知道,网页木马的覆盖性很强,任何人浏览就可能中标,这是网页木马的一个大好处,但是有时候也会变成一个缺点,它缺乏了针对性。怎么叫针对性呢?这样的例子很多比如你只想让浏览这个网页的一部分人或这某个人中招,而别人毫无反应。听起来好神奇啊,大家都看网页,凭什么我中招而你没有,难道真的是人品问题?
在讨论技术前,先说说为什么要有针对性吧。在我们渗透企业内部网的时候,并不是企业内所有的员工都会很重视网络安全,常常就有那么几个人对于这方面什么都不懂。他们很可能防御相对比较弱,或补丁打得很晚,好,这次的目标就是让这帮人浏览木马,而其他人的计算机上是正常的。
首先要入侵这个企业的WEB网站,因为要使用网页木马,至少要有目标网站对于web页面写入和修改的权限。然后拿到这帮人的名单,其实你并不需要知道他们具体叫什么,只要知道他们在企业外部网站注册的用户名和邮箱就是了,具体方法可以参照“社会工程学”攻击。下面我们步入主题,怎么能唯独让这帮人浏览页面的时候执行呢?
大多数网站都有让用户登录的地方,邮箱登录、论坛登录等,在用户输入用户名后,进行判断,如果他的姓名在我们的黑名单里,就把木马丢给他。
下面是我更改后的代码:AdvanceAjax.htm
代码:go.js(网页木马)页面
代码的流程对比如下:
代码可以嵌入到企业网站的论坛,电子邮箱等登录页面。这样做的明显好处是:即使部分用户抱怨说有问题,网络安全工程师自己打开时仍然发现不了任何异常,或许会认为客户又在无故抱怨。
Ajax网页木马扩展篇(纯理论)
随着网页木马越来越隐形化,大家挂的马越来越多,慢慢的,形成了一定的规模,就会造成一些管理上的问题。因为即使一个木马再好,一旦使用的多了,被查杀的可能性仍然会大大的增加。微软的IE漏洞仍然在继续增加,有时候想把自己所有的网页木马(不同的网站)全都换一下,还要一个一个的找自己的后门,一个一个的改。这样做,很不符合程序的可扩展性,一个好的程序,应该做到在不更改或较少的更改已经写好的代码,就可以增加扩展功能。所以我们的代码仍然需要改进。
需要说明下,细心的读者应该注意到,文章给出的代码虽然能够使用,但是成功率很低,因为我故意使用了一个很老版本的网页木马在不断的加工,最终目的还是为了让大家理解web安全的重要性。而本篇的代码一旦给出,会有很强的攻击性,所以为了保守起见,只是提供一下思路。
让用户打开网页时,并不是把木马嵌入到当前网页里,而是把用户的请求交给另一个网站的页面处理。从另一个网站的页面返回真正的网页木马,然后执行,最后只要把这个页面管理起来。Javascript只能访问本域下的资源,而不能跨域访问。也就是说,www.microsoft.com站点中的 Javascript只能访问www.microsoft.com站点下的资源,而不能跨域访问www.sun.com站点中的资源。解决的方式是使用代理,Ajax访问有本域下的服务端脚本文件(asp、jsp、php等),再由服务端脚本文件访问其他站点下的资源,然后返回给Ajax处理。详细解决方案参照文章《Use a Web Proxy for Cross-Domain XMLHttpRequest Calls》地址在:“http://developer.yahoo.com/javascript/howto-proxy.html”。
防御篇
防御这段代码其实很简单,我的虚拟机的系统没有打相应的补丁,安装的系统是默认的番茄花园某个版本的系统。本机已经打了IE补丁(别问我具体是什么补丁,反正都应该打),打开这个页面的结果会是:
这样就可以很好的预防“这段代码”。注意,我要强调一下只是可以预防这段代码而已。IE漏洞层出不穷,经常在微软没有发布补丁之前出现的漏洞,所以大家虽然打了补丁,安装了杀毒软件,也并不是万无一失的。
看起来使用了Ajax的网页木马花样百出,想尽办法在用户和杀毒软件之间玩捉迷藏,我们有没有什么办法可以一劳永逸的防止网页木马呢?曾经有一句话叫做 “只有拔下插头的计算机才是安全的”,而凯文?米特尼克回答说:“事实上你可以说服用户把插头接上”,由此可见没有绝对的安全。而我们能做的是尽可能的安全(注意不是尽可能的变态)。
建议的防御思路是:首先假设系统底层已经被黑客入侵,然后采取相应一些对策,再假设只是web服务被入侵,黑客仅仅具备web服务的控制权限,然后采取一些相应对策,就这样层层假设,我们的防御体系就会慢慢健全。
按照以上思路,网页木马的防御应该是:假设我们已经浏览了网页木马,浏览器正在后台默默的下载木马服务端,下载完成后就要把木马复制到启动项,或者就要立刻执行。好的,想办法拦截,不允许复制和执行。
1、首先修改启动项目录的权限为管理员才能对文件进行写操作。
2、在桌面上建立浏览器的快捷方式,在快捷方式上点鼠标右键,选择属性>高级>勾选“以其他身份运行”。
3、建立一个新的用户,用户名为“q”,密码为“q”,默认加入“users用户组”。因为这是“以其他身份运行”后,再次打开会提示输入用户名密码,所以简单些好输入。
4、修改安全策略,不允许新建的用户登录系统。
这样,每次我们打开这个浏览器快捷方式时,是以users组的身份执行的,而木马是通过浏览器执行的,所以木马执行的时候也只有users组权限。没有系统权限,木马还能做什么?系统会立刻提示无权限执行,然后可怜的木马就此“失蹄”了。这样做的另一好处是可以阻止流氓软件自动安装,凡是要给浏览器下毒的,一律坑杀。坏处是不能立刻自己安装想要使用的插件,如果必须要安装一些可信任的插件,可以从“开始”菜单里找到浏览器重新打开页面安装。
1 楼
weijavamen
2011-07-28