虚拟化逃逸与 Windows 内核提权深度教学
字数 2336 2025-08-29 22:41:32
虚拟化逃逸与 Windows 内核提权深度教学文档
1. 引言与背景
虚拟化平台尤其是 VMware Workstation/Fusion 长期以来被广泛使用,其安全性备受关注。客机(Guest)到宿主(Host)攻击一旦成功,攻击者就可突破 VM 沙箱,直接影响宿主机甚至整个物理环境。
2024年,多位研究者在 Pwn2Own 等竞赛中演示了 VMware Workstation/Fusion 中的多重漏洞链,其中包含客机获取宿主执行权限的关键缺陷:
- CVE-2024-22267:VMware 的 vBluetooth 设备中的 Use-After-Free 漏洞
- CVE-2024-22270:Host-Guest 文件共享(HGFS)功能中的信息泄露漏洞
- CVE-2024-30085:Windows Cloud Files Mini Filter 驱动堆缓冲区溢出漏洞
这些漏洞需要客机内具有管理员权限才能利用,一旦成功链式利用,攻击者可在宿主系统上获得任意代码执行和提权能力。
2. 攻击链总体概述
完整攻击链利用了三大漏洞:
- 信息泄露 (CVE-2024-22270) - 泄露宿主机堆中未初始化数据
- VM Escape (CVE-2024-22267) - 利用虚拟蓝牙 UAF 在 vmware-vmx 进程中执行 ROP
- 内核提权 (CVE-2024-30085) - Cloud Files 驱动堆溢出取得任意写,劫持 Token
攻击链逻辑顺序:
- 利用 HGFS 泄漏漏洞获取宿主内存信息
- 借助 VBluetooth UAF 漏洞在宿主上执行代码
- 触发 CLDFLT 堆溢出进行提权,完全控制宿主系统
3. 漏洞一:CVE-2024-22270 - HGFS 未初始化堆数据泄露
3.1 漏洞成因
- malloc 未清零,新分配堆空间包含旧数据残留
- HGFS v1 响应只写入有效数据,未初始化部分返回给 Guest
3.2 利用前准备
在 Guest 安装 open-vm-tools,启用 HGFS 和 VMCI:
虚拟机 .vmx 配置:
sharedFolder0.present = "TRUE"
guestOS = "windows9-64"
3.3 泄露数据分析
- 搜索 0xfffff8... 等指针模式
- 识别 PE header(MZ)或 ASCII 文件路径
- 利用泄露地址计算 vmware-vmx 基址
4. 漏洞二:CVE-2024-22267 - VBluetooth URB Use-After-Free
4.1 漏洞原理
- SubmitURB 中复制 URB 指针未增引用计数
- HandleURBs 释放节点后异步回调,使用已释放的 URB
4.2 利用步骤
- Guest 发送 URB(data) - 入队并注册回调
- 发送 URB(reset) - 调用 PutURB 释放所有 URB
- Poll 回调触发 UAF
- 通过控制 URB 结构中的虚表指针实现间接调用
4.3 绕过 CFG 技巧
- 寻找符合 CFG 要求的 ROP gadget
- 将客机物理内存页映射到 VMX 数据段中,控制回调地址
5. 漏洞三:CVE-2024-30085 - CLDFLT 堆缓冲区溢出
5.1 驱动源码与漏洞定位
当 elem4_length == 0x1001,分配 0x1000,复制 0x1001 → 堆溢出
5.2 构造 ReparsePoint 数据
通过 FSCTL_GET_REPARSE_POINT 控制码发送大 buffer
伪造两次溢出:
- 第一次破坏 _WNF_STATE_DATA 泄露地址
- 第二次控制管道对象实现任意写
5.3 任意写原语
- 修改 _WNF_STATE_DATA::Data 和 Length 字段
- 得到读写原语
5.4 Token 劫持与 SYSTEM 权限
将 winlogon 的 Token 覆盖当前进程,获取 SYSTEM
6. 核心技术点与提权机制详解
6.1 EPROCESS 结构
- EPROCESS.Token 偏移
- KTHREAD 与 ETHREAD 权限检查
6.2 PagedPool 分配
- 大小为 0x1000 的分页池块
- Free List 与 PoolSpray
6.3 WNF & Mailslot 对象
- WNF subscription table 布局
- Mailslot 用于喷洒稳定对象
7. 串联利用与逃逸示例
- HGFS 泄漏阶段:获取宿主内核地址布局
- VB 漏洞阶段:在宿主 VMX 进程中执行 ROP
- 内核提权阶段:触发 CLDFLT 溢出,劫持 EPROCESS->Token 提权
8. 环境搭建与复现指南
8.1 虚拟机配置 (.vmx)
sharedFolder0.present = "TRUE"
guestOS = "windows9-64"
8.2 PoC 编译命令
HGFS 漏洞利用:
cl hgfs_leak_poc.cpp /O2 /EHsc
VB 漏洞利用:
cl vbluetooth_exploit.cpp /O2 /EHsc
CLDFLT 漏洞利用:
cl cldflt_exploit.cpp /O2 /EHsc /link advapi32.lib
8.3 调试与检测
WinDbg 命令:
!process 0 0
!process <地址> 1f
!uniqstack
!pool
!object
!token
9. 防护与检测策略
9.1 禁用或更新
- 禁用 HGFS 共享文件夹
- 关闭虚拟蓝牙设备
- 更新到 VMware Workstation 17.5.2+/Fusion 13.5.2+
9.2 启用安全特性
- 启用内核 CFG/HVCI
- 启用 Hypervisor 强制代码完整性
9.3 监控检测
- 监控 Vsock/HGFS 的非标准读写
- 监测 vmware-hostd 服务的异常活动
- 监控 cldflt.sys 相关的可疑操作
10. 附录:PoC 代码与脚本
10.1 HGFS 泄漏 PoC (客机)
// 使用 VMware Host-Guest API 读取共享文件
VMHGFS_OpenHandle(...);
VMHGFS_Read(...);
// 打印返回的未初始化数据
10.2 VB 漏洞 PoC (客机)
// 模拟 USB/蓝牙设备发送特制 URB
// 使用 WinUSB 或原始 IOCTL 接口
10.3 CLDFLT 漏洞 PoC (宿主)
// 创建文件并 DeviceIoControl 调用 FSCTL_SET_REPARSE_POINT
CreateFile(...);
DeviceIoControl(..., FSCTL_SET_REPARSE_POINT, ...);
// 使用大量 NtCreateWnfStateName/Update 进行 WNF 喷射
10.4 检测脚本
PowerShell 脚本监测内核对象异常:
ZwOpenKey + ZwQueryKey 访问 WNF 状态名称注册表项
NtQuerySystemInformation 检测分页池异常分配