写点什么

IE 安全系列:脚本先锋(1)

  • 2015-07-10
  • 本文字数:6666 字

    阅读完需:约 22 分钟

声明:为了更好地向读者输出更优质的内容,InfoQ 将精选来自国内外的优秀文章,经过整理审校后,发布到网站。本篇文章作者为乌云白帽子 blast,原文链接。本文是《IE 安全系列》第三篇,已由乌云网授权InfoQ 中文站转载。欢迎转发,但请保留原作者信息!

作者 blast

回顾一下,前两篇概述了一下IE 的历史:各个版本新增的功能、简单的HTML 渲染逻辑和网站挂马对IE 安全带来的挑战。

从这章开始,将继续以网马为契机,逐渐深入讲述IE 的漏洞分析与安全对抗的相关知识。 脚本先锋系列将持续4 章,前2 章内会介绍网马中常见的加密方式和处理对策。后续会介绍对Shellcode 的分析,共2 章。

1、HTML 与网马攻击 2 — 权限问题

网马是离不开脚本的,上一章中也介绍了最基础的混淆,或者更准确的说是编码,因为 escape 的确就是为了编码用的。

我想从实际发生过的网马的例子来介绍这章的内容。

(点击放大图像)

请看以上代码。这个是发生在真实世界中的挂马页面。这些挂马的服务器随时有可能停止,所以我已将该页面存档,详见附件1 (解压密码www.wooyun.org)。由于是从挂马页面直接抓取,杀毒软件可能会报告病毒,如果担心安全问题,建议在虚拟环境内处理样本。

这个网马利用了VBScript 整数溢出的漏洞( CVE-2014-6332 )。这个著名的漏洞网上也已经有很多分析,如果不了解的话,大家可以参考下这些分析文章。 本章只是介绍脚本层面的内容,所以二进制分析将在后续章节进行,视所占篇幅挑选部分漏洞进行分析。

以下将对这一部分涉及到的脚本和攻击点进行简单讲解。

在页面最开始可以看到有一串 META 的标记,这是因为 Internet Explorer 11 中(Edge 模式)已经不支持 VBScript,可以看到为了兼容,挂马代码在最前面要求 IE 模拟 IE8,这样就可将渲染模式强行改为 IE8,从而支持 VBScript 的执行。

复制代码
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >

接着,这个页面中出现了两块 SCRIPT 标签:

可能有的同学会对代码执行的优先顺序产生疑惑,在 IE 中脚本的执行顺序是:

(1)谁的块(SCRIPT)在前面谁先执行;

(2)各个分块中,函数优先被解析,但是不执行,函数解析完成后,从最外层的 Public 代码的第一行开始执行;

(3)各个分块中如果没有容错语句,遇到错误的代码之后,该分块后面的代码不会运行。但是不会影响到其他分块的内容;

(4)在 JavaScript 中,容错代码是 try{}catch(…){},在 VBScript 中,容错代码即为:On Error Resume Next;

这样,可以看到第一节中定义了一个函数,函数中会调用 CreateObject 创建 wscript.shell、 Microsoft.XMLHTTP、ADODB.Stream 三个对象。

这三个对象的 GUID 分别是:

复制代码
Wscript.shell: 72C24DD5-D70A-438B-8A42-98424B88AFB8
Microsoft.XMLHTTP: ED8C108E-4349-11D2-91A4-00C04F7969E8 *(progid:
Microsoft.XMLHTTP.1.0)
ADODB.Stream: 00000566-0000-0010-8000-00AA006D2EA4

在注册表中查看这 Wscript.shell、ADODB.Stream 的 guid,你会不约而同的发现:

对了,这两个 ActiveX 对象的 Safe for script 和 Safe for init 均被设置为了 False,这使得他们无法在 Internet zone 被加载,而在本地域下使用它们的话,Internet Explorer 会弹出:

Internet 域默认的是“中 - 高”级别,在此级别下这类脚本会被禁止执行(同时触发一个异常)。

漏洞如果成功执行,会把安全检查的开关关闭,导致这些原先被标记为不安全的对象全部都可以成功创建并运行,这样甚至不需要理会任何现有防御机制(例如 ASLR 等)即可攻击用户电脑。

可以看到该网马最后运行了这个函数。这个函数即会下载一个 EXE 并运行。该 EXE 即为木马程序。

而其他的,该网马最后还有这么一句,首先是创建一个 iframe 指向木马 exe:hxxp://116.255.195.114/server.exe,然后又用 window.open() 打开一个新窗口,url 也是这个 exe。

这两个语句的结果都是让 IE(其他浏览器也是如此)弹出来一个下载提示:

这是坑用户的最后一步,只要用户不点运行就没有问题,而且这个 URL 几乎被国内的所有杀软都入库了,想必也不会骗到多少人。

需要注意的是该网站还有一个“1.js”,这个 JS 文件 404 了,内容我们不得而知。不过看前面这么明显的“JS 挂马”字样,也许作者是把这个 JS 的内容也一起并到了这个网页中也说不定。

最终,我们知道了,这个网页是想要让用户下载 server.exe。仅仅从杀软的报告来看,这个 exe 是一个远控程序。针对此类体积适中的木马程序,比较简易和方便的调试环境是 Sandboxie+OllyDbg,或者 VMWare+ 调试工具,后者可能占内存较多,前者比较轻量也很容易整理。但是需要注意不要被有些病毒样本穿出了沙箱从而影响到真实系统。这部分内容不在本系列的介绍范围内,故不再赘述。

(点击放大图像)

在搜刮今天的挂马网站列表的时候,我还看到了如下例子(详见附件2 解压密码www.wooyun.org),这是类似熊猫烧香的一个病毒Ramnit 感染的,他就是我之前说的,给每个HTML 都挂上一段脚本,这个脚本需要本地权限才可以提示执行,不过万一用户点击允许了呢,这样,这个病毒就会重新死而复生了(也许这段代码和上面 CVE-2014-6332 配合起来才更好):

图:Ramnit 感染的例子

该病毒感染的文件几乎可以被所有杀毒软件修复。

2、HTML 与网马攻击 3 — 反混淆

以上针对简单的例子进行了讲解,现在我们将看一些带有混淆的例子。

这一节中的例子并不是十分困难,只要仔细观察,是一定可以轻松解开的。一些比较难解的例子将在下一章中介绍。

1).JS 压缩后的结果

让我们看一看这个例子,详情见附件3 (解压密码www.wooyun.org)。这个脚本是 CVE-2004-0204 的一个利用代码,取自以前的某个网马记录,乍一看这个东西代码复杂而恶心无从下手,但是其实如果你记得上一章所说的,eval 最终会执行第一个参数内的函数,而这里第一个参数就是一个 function,因此只需要将 eval 替换为 alert,执行即可得到内容:

红框处即为木马要下载的文件地址。

不过知其然不知其所以然不太好,让我们简单阅读一下代码:

可以看出来函数实际为:

复制代码
eval(
function (p,a,c,k,e,d){} (p, a , c ,k ,e ,d)
)

这实际上是把这个拥有 6 个参数的匿名函数的返回值传给了 eval 执行,因此返回值至少是解密过 1 次的代码。

如果还是不了解,这么看你就明白了:

复制代码
var a = function(){return 1}();
alert(a.toString());

最初(2007),除了极少的 JS 库之外,这种代码大多数都被用在挂马上,不过之后,jspack 倒是由于它有压缩代码的功能,被很多网站采用了。如果你也想生成这样的代码,不妨百度搜索一下 eval 压缩。

2). 简单的代码阅读

(点击放大图像)

这个页面中(详见附件 4 (解压密码 www.wooyun.org)),我们看到有一段加密的代码十分奇怪,

通过阅读代码可知这段代码其实就两段:

定义函数 xViewState();
调用函数 xViewState()。

通过阅读函数 xViewState,我们可以发现前半段都是在解密数据,而与页面或者脚本有交互的地方仅有 document.write 一处,因此,将 document.write 替换成 alert 即可知道最后它要写入页面的内容。

请注意,document.write 写入 DOM 的内容会立即被渲染执行。

看来它是在写入一段 style 信息,将.nemonn 移动到 -9999px top 的地方,这表示这个内容将不在页面的可视范围内。为什么要这么做呢?想必你也知道了:挂黑链。

该页面中另一处隐藏的地方,阅读这个代码也许你就更清楚它想干什么了:

图:黑链不显示在首页的代码

这种方式已经被 Google 列为打击对象。用脚本加密的方式倒是可以算作是与 Google 的一个“对抗”。

3). 工具处理

鉴于 JavaScript 中可以轻易地劫持一个对象,因此我提供的工具中也有简单的替换功能:

(点击放大图像)

4).Exploit Kit 示例

这是臭名昭著的 Nuclear Exploit Kit 的载入页(学名 Landing Page)一个较简单的例子。

(点击放大图像)

图:Nuclear EP 的Landing Page 观察页面(附件5 (解压密码www.wooyun.org)),可以发现页面结构类似:

复制代码
<SCRIPT> ... </SCRIPT>
<ELEMENTS> DATA </ELEMENTS>
<SCRIPT> ... </SCRIPT>

三段,由于 ELEMENTS 的内容必然是不能执行的,所以分析的重点应该放在 SCRIPT 中间的内容。

(点击放大图像)

先对第一段去混淆。可以发现代码中注释占了一半的篇幅,所以先批量删除。

(点击放大图像)

然后将JS 代码格式化,

(点击放大图像)

然后稍作整理(详见附件6 (解压密码www.wooyun.org)),可以看到此时几乎已经很容易就能知道这段代码做的什么了:

页面的第三个SCRIPT 块(附件6 (解压密码www.wooyun.org), LN78)

复制代码
<script>aiTsnQh(EOHCnD("iaTyv"));</script>

事实上调用了 EOHCnD 这个函数,这个函数的定义是:

(点击放大图像)

阅读可知,

复制代码
LN29:生成对象 document;
LN30:调用 document”getElementById”.innerHTML[”replace”](/[
]/g,’’) 将空格删除; LN32-33: 实际是 substr 的混淆;
LN37-50:从第一个字节开始,每 2 个字 substr 一下,转为数字,如果小于 10 原样不动,大于 10 的话 -2,然后保存在 MvBLCx 变量中
LN52: 返回解密后的字符。

也就是说,很简单,这个 EOHCnD 就是解密的函数,因此,我们执行页面并把它的返回值输出即可。

第三个 SCRIPT 块改为 Console.log:

得到解密后的内容(详见附件7 (解压密码www.wooyun.org))。该脚本会将参数传给漏洞利用程序(SWF, 附件8 (解压密码www.wooyun.org))来执行。SWF 的内容之后再提。

以上就是本章内所有解密内容,大家可以对照附件的恶意脚本进行一些解密试验。接下来,再概述一下IE 中ActiveX 的一些知识。

3、IE 渲染网页时 ActiveX 处理方式和安全限制

在 IE 渲染网页时,ActiveX 对象一直是漏洞挖掘者喜闻乐道的东西。ActiveX 控件是指基于 COM(微软的组件对象模型)设计出来的一种可以重用的组件。因为它能“Active”在各种东西上,所以大概就因此叫了这个名字。

ActiveX 控件可以通过<OBJECT>标签,或者脚本中 CreateObject 或者 new ActiveXObject 的方式创建一个实例。

(点击放大图像)

图:XP 下 CVE-2010-0886 溢出漏洞的利用代码,正在向对象传入一个过长的 docbase 参数

ActiveX 对象是一个二进制文件,那么如果这个二进制文件中包含有一些危险操作,那么必然可以对用户机器做一些不好的事情。因为 ActiveX 控件几乎可以做所有普通程序可以做的事情,所以恶意的 ActiveX 将是十分致命的,尤其是在 IE 中加载起网页指定的 ActiveX 控件,安全和便利又因此发生了冲突,是好是坏赞否两论。

关于它的反面说法其一是由于“历史问题”,XP 下 ActiveX 与 IE 权限等同,且大部分人都是管理员权限登录的,所以导致 ActiveX 也有管理员权限。该问题在 Vista 引入的 IE 保护模式中得到改善。

简单介绍一下 ActiveX 的安全标记 Safe For Scripting。标记为 Safe For Scripting 的控件理应不会被任何不信任的脚本(简单说就是别人提供的,开发者也无法预见的内容)恶意利用,比如泄露隐私,执行文件,或者干脆干扰了其他软件正常功能。

还有一个就是参数的传入,当传入的初始化数据是不可信的时候(比如我指定一个控件背景色是 RGB(999, -1, “abc”) 的时候),插件也不能崩或者因此就不工作了(Safe For Initializing),谁知道用户会传给你什么呢。

要想让 ActiveX 可以参与 IE 的脚本互动,必须要确保对任何脚本宿主来说这个插件都能安全执行,也要把插件注册为“Safe For Scripting”。

有两种方式可以这么来,一是在注册表中写入键值,二是继承 IObjectSafety 接口(ATL 也提供了个 IObjectSafetyImpl 方便你操作)。

(点击放大图像)

图:一个控件使用IObjectSafety 的例子

IObjectSafety 有 GetInterfaceSafetyOptions、SetInterfaceSafetyOptions 这对函数,GetInterfaceSafetyOptions 应当返回 ActiveX 控件的安全特性(Safe For Init?Safe For Scripting?),SetInterfaceSafetyOptions 由宿主调用,告诉控件应当具有什么安全特性。

图:IObjectSafety 的定义,参考 VC 运行库中 objsafe.h 的具体代码

图:GetInterfaceSafetyOptions 的实现,参考 VC 运行库中 atlctl.h 的具体代码

这部分的具体内容可以参考《COM 本质论》。

让我们简单讨论一下 ActiveX 在 IE 中的实现,之前说到,<XX>括起来的元素多是继承了 CElement,<OBJECT>也不例外,OBJECT 对应的类为 CObjectElement,继承于 CElement。

在解析到 OBJECT 时,该对象会:

复制代码
1. 试图读取参数,找到 CLSID 和其他参数信息;
2. 读取 CODEBASE 的值并解析存入 Property Bag,这个值可以是:
2.1 绝对 URL;(http://drops.wooyun.org/xx.cab#version=xxx)
2.2 相对 URL;(xx.cab#version=xxx)
2.3 无 URL;(#version=xxx)
3. 读取其他参数并解析,存入 Property Bag;
4. 加载该 OBJECT;

在加载 OBJECT 时,IE 会:

  1. 检查缓存,这个缓存会缓存一些指向 IDispatch 的指针,如果已经命中缓存了,这次就不需要再去 Query 了;
  2. 确保 ActiveX 控件可以安全加载(SafeForScripting)且可以访问;如果这步检测失败,IE 会返回 E_ACCESSDENIED。

IsSafeToScript 是 COleSite 的一个函数,该函数会:

一. 检查用户是否已经关闭了 ActiveX 的安全检测(检查域是否设置了 URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETY);

图: MSDN

二. 如果当前内容是 Java Applet,检查用户是否允许 Applet 加载,不允许直接返回禁止;

三. 检查控件的 IObjectSafety 属性,标记为 Safe For Scripting 时通过;

四. 当标记为不通过且用户选择提示时,弹出提醒,告诉用户要加载的 ActiveX 插件不安全;

五. 安全时载入该控件。

以上就是 IE 加载 ActiveX 控件时的通用动作,下面我们再简单介绍一下 IE 针对 ActiveX 控件做的一些安全改进:

1、自 IE7 开始,引进了 Activex Opt-In,这个功能的作用是:默认关闭大部分的 ActiveX,当网站请求执行某个 ActiveX 控件的时候,IE 会弹一个信息条:

图:信息条,via Google Image

图:安全警告,via Google Image

当用户确定时,这个控件才会加载。

这些插件不属于“大部分”之列:

a. 升级到 IE7 之前已经用过的插件;
b. IE7 预存了一个白名单,这里面都是经过检验的,而且很多都是常见的 ActiveX;
c. 用户在浏览器中下载并安装的控件;

图:白名单,位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Ext\PreApproved

2、IE8 (+Vista)引入了 Per-User (Non-Admin) ActiveX,它允许用户以非管理员权限安装 ActiveX 控件,微软声称此举是为了让用户更好的使用 UAC 特性,因为如果你以普通用户权限安装了一个恶意的 ActiveX 控件,除了影响当前用户,整体的系统安全倒不会受到严重影响,因为这个 ActiveX 控件也是和当前用户一个权限。

IE8 中,ActiveX 也可以按网站开启。从这个时候开始,KillBits 功能还被整合进了 Windows Update,这样微软就可以在 ActiveX 出现问题之后收拾残局。

Vista 中 IE 还引入了保护模式,保护模式下 IE 运行在低完整性级别,这意味着即使 ActiveX 被攻破,也不能写入一些敏感数据。

3、IE9 中,增加了 ActiveX Filtering 功能,可以让用户在所有网站禁止运行控件而不会弹出提示。

4、IE10 中 ActiveX 控件的加载会经历多个检测,包括组策略,权限检查等;ActiveX 控件有和浏览器等同的权限。当开启 EPM 之后,只有支持 EPM(同时有支持 32/64 位文件,且兼容 AppContainers)的 ActiveX 控件才会被加载。

5、IE11 (+Windows 8)会自动扫描 ActiveX 并阻止恶意 ActiveX 运行。

同时,微软还推送了一些 Out-Of-Date ActiveX 功能,这个估计是学的 Chrome 和 Firefox,把一些过时的 ActiveX 屏蔽掉。

6、 Spartan(IE12),不支持 ActiveX 和 BHO。

而是用一个“扩展系统”来安装。“旧风格”(内网,需要旧版本支持的网站)网站使用 IE11 来渲染。

可见,微软对自己的这套东西是有多爱就有多恨,至于 Spartan 到底能不能完成这一系列的安全进步和兼容性过渡,就要看微软之后到底怎么完善它的“扩展系统”了,是变得更安全还是又多一个烂摊子,让我们拭目以待。

附 参考资料

  1. 本文中所有例子下载地址,解压密码 www.wooyun.org
  2. 自己写的 Redoce 3 解密工具下载地址,2013 年 3 月最后一版,已不再维护。
  3. https://www.blackhat.com/presentations/bh-usa-08/Kim/BH_US_08_Kim_Vista_and_ActiveX_control_WhitePaper.pdf
  4. http://blogs.msdn.com/b/ie/archive/2015/01/22/project-spartan-and-the-windows-10-january-preview-build.aspx

感谢魏星对本文的策划和审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-07-10 00:015765

评论

发布
暂无评论
发现更多内容

IPSec的特征与功能

阿泽🧸

6月月更 IPsec

跟我学Python图像处理丨5种图像阈值化处理及算法对比

华为云开发者联盟

Python 人工智能 华为云

SDN特有的网络安全问题

穿过生命散发芬芳

SDN网络 6月月更

直播预告 | 在阿里云 ESSD 云盘上部署 PolarDB for PostgreSQL 集群

阿里云数据库开源

数据库 postgresql 阿里云 开源

一、Kafka安装

星期35

手慢无!阿里P8架构师力荐Spring生态全家桶全彩笔记

Java全栈架构师

spring 编程 源码 程序员 面试

致广大、尽精微,曙光问道算力服务“神经系统”

脑极体

入驻快讯|欢迎XCHARGE智充科技正式入驻 InfoQ 写作社区!

Geek_60c26d

在线沙龙 | 开源小秀场——数据库技术应用实践

SelectDB

数据库 技术分享 apache doris 沙龙

【MySQL字符串数据类型优化】char和varchar的区别

写代码两年半

数据库 sql 6月月更

10个常见触发IO瓶颈的高频业务场景

华为云开发者联盟

数据库 sql 索引 华为云 数据清理

企业内部Wiki,你建立了么?

小炮

GameFi新的启程,AQUANEE将于6.9日登陆Gate以及BitMart

BlockChain先知

区块链创业必看——黑客松冠军项目是如何成功的?

TinTinLand

区块链

【LeetCode】最长连续序列Java题解

Albert

LeetCode 6月月更

尽一份孝心,为家人做一个老人防摔报警系统

华为云开发者联盟

IoT 华为云 防摔倒报警系统

进击的巨人:深入浅出,玩转以太坊 PoS 合并

TinTinLand

区块链

【Spring 学习笔记(八)】Spring IoC/DI注解开发 之 原始注解开发

倔强的牛角

Java spring Java EE 6月月更

每日一题——leecode59( 螺旋矩阵 II)

武师叔

6月月更

vue指令-5

小恺

6月月更

不止于观测|阿里云可观测技术峰会正式上线

阿里巴巴中间件

阿里云 云原生 可观测技术峰会

react框架学习之深入研究【王道react】

恒山其若陋兮

6月月更

【首发】根据壁纸修改App主题,它真的来了

yechaoa

android 6月月更 material design

身为程序猿——谷歌浏览器的这些骚操作你真的会吗

孤寒者

6月月更 浏览器操作 小技巧 程序猿必会

【资源分享】综合性的导航网站

小炮

从源码解析flutter_redux 的精准局部刷新

岛上码农

flutter ios 安卓开发 跨平台应用 6月月更

【愚公系列】2022年06月 面向对象设计原则(四)-依赖倒置原则

愚公搬代码

6月月更

数据库每日一题---第7天:订单最多的客户

知心宝贝

数据库 程序员 前端 后端 6月月更

线程池

急需上岸的小谢

6月月更

什么是集群?为什么要使用集群架构?

Finovy Cloud

集群架构 云渲染 GPU服务器

干货合集│最好用的 python 库都在这

Python 有趣的技术知识 6月月更

IE安全系列:脚本先锋(1)_安全_blast_InfoQ精选文章