WF曲速未来消息:在7月11日的时候发现了一个高风险的Internet Explorer(IE)漏洞,就在微软7月补丁周二的第二天。虽然此漏洞(现在指定为CVE-2018-8373)会影响最新版Windows中的VBScript引擎,但Internet Explorer 11并不容易受到攻击,因为默认情况下Windows 10 Redstone 3(RS3)中的VBScript已被有效禁用。
然后发现了恶意网络流量中的漏洞。URL如下所示:
![](http://img.xiumi.us/xmi/ua/qCw7/i/e92984bbf8f829b73e1c0eb1fdef5839-sz_3420.png)
发现了这种漏洞之后,从而进行了更深入的分析。有趣的是,发现此漏洞利用示例使用与CVE-2018-8174相同的混淆技术,CVE-2018-8174是5月份修补的VBScript引擎远程执行代码漏洞。
![](http://img.xiumi.us/xmi/ua/qCw7/i/3169fe869b5b363408c92340a9c44a15-sz_187744.jpeg?x-oss-process=style/xmorient)
题
此外,这是用于运行shellcode的示例exploit的方法:
![](http://img.xiumi.us/xmi/ua/qCw7/i/d5297b04a31e6e3c898d79abd80a3be1-sz_181048.jpeg?x-oss-process=style/xmorient)
经过调查怀疑这个漏洞利用样本来自同一个创建者。因为经过分析显示它在vbscript.dll中使用了一个新的use-after-free(UAF)漏洞。
漏洞根本原因分析
现在详细介绍对此漏洞的分析,该漏洞已在微软周二的八月补丁中得到解决。由于原始漏洞被严重混淆,就进行演示了一个概念验证(PoC)来解释如何利用此漏洞:
![](http://img.xiumi.us/xmi/ua/qCw7/i/5bb0bccaab0caeff43b2e02c3d56b908-sz_9690.png)
这个PoC定义了一个名为MyClass的类,它有一个名为array的成员变量和两个名为Class_Initialize和Default Property Get P的成员函数。Class_Initialize是一个不推荐使用的方法,现在由New过程替换。首次实例化对象时会自动调用它。在该PoC中,Class_Initialize函数被重载,以及何时呼叫VBScriptClass::InitializeClass后,它会被分派到重载函数。
默认属性是一个类属性,可以在不指定的情况下访问它。在此PoC中,Default Property Get函数重载MyClass的默认属性。当调用访问cls时,它将被调度到重载函数。
漏洞的触发流程可以简化为以下三个步骤:
1.设置cls = New MyClass
这将调用重载函数Class_Initialize。在Class_Initialize中,ReDim数组(2)将调用vbscript!RedimPreserveArray来创建一个元素的计数为3的数组:
![](http://img.xiumi.us/xmi/ua/qCw7/i/0ef73dd947cc734419c6bd1f44c3611f-sz_5703.png)
2. cls.array(2)
它将调用vbscript!AccessArray来获取数组元素的地址。在vbscript!AccessArray中,它将首先检查数组元素的索引是否超出边界:
![](http://img.xiumi.us/xmi/ua/qCw7/i/66c0daabfe3595a8c705ad75125ebb39-sz_15508.png)
然后计算元素的地址,将其保存在堆栈中,并返回以下内容:
![](http://img.xiumi.us/xmi/ua/qCw7/i/2d5f6b3bed809688cc0c865624dba787-sz_94508.png)
3. cls.array(2)= cls
这将调用vbscript!AssignVar将MyClass默认属性值设置为cls.array(2)。获取MyClass默认属性值时,调用公共默认属性Get P并在公共默认属性Get P中执行脚本ReDim数组(1),这将导致原始array.pvData被释放:
![](http://img.xiumi.us/xmi/ua/qCw7/i/46ff4feb1e4f06c7f2b9ae49f1d1f116-sz_10947.png)
但是,如第二步所述,数组(2)的地址仍保存在堆栈中。公共默认属性Get P的返回值将访问释放的内存,从而触发vbscript中的use-after-free(UAF)漏洞!AssignVar:
![](http://img.xiumi.us/xmi/ua/qCw7/i/39344a95f1161ebec1f92efcd434154a-sz_14692.png)
如前所述,vbscript!AccessArray检查数组元素的索引是否超出边界。但是当获取类的默认属性值时,它将触发脚本回调函数Default Property获取修改数组的长度,而不是在vbscript!AssignVar中访问时再次检查数组的元素。
剥削分析
可以通过以下三个步骤简化利用:
- 使用此漏洞将二维数组的长度修改为0x0FFFFFFF。
- 实现读/写原语。
- 伪造CONTEXT结构并执行shellcode。
让我们详细谈谈利用:
1.修改二维数组的长度
首先,漏洞定义了两个数组,在下图中将其标记为array1和array2的数组1是先前在PoC中描述的阵列,且数组2是一个二维阵列,其中每个元素的值是3。
![](http://img.xiumi.us/xmi/ua/qCw7/i/ee03ff234ad4b8de35e9e7012a227d52-sz_11357.png)
然后它使用脚本回调函数Default Property Get释放原始array1.pvData并将array2设置为new array1.pvData。因为原来的大小array1.pvData,这是的0x30字节在存储器中,相同array2.SAFEARRAY结构,一些的array2.SAFEARRAY结构将重用在原释放的内存array1.pvData。同时,Default Property Get的返回值0x0FFFFFFFF将覆盖array2.SAFEARRAY的SAFEARRAYBOUND结构,并将二维数组的长度修改为0x0FFFFFFF。
![](http://img.xiumi.us/xmi/ua/qCw7/i/e513042b60ca51f19d071454d76448bd-sz_14947.png)
![](http://img.xiumi.us/xmi/ua/qCw7/i/d60f309347bf1437a29d64b65b475b70-sz_178389.png)
2. RW原语
这里得到一个数组,array1(index_vuln)(0x0FFFFFFE,2),其长度由UAF调节。通过搜索array1的元素,可以在以下脚本中找到index_vuln:
![](http://img.xiumi.us/xmi/ua/qCw7/i/444bbdb8f52208b496bfcde1adf269ad-sz_7289.png)
然后它使用array1(index_vuln)(0x0FFFFFFE,2)来实现越界(OOB)并找到两个数组元素混淆的元素。
![](http://img.xiumi.us/xmi/ua/qCw7/i/be1a3fa448f65c563924c1fa3bb6ff90-sz_34812.png)
![](http://img.xiumi.us/xmi/ua/qCw7/i/5c2b881d379b2ca0476f9a86101dc0e5-sz_34573.png)
这里漏洞获取两个数组的元素:array1(index_B)(0,0)和array1(index_vuln)(index_A,0),它们在内存中的距离为8字节。在内存中搜索的充分利用如下所示:
![](http://img.xiumi.us/xmi/ua/qCw7/i/6d20e41cdc1d9111bbdbc9d2be20085a-sz_60765.png)
最后,它使用两个数组的元素来实现类型混淆的读写原语:
![](http://img.xiumi.us/xmi/ua/qCw7/i/a3767e301e69e2f9bb272aaa3667e15e-sz_36042.png)
3.运行shellcode
它使用read原语来泄漏模块的地址:
![](http://img.xiumi.us/xmi/ua/qCw7/i/e6dbef142bdbcdef438f9b322b7a3abd-sz_8824.png)
通过将一些VARIANT的VarType修改为0x4d并将值修改为0,将调用vbscript!VAR :: Clear,然后将调用堆栈返回地址修改为NtContinue的地址并伪造CONTEXT结构以运行shellcode:
![](http://img.xiumi.us/xmi/ua/qCw7/i/46475deeb09b60ddd0869f296052e440-sz_4718.png)
![](http://img.xiumi.us/xmi/ua/qCw7/i/15cbdf670a5da22877cb589303631c0a-sz_362671.png)
经过一系列的分析,可以稳定地利用此漏洞。此外,由于它是今年在野外发现的第二个VB引擎漏洞利用,因此预计未来VB引擎中的其他漏洞发现并非遥不可及。
总结
作为第一道防线,区块链安全公司WF曲速未来建议在可用时应用最新的安全补丁以防止漏洞利用。用户还可以使用可以抵御可能漏洞攻击的解决方案。主动,多层次的安全方法是利用漏洞(来自网关,端点,网络和服务器)的威胁的关键。