一、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进行了变形和混淆处理,主要是为了防止杀毒软件和站长的检测和清理,下面是搜集的一些简单的挂马语句:
top.document.body.innerhtml= top.document.body.innerhtml '\r\n';
body{background-image:')}
这样,整个网站挂马已经完成。黑客只需要看着远控,等着肉鸡上线即可。
四、0x04 网站挂马检测
面对如此猖獗的网站挂马,挂马检测是至关重要的。
网站挂马检测的手段主要分为两类:一类是静态检测,主要是针对网站页面的源代码进行分析;另外一种就是动态检测,使用虚拟机访问网站网页,查看是否感染木马。
1) 静态检测
静态检测主要是对网站web页面的源代码进行检测,首先通过分析页面提取出所有引入的url,然后再通过爬虫获取这些页面的源码,通过js代码和恶意的shellcode特征进行匹配和打分,判断该网站是否被挂马。
这种检测方式比较高效,首先将页面爬取下来,然后进行内容分析。
由于静态检测是根据网马的特征进行识别,所以需要定期维护特征库;同时,对于pdf、flash和java插件漏洞的挂马,是需要再进行专门的分析。
静态检测主要有2个技术难点:一个是页面分析,这块包括网马url提取以及网马js代码的分析;另外一个就是网马的检测识别。
页面分析是很多静态检测都存在的问题,第三节也提到过现在的网马都不会简单的iframe引入,一般会使用混淆的语句或者比较复杂的javascript动态生成网马地址,试图绕过检测,比如:
document.write("
同样,网马中的恶意代码基本也是混淆的。
针对这些情况,目前比较主流的至尊全讯大全官网的解决方案是使用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(针对特定目标的高级持续性威胁)攻击的一种常用手段。
本文来自网易实践者社区,经作者黄龙授权发布。
网易易盾针对政企网站量身打造——集网站内容监控、网站漏洞检测于一体的全方位安全监测至尊全讯大全官网的解决方案,点击免费试用