高混淆网页木马的研究与检测实现
2014-11-30王轶骏
杨 明,王轶骏,薛 质
(上海交通大学 信息安全工程学院,上海200240)
0 引 言
根据Sophos公司2013年的安全报告所称,网页木马仍然是现今恶意软件的主要扩散来源[1]。而Web全自动攻击工具 (Web exploit kit)[2]又是最近发展迅速的网络自动化攻击手段,是高混淆网页木马的主要存在形式。这些工具往往提供多个漏洞甚至是0-day漏洞的利用支持,主要通过网页挂马来感染目标主机。它们所采用的高级别代码混淆算法定期变化并且能够逃避当前任何的网络层检测技术。因此对于高混淆网页,传统的反病毒引擎和特征码的检测方式已经不能满足需求。
目前国内外的网页木马检测方法主要可分为 “动态检测”和 “静态检测”这2种。“动态检测”主要依赖客户端蜜罐技术,在虚拟环境中模拟通信,通过对系统行为 (文件、进程和注册表等)的监控来鉴别恶意网页。目前动态检测的主要有Jose Nazario的PhoneyC[3]、Honeynet项目组 的 Capture-HPC[4], 以 及 University of Mannheim 的Monkey-Spider[5]等。“静态检测”技术则通过分析网页源代码来检测是否有挂马特征或者异常情况,目前主要有2种常用的技术手段:基于静态解密的检测分析与基于概率统计的异常分析。这方面具有代表性的是加州大学圣塔芭芭拉分校的 Wepawet[6]项目和 Prophiler[7]项目。
“动态检测”和 “静态检测”技术各有自己的优势和劣势,采用任何一种单一技术都无法满足现今高混淆网页挂马的检测分析需求。因此,针对高混淆挂马网页,本文设计了一种动态和静态相结合的网页木马检测模型,并在此基础上开发了一套检测系统,最后通过实验验证了该检测系统相对其它系统能够更准确地识别高混淆挂马网页,具有检测率高、误报率低、速度快等优势。此外,该系统部署方便,开销较少,具有很好的实际应用价值。
1 高混淆挂马网页的机制和特征分析
1.1 高混淆挂马网页的来源
目前主流的高混淆挂马网页使用的工具被称为Exploit Kit。它是一个预打包的软件的合集,包括安装程序,控制面板和一定数量的漏洞利用 (甚至包含0Day漏洞)。Exploit Kit采用主机托管来躲避网页审查,采用动态域名生成来对抗安全厂商的黑名单技术。活跃的Exploit Kit有Black Hole Exploit Kit,RedKit Exploit Kit,Cool exploit kits,Sweet Orange Exploit Kit,Sakura exploit kit,Nuclear Pack等。
近来Exploit Kits还有一个明显的特征就是大量Java漏洞的利用。根据Sophos公司的调查报告[8]统计,包含Java漏洞利用的网页木马比例达到了76.76%,包括JVM溢出漏洞 (CVE-2013-0422,CVE-2010-3552等),Java沙箱绕过漏洞 (CVE-2012-4681,CVE-2011-3554等)。这些的漏洞的触发较为容易、影响范围广,因此成为Java漏洞被网页木马利用较多的主要原因。
1.2 高混淆挂马网页的机制
在网马攻击过程中,攻击者首先利用漏洞入侵合法网站,然后在合法网站中嵌入恶意脚本代码,使得用户访问后被重定向到挂马站点后下载恶意程序运行 (drive-by download[9])。而这些挂马页面往往都经过了高度混淆,代码混淆的特征在很多文献中被提及。文献 [10]详细介绍了JavaScript的各种混淆方式,主要有字符串混淆、escape加密、eval执行加密等等。文献 [11]通过JavaScript特征、HTML特征、以及URL特征等方面来对页面代码进行检测,并利用机器学习和数据挖掘技术来分析数据。这种方法已经被广泛利用在挂马网页的静态检测上。文献[12,13]所设计的挂马检测系统也采用了这种思路。
随着静态检测的应用逐渐广泛,高混淆木马也出现了新的变化。比如JavaScript匿名函数和闭包的应用、专业的JavaScript加密工具和操作系统指纹识别等。
匿名函数指的是没有定义函数名的函数,而闭包则是用匿名函数来实现的一个受到保护的变量空间,其由内嵌函数所生成。图1就是一个利用匿名函数和闭包形式编写的挂马网页代码片段,在这个片段中没有 “eval”、“document”、 “escape”等JavaScript特征,也没有 “iframe”等HTML特征,而动态检测却可以得到较好的结果。
高混淆挂马网页也经常通过专业的JavaScript加密工具来完成,如Dean Edwards Packer,YUI Compressor等。如图2中的例子所示,经过这些工具混淆后的代码不仅进行了多层次的混淆,且代码中每一段都使用了不同的加密方式,因此异常统计所依赖的特征已经非常不明显。文献[14]也指出了静态特征正逐渐在减少这一现象。此外这些加密方式往往是自定义的多层循环排序,而不是传统的单一base64或进制编码类加密方式,加上函数入口点隐蔽,使用静态解密技术解密的难度也很大。
操作系统指纹/浏览器指纹识别是高混淆网马的另一主要特征之一。PluginDetect是一个开源的JavaScript库,用来检测系统信息,包括操作系统,浏览器的名称、版本号,Adobe Flash版本号,Adobe Reader版本号,Java版本号,以及支持各类播放器等ActiveX插件的版本。PluginDetect主要被Black Hole Exploit Kit、Cool exploit kits和Sakura exploit kit等所使用。Exploit Kit通过判断相应的信息选择相应的漏洞进行攻击或者忽略以避免不必要的网马行为泄露。这无疑加重了传统动态检测的难度,因为只有在搭建了符合触发条件的操作系统和存在相应漏洞的ActiveX插件的环境后才能触发恶意代码下载,从而需要配置多台虚拟机来对可疑网页依次进行检测,这带来了很大的检测时间和空间开销。
2 高混淆挂马网页的检测方法和实现
2.1 检测模型与系统设计
如引言所述,传统的检测技术包括 “动态检测”和“静态检测”两大类。其中,动态检测虽然对于含有加密、混淆的恶意代码检测存在优势,但是其缺陷也是明显的:动态检测需要花费大量时间,效率较低;很多恶意代码漏洞触发条件苛刻,存在漏报率较高等问题;带漏洞的虚拟环境还可能存在一些安全隐患。而静态检测虽然系统开销较低,但静态解密技术存在解密难度大、容易被欺骗、误报率高、检测特征库庞大等问题;异常统计技术则存在阀值设定难、误报率高等问题。
通过大量的研究和实验,本文所设计实现的系统通过动静结合的方式来检测高混淆网马,检测模型结构如图3所示。动态检测部分使用真实的全补丁的Internet Explorer浏览器作为脚本引擎,以挂钩浏览器内部关键函数的方式来获取恶意代码反混淆后的结果。这种方式的最大优势在于检测过程不依赖于漏洞的触发,也不会对检测环境造成污染和破坏,也不需要反复还原检测环境。随后我们使用动态仿真的方式检测Shellcode,同时使用基于特征码的静态检测方式作为辅助检测手段,最后综合得到网马检测的结果。
基于上述检测模型,本文设计和实现了一套检测系统,该系统搭建运行在Linux平台之上,整体架构如图4所示,主要分为用户Web交互前段、URL检测引擎、检测结果分析和后台数据存储等模块。
(1)用户Web交互前端模块提供用户输入检测地址和查看检测结果的可视化界面。
(2)URL检测引擎模块由挂钩了核心函数的IE浏览器引擎,Sandboxie沙箱和Vbox虚拟机所组成。修改过的IE浏览器引擎运行在Vbox虚拟机的Windows Sandboxie沙箱内,Vbox虚拟机内相应的控制以及数据传输通过Vbox API完成。检测系统中的Vbox虚拟机保证了访问模块和外部其它模块的隔离,而Sandboxie沙箱所占的系统开销很小、恢复 (即倒沙)快,相比于其它文献中直接对虚拟机镜像进行恢复的优势较为明显。
(3)检测结果分析模块用于对URL检测引擎返回的格式化数据进行分析,判断是否为恶意网页。
(4)后台数据存储模块存储网页木马检测的静态特征以及检测的详细结果。
从上面可以看出,本系统核心的URL检测引擎模块,采用了Vbox虚拟机结合Sandboxie沙箱的基础架构,在提供了高效运行环境的同时还提供了双重的系统安全性保证。
2.2 动态检测实现
2.2.1 浏览器挂钩
现今,大部分网页木马在用户访问开始都会进行浏览器类型和真实度的识别,所以传统动态检测中的模拟引擎可能不会触发恶意代码的跳转或执行。因此,本文拟使用真实的全补丁的IE浏览器来访问待检测网页,从而避免被网页恶意代码绕过的风险,然后我们通过挂钩IE关键解码函数来获取反混淆后的原始代码。
我们使用Microsoft Detours[15]库对IE浏览器进行关键API函数的挂钩来构建我们的检测分析引擎。其中,Detours的实现原理是修改目标函数的前几个字节指令来跳转到我们自己的函数地址,以此接管对目标函数的调用,并插入自己的处理代码。采用这种挂钩方式的好处在于,我们可以获取网页恶意代码的反混淆结果,但不会使其在系统中真正执行和感染系统。
我们构建了一个基于Detours的DLL注入程序来拦截IE浏览器中的所有和网页代码执行以及反混淆相关的关键函数,包括 CWindow_execScript,CDocument_write,JsEval,JsUnescape,VbsEval,VbsExecute,VbsUnescape等,此外我们还挂钩了重定向函数,各类ActiveX插件。
以JsEval函数为例,挂钩后的函数调用如图5所示。
这样,当浏览器解析网页代码执行到需要调用JsEval这个目标函数 (即True_JsEval)时,将直接跳转到我们的拦截函数中去执行我们自己的My_JsEval拦截函数 (步骤1)。拦截函数接着调用trampoline函数 (步骤2),trampoline函数保存了JsEval目标函数前几个指令以及一个无条件转移。trampoline函数随后调用JsEval目标函数 (步骤3),而JsEval目标函数调用结束后会返回到我们的拦截函数 (步骤4)。拦截函数最后向最初的调用函数返回执行结果 (步骤5)。
在具体的实现过程当中,关键在于拦截函数的函数声明和变量格式必须要同目标函数保持一致。而我们对于Internet Explorer 9浏览器的关键组件进行了大量的逆向分析工作,掌握了其中解码和反混淆相关函数的参数格式及变量类型。My_JsEval拦截函数的代码如图6所示。
因此当触发钩子时,DLL将被挂钩的函数的运行内容转入我们重写的detour拦截函数中执行并得到反混淆结果,同时以JSON格式保存以用于下一步分析。挂钩执行后的反混淆结果包括脚本源代码,完整的脚本解析操作,DOM树操作,加载的插件和有效载荷 (payload)等内容,具体格式如下:
CONTENT:= {“Hook”:HOOK,“Tree”:TREE} //文件的内容
HOOK:= {HCONTENT}| {}
HCONTENT:= HVT|HVT,HCONTENT
HVT:= “HOOKNAME”:VTPAIR
HOOKNAME:=ExecScript|JsEval|JsUnescape|Redirect|VbsEval|
VbsExecute|VbsExecuteGlobal| VbsUnescape| Write //挂钩类型
VTPAIR:= {VTCONTENT}| {}
VTCONTENT:=VT|VT,VTCONTENT
VT:= “VALUE”:TIMES //表示网页脚本执行的源码和相应脚本执行的次数
TREE:= {NODE}
NODE:= “URL”:[SOURCE,SUBTREES]//DOM Tree的节点URL和源码
SUBTREES:= {NODES}| {}
NODES:=NODE|NODE,NODES
图6 My_JsEval拦截函数的代码
2.2.2 Shellcode检测
在网马执行环节中,攻击者往往通过在内存中注入Shellcode来达到下载恶意程序的目的。Shellcode是网马利用漏洞进行攻击的关键部分,因此Shellcode的检测也尤为重要。
我们采用了Pylibemu[16]对反混淆后类似Shellcode的代码部分进行动态仿真。Pylibemu在封装了Libemu的基础上提供了更多的检测功能。它基于对x86汇编语言的解析和模拟执行,通过对内存和CPU的模拟来测试字符串能否作为一段汇编语言动态执行,以此来检测源码中是否含有Shellcode。
另一方面我们在Pylibemu原有基础上进行了改进。在动态仿真同时会监测内存分配的大小,若内存分配空间巨大,如几百 MB,则很有可能是Shellcode堆喷射 (heap spray)的结果。堆喷射技术通过在堆中连续分配由NOP指令和Shellcode组成的代码来绕过内存地址分布随机化机制 (ASLR),以此来达到执行Shellcode的目的。
2.3 静态检测实现
有些网页木马 (比如现今流行的Java网页木马)所利用的漏洞属于逻辑型漏洞,触发时不需要在内存中动态执行Shellcode,因此本文采用了静态特征码匹配作为辅助检测手段,弥补了动态检测的不足。
我们根据大量样本与典型特征创建自定义的逻辑特征码数据库。除了一些常见的加密解密、读写操作之外,高混淆木马还存在一些特有的特征码,包括特定的源码字符,函数调用,特殊判断语句等,部分特征码示例见表1。这些特征码需要联合判断,当满足其中多个特征条件时可以断定为恶意代码。如对于Sakura exploit kit 1.1,当解析后的代码中出 现 “PluginDetect”或 “Java”且 “<applet”、“document.write”、“param”和 “Main.class”等关键字出现次数满足一定条件时,就可以认为是恶意代码。
表1 高混淆木马特征码示例
本系统的静态检测使用基于ClamAV[17]的开源杀毒引擎,特征码格式如下所示:
“SignatureName;TargetDescriptionBlock;LogicalExpression;Subsig0;Subsig1;Subsig2...”
其中SignatureName为特征码的唯一名称,Target DescriptionBlock为目标类型参数,LogicalExpression字段包含了逻辑表达式,Subsig是特征码,以十六进制表述。如对于只含有逻辑漏洞利用的Sakura exploit kit,它的特征码匹配字符串可以为:
(PluginDetect"|"Java") & (((" <applet" =2) & ("document.write" =2) & ("param">4)) |"Main.class")
使用逻辑特征码语法,上述特征码表述为下列匹配规则:
Sakura exploit kit;Target:0;(0 & 1) & (((2=2) & (3=2) & (4>4))|5);
506C7567696E446574656374 ;4A617661;3C6170706C 6574;646F63756D656E742E7772697465;706172616D;4D 61696E2E636C617373
最后我们将上述规则加入特征码数据库中即可应用到静态检测引擎。由于这里是对反混淆后的代码进行特征码匹配,因此不存在特征码被加壳或者混淆的问题。
3 实验比较与结果分析
为了验证本文所设计实现的系统对高混淆网页木马的检测效果,我们进行了实验测试并和Wepawet项目,Virus Total[18]等检测网站进行了对比验证。我们使用的恶意样本库来源于上海交通大学网络中心,urlQuery.net、Malware-DomainList、MalwareBlacklist.com.等著名网马发布站点,共有500多条,涵盖了目前流行的绝大多数网页木马,主要是高混淆恶意代码。此外,我们还通过正常网页的测试来验证系统的误报率。实验测试的结果见表2和表3。
图7 是本系统和 Wepawet、VirusTotal系统检测率的对比结果。
从图7中可以看出,本文所设计实现的系统对各类网马样本的识别达到了接近90%的检测率,比Wepawet和VirusTotal取得了更理想的网马检测效果。在误报率方面,本系统的误报率较低,Wepawet的误报数也较低,而VirusTotal由于使用了黑名单机制,对于曾经挂马现在已经恢复或失效的网站会存在误报,因此误报率较高。
表2 针对流行高混淆网马样本库的检测结果
表3 针对正常网页样本库的检测结果
在我们检测的样本中,大部分为Blackhole Exploit kit和Redkit Exploit kit,这也是符合目前高混淆网页木马的流行趋势。从检测结果来看,针对这些类型的网页木马,本系统能够达到很好的检测效果。而某些类别的网页木马及其载体Exploit Kit,由于样本数较少 (比如最新的G01pack exploit kit,样本数目小于5个),或者页面存活期短,对访问要求限制较高等原因,本系统对它们的检测还存在不足,这也是本系统今后改进的方向。
4 结束语
面对日益更新的网页木马混淆和躲避手段,本文提出了一种新颖的检测方法:通过对受保护环境中IE浏览器的关键函数进行挂钩,让其访问待检测的网页URL地址,从而获取反混淆后的原始代码,且不会真正触发漏洞,无需频繁恢复检测环境;随后在上述动态检测基础上添加了静态特征码检测方式,以此实现了一套动静结合的网页木马检测系统。本系统具有检测率高,误报率低和资源开销小等优点。因此,本系统稍加改进完善之后,可用来定期性主动检测挂马网站,尤其是利用Exploit Kit生成的高混淆挂马页面;也可用来部署在企业网关处,检测现今流行企业APT攻击中的隐蔽网页挂马攻击。
[1]Sophos.Security threat report 2013 [R/OL].[2013-01-13].http://www.sophos.com.
[2]Kotov V,Massacci F.Anatomy of exploit kits [M].Engineering Secure Software and Systems.Springer Berlin Heidelberg,2013:181-196.
[3]Nazario J.PhoneyC:A virtual client honeypot [C]//Proceedings of the 2nd USENIX Conference on Large-Scale Exploits and Emergent Threats:Botnets, Spyware, Worms,and More.USENIX Association,2009.
[4]Seifert C,Steenson R.Capture-honeypot client(capture-hpc)[R/OL].[2008-8-14].https://projects.honeynet.org/capture-hpc.
[5]Ikinci A,Holz T,Freiling F C.Monkey-spider:Detecting malicious websites with low-interaction honeyclients [C]//Sicherheit,2008:407-421.
[6]Cova M,Kruegel C,Vigna G.Detection and analysis of driveby-download attacks and malicious JavaScript code [C]//Proceedings of the 19th International Conference on World Wide Web.ACM,2010:281-290.
[7]Canali D,Cova M,Vigna G,et al.Prophiler:A fast filter for the large-scale detection of malicious Web pages [C]//Proceedings of the 20th International Conference on World Wide Web.ACM,2011:197-206.
[8]Sophos.Inside a black hole:Part 2 [R/OL].[2012-12-12].http://www.sophos.com/en-us/why-sophos/our-people/technical-papers/inside-a-black-hole-part-2.aspx.
[9]Provos N,Mavrommatis P,Rajab MA,et al.All your iframes point to us [C]//17th USENIX Security Symposium,2008:1-16.
[10]Curtsinger C,Livshits B,Zorn B G,et al.ZOZZLE:Fast and precise in-browser JavaScript malware detection [C]//USENIX Security Symposium,2011:33-48.
[11]Canali D,Cova M,Vigna G,et al.Prophiler:A fast filter for the large-scale detection of malicious Web pages [C]//Proceedings of the 20th International Conference on World Wide Web.ACM,2011:197-206.
[12]Invernizzi L,Comparetti P M,Benvenuti S,et al.EVILSEED:A guided approach to finding malicious Web pages[C]//IEEE Symposium on Security and Privacy.IEEE,2012:428-442.
[13]Choi J,Kim G,Kim T G,et al.An efficient filtering method for detecting malicous Web pages[M]//Information Security Applications.Springer Berlin Heidelberg,2012:241-253.
[14]Kapravelos A,Shoshitaishvili Y,Cova M,et al.Revolver:An automated approach to the detection of evasive Web-based malware [C]//USENIX Security Symposium, 2013:637-653.
[15]Qu B,Shu J,Huang Y,et al.Memory leak dynamic monitor based on hook technique [C]//International Conference on Computational Intelligence and Software Engineering.IEEE,2009:1-4.
[16]Jason Jones.Shellcode detection using python [R/OL].[2011-12-05].https://github.com/buffer/pylibemu.
[17]Kojm T,Cathey M,Cordes C.Clamav anti-virus [R/OL].[2008-04-14].http://www.clamav,net.
[18]Hispasec Sistemas S L.Virustotal malware intelligence service[R/OL].https://www.virustotal.com/,2013.