网马的反挂马检测
Magictong
2012-07-25
本次只输出反挂马检测的一些技术,以后有机会再分享挂马检测的针对性对抗技术。
最近一段时间跟踪了微软XML漏洞(CVE-2012-1889)的挂马数据,跟进了一些网马资源,发现里面存在很多对抗技术,有些还是很不错的,对于挂马产业链我一直比较好奇。
一、使用Flash来封装网马
有两种方法:
(1) 一种是使用使Flash AS的扩展API:ExternalInterface类来反调JS代码。
import flash.external.*;
ExternalInterface.call("eval","jscode_string");
这个函数有两个参数(第二个参数是一个变参,可以传递0个或者多个参数,实际就看第一个参数指明调用的js函数需要几个参数了),一个是要调用的js函数名,一个执行参数,上面代码的意思本质就是调用js的eval函数,参数是jscode_string。这样可以将任意JS代码封装到Flash文件中,再对Flash文件进行压缩加密保护起来,这种就很难检测了。
(2) 另外一种是直接在as脚本里面写Heapspray代码,然后配合Js脚本的漏洞触发代码,联合利用一个漏洞,可以绕过一些通用的Heapspray检测方法。
二、通过String.fromCharCode函数来变形JS代码
类似:
var sc = "spraySlide =spraySlide.substring(0,spraySlideSize/2)";
var out2 = "";
for(var i=0; i<sc.length; i++)
{
out2 +=String.fromCharCode(sc.charCodeAt(i) - 3);
}
document.write(out2);
既可变形代码,也可以变形字符串,随意搭配,提高绕过概率。
三、通过判断客户端的操作系统或者客户端的安全软件来决定是否挂马
很多挂马检测系统都是跑在后台的,而后台一般是linux等服务器系统,通过判断操作系统,决定是否挂马,挂马检测系统一般不会跑js代码的全部路径,不过目前的一些蜜罐系统基本上伪造得和用户环境一样,因此此种方式的用途有多大值得商酌。另外就是如果发现某些安全软件确实绕不过,则可以在客户端进行检测,避免被曝光(检测方式知道创于研究院的总监余弦在[2]里面提到过)。
四、判断Referrer字段
很显然,蜜罐系统去取网页代码时,或者直接访问时,Referrer字段是空的,而从已知的挂马网站跳转而来,或者从搜索引擎跳转而来,则挂马。更牛逼的是加上时间判断,哪个时间段挂,哪个时间段不挂,譬如晚上挂,到白天了安全工作人员都上班的时间则不挂,猥琐吧。
var url=document.referrer;
varp=url.toLowerCase().indexOf(".baidu.com");
if (p>0)
{
document.writeln("<iframesrc=*** width=0 height=0></iframe>");
}
var url=document.referrer;
varp=url.toLowerCase().indexOf(".google.com.hk");
if (p>0)
{
document.writeln("<iframesrc=*** width=0 height=0></iframe>");
}
五、使用JS访问插件的属性时进行变形
使用这种方法可以绕过很多通过JS的静态特征检测漏洞的利用方式,直接上代码说明,以最近的CVE-2012-1889漏洞为例。
下面是CVE-2012-1889漏洞的原始POC代码:
再看一段真实样本的代码:
它这里其实也是访问definetion属性,不信你看:
用这种方式进行变形,基本上可以千变万化。你可以发挥你的想象力。
六、其它反挂马检测技术
(1) 判断当前IP是否是已知的IDC机房的IP,如果是则认为是Spider(爬虫)在爬取,给予错误的信息。或者甚至通过信息搜集的方法直接探知Spider的IP地址。
(2) 通过cookie等指纹信息判断用户是否已经访问过,如果已经访问过了就不用再访问了,不过可能躲不过蜜罐系统。
(3) 使用一些免费的空间,免费二级域名等方式隐藏行踪[3]。
参考
[1] 免杀迅雷PPLAYER.DLL ActiveX控件溢出漏洞,http://blog.csdn.net/leeeryan/article/details/6127887
[2] xKungfoo上的网马猥亵技巧, http://hi.baidu.com/ycosxhack/item/50aef2e8a6c1cae1fa42baa5
[3] 网马的反挂马检测及精确投放, http://hi.baidu.com/monyer/item/a89437ea339cf2e3fb42ba63
[4] 网马的反挂马检测及精确投放(续), http://hi.baidu.com/monyer/item/948ea84244a37dab60d7b963
一个实例的简单分析
以今天刚刚看到的一个挂马链接为例(最后分析发现其实没挂马,但是有Heapspray行为,因此被Heapspray拦截抓获了)。
分析过程:
URL:http://142.0.128.141/uuBxvO2.html(不要直接访问,有一定危险性)
1、首先取到源代码(注意:如果发现代码不对头,那就换环境试试)
HTML代码里面前面是一些Heapspray库的代码,不用看,直接看后面
2、这种代码比较恶心,各种混淆变形,其实分析网马,我们的目的是要找出最终执行的JS核心代码,把这部分代码通过alert,或者document.write()的方式打印出来,基本上就完成网马分析了,剩下的工作就是找出是利用的什么漏洞了。
3、对于这种混淆变量的JS代码,没什么特别好的办法,一层层的剥出来才是王道。好吧,剥啊剥……其实那个字符串sNotc8里面的代码是可见的第一层JS代码,sNotc8会被eval直接执行,看图:
4、sNotc8里面又是什么代码呢?继续剥……这是一个苦力活,不过网上有一些JS代码格式化工具可以使用,可以稍微减轻一下工作量,最后剥出来是(把变量名作了修改,已便于查看):
5、好下面来剥这个第二层JS代码,也就是上图中的_strNull的值,这下不能静态看,需要使用原始代码,把这个值输出来。代码如下(有一个小技巧就是sNotc8这个字符串你不能修改他,因为第一层的JS代码里面使用了这个字符串来解密第二层JS代码,因此这里重新定义一个字符串sNotc8_1,内容和sNotc8一样,并稍做修改,见图,然后eval这个字符串):
6、坐等输出第二层的JS代码。
7、好吧,分析完成,至于第二层JS代码(上图)是在干嘛,应该很清楚了。但是确实没利用漏洞,纯粹Heapspray!!!
后来和同事讨论了下发现,之前的分析其实还没有完成,问题出在原始的URL不全,原始URL是:http://142.0.128.141/uuBxvO2.html?%3Cembed%20src%3D%27dGaxmb6.swf%3Fhash%3D24C0AF115312706A8C9776145B5C4E955F27%27%20width%3D100%20height%3D0%3E%3C/embed%3E
解码之后是:http://142.0.128.141/uuBxvO2.html?<embedsrc='dGaxmb6.swf?hash=24C0AF115312706A8C9776145B5C4E955F27'width=100 height=0></embed>
8、这就可以解释当时分析时觉得没用的那段代码了:
9、没错,就是获取当前URL里面的数据,作为HTML代码的一部分,显然这个代码的关键部分就是:
<embed src='dGaxmb6.swf?hash=24C0AF115312706A8C9776145B5C4E955F27' width=100 height=0></embed>
10、下载这个swf文件回来反编译发现,果然有玄机。
11、如果我没有看错,它应该是挂 [CVE-2012-0754] adobe flash play mp4格式解析漏洞,但是这里比较巧妙的是他的mp4文件是直接从网络读取的。
结论:天下无免费的午餐,看来它不会无缘无故去做Heapspray的。而这种利用方式要精确拦截,还有点麻烦,因为拦截这个漏洞的关键在于拦截最后触发漏洞的那个MP4文件,如果这个文件不落地,我们现有技术无法进行内存查杀(当然我们现在还不能进行非PE查杀),当前只能依靠Heapspray拦截技术进行通杀拦截。