一、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(针对特定目标的高级持续性威胁)攻击的一种常用手段。
本文来自网易实践者社区,经作者黄龙授权发布。
网易易盾针对政企网站量身打造——集网站内容监控、网站漏洞检测于一体的全方位安全监测九游会网址最新的解决方案,点击免费试用