欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Nebula漏洞利用包CVE-2016-0189漏洞利用分析

来源:本站整理 作者:佚名 时间:2017-04-17 TAG: 我要投稿

1. 引言
在最近的一年里, 漏洞利用工具包(EK/Exploit Kit)市场风云变幻。2016年六月初,曾经极为猖獗的Angler EK 销声匿迹,Neutrino EK 迅速填补了空白。随后短短不到3个月时间,Neutrino EK 又转为地下,RIG EK继而成为最流行的漏洞利用工具包。今年3月初,RIG又淡出视线,而迎来了新的Nebula EK。
Nebula EK包中对CVE-2016-0189的漏洞利用,比其它漏洞利用包的漏洞利用方有了一定改进,这里进行一下深入分析。
所用工具:
• IE11(调试Javascript)
• windbg
Nebula EK 的首页,如下图所示。
 

不难看出,页面里包含了混淆过的Javascript代码。进一步分析,这些代码是否有种似曾相识的感觉?对了,代码的混淆方法跟落日漏洞利用工具包(Sundown EK)极为相似。
页面中共有2段Javascript代码, 混淆方法相同。第一段Javascript代码,去掉混淆后,代码如下, 不难看出,这段代码就是CVE-2016-0189的漏洞利用。
 

关于CVE-2016-0189,网上已有一些分析报告,比如Theori的分析[1]。 然而这些分析报告,并未提供在内存层面的技术细节,使得读者总有种知其然,不知其所以然的感觉。本文试图利用windbg来分析漏洞利用时的内存布局,使得读者对该漏洞利用有更深刻的理解。
2. CVE-2016-0189的关键知识点
CVE-2016-0189是个关于VBScript的漏洞。VBScript 脚本引擎代码在vbscript.dll 中。
2.1. VBScript的变量
VBScript 的内存变量占用0×10个字节, 前两个字节定了变量类型VARTYPE。常见类型定义如下表所示[2]。

我们可以在VBScript代码中插入IsEmpty()函数,然后在windbg的vbscript!IsEmpty() 函数上设置断点来观察内存[3]。

图1  调试用VBScript代码

这里,0a560198就是str对象,这里 0008两个字节表示的是VARTYPE,根据表可知,值恰好为vbString(VT_BSTR = 8) 而偏移0×8处存放的就是字符串地址,

这里还可以看出,字符串是Unicode存放的。
2.2. VBScript的数组
VBScript 的数组的定义如下

当访问数组元素时,VBScript引擎会调用 AccessArray 函数来计算元素的存放地址。
试着用windbg 调试如下代码, 在vbscript!AccessArray处下断点:


堆栈中0ab04380即为数组A地址

数组元素存放在 pvData (0x7dfd130) 起始的地方
在 vbscript!AccessArray+0x9d: 指令处停下   (不同版本这个偏移值可能会有出入)

这条指令非常关键,它计算元素A(1,2) 的地址。 这里esi 就是SAFEARRAY的地址,而esi+0c是pvData的地址。eax值就是元素相对于pvData的偏移。查看eax值

为什么A(1,2)的偏移会是0×50呢。 VBScript的数组内存布局和C语言有些不太一样。A数组的内存布局为 A(0,0) A(1,0) A(0, 1), A(1,1), A(0, 2), A(1,2),  而每个元素大小为0×10字节(cbElements)。因此 A(1,2) 的偏移为0×50。
2.3. CVE-2016-0189 漏洞原理初探
CVE-2016-0189 的漏洞在AccessArray 函数代码中。我们看一下这个函数的逻辑:
 

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载