最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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:013112

评论

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

【资损】资损防控的系统规范之服务接口类设计

小明Java问道之路

架构 微服务 金融 10月月更 资损

2022-10-19:一个数组如果满足 : 升降升降升降... 或者 降升降升...都是满足的 给定一个数组, 1,看有几种方法能够剔除一个元素,达成上述的要求 2,数组天然符合要求返回0 3,剔

福大大架构师每日一题

算法 rust 福大大

如何监测MySQL是否命中索引?

乌龟哥哥

10月月更

深入理解java中的自动装箱与拆箱

乌龟哥哥

10月月更

聊聊 K8S:K8S集群搭建实战

老周聊架构

k8s 10月月更

什么是IP路由?思科与华为在IP路由配置上有啥区别?

wljslmz

路由器 动态路由 静态路由 10月月更 IP 路由

工赋开发者社区 | 最小可行架构注意事项:必须考虑分布式处理和数据的位置

工赋开发者社区

ZooKeeper基本架构

穿过生命散发芬芳

zookeeper 10月月更

如何进行项目管理?

老张

项目管理

CAN与CAN FD通信之间存在的问题

不脱发的程序猿

汽车电子 CAN总线 CAN FD总线 CAN与CAN FD通信问题 CAN与CAN FD通信

工赋开发者社区 | 即使是程序员也会喜欢这8种无代码/低代码工具

工赋开发者社区

运维服务体系架构

阿泽🧸

10月月更 运维服务

【愚公系列】2022年10月 Go教学课程 033-结构体方法重写、方法值、方法表达式

愚公搬代码

10月月更

一份经过时间检验的 Laravel PHPUnit 测试经验分享

乌龟哥哥

10月月更

【内网渗透】一次简单内网靶场渗透

网络安全学海

黑客 网络安全 安全 信息安全 渗透测试

Centos7 搭建Jupyter NoteBook教程

Yeats_Liao

后端 虚拟机 10月月更

Centos7 搭建单机Spark分布式集群

Yeats_Liao

后端 虚拟机 10月月更

你一定要看的:Go slice切片详解和实战

王中阳Go

Go golang 高效工作 学习方法 10月月更

工赋开发者社区 | 精益思想与数字化技术难融合?

工赋开发者社区

docker学习笔记(二)

Studying_swz

Docker 10月月更

一文搞懂CAN和CAN FD总线协议

不脱发的程序猿

汽车电子 通信协议 CAN总线 CAN和CAN FD总线协议 CAN FD总线

工赋开发者社区 | Gartner发布2023年十大战略技术趋势

工赋开发者社区

牛客刷题系列(完全数计算,扑克牌大小)

雪芙花

c c++ 10月月更

nginx快速入门

Studying_swz

10月月更

Spring Boot「09」Property 高级特性

Samson

Java 学习笔记 Spirng spring-boot 10月月更

Pixel系列还能打,靠的是什么?

脑极体

人工智能

cstdio的源码学习分析11-格式化输入输出函数fprintf---format解析跳转表逻辑分析

桑榆

c++ 源码刨析 10月月更

基础结构:链表 回文链表

二哈侠

Python 10月月更 回文数

C/C++的类型转换

雪芙花

c c++ 10月月更

C++11智能指针(auto_ptr,unique_ptr,shared_ptr,weak_ptr的详解与模拟实现)

雪芙花

c c++ 10月月更

docker学习笔记(一)

Studying_swz

10月月更

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