介绍
此存储库包含HackSys Extreme Vulnerable Driver (HEVD)中的 BufferOverflowNonPagedPoolNx 漏洞的利用。该利用针对 Windows 10 版本 22H2(OS Build 19045.3930),并演示了一种从低完整性进程到 SYSTEM 的权限提升技术。
漏洞概述
该漏洞利用BufferOverflowNonPagedPoolNx 漏洞,通过NonPagedPoolNx 区域中的Aligned Chunk Confusion创建“幽灵块”。然后操纵该幽灵块以实现任意读写原语,随后用于提升权限。
关键技术:
-
在 NonPagedPoolNx 中使用对齐块混淆创建幽灵块,从而允许通过前一个块泄漏和操纵HEAP_VS_CHUNK_HEADER、POOL_HEADER和PipeQueueEntry结构。
-
通过操纵幽灵块中的 PipeQueueEntry 结构来设置伪造的PipeQueueEntrySub ,从而建立任意读取原语。
-
通过改变幽灵块中的 POOL_HEADER 结构来设置假的 ProcessBilled,从而建立任意减量原语。
-
通过将当前线程的KTHREAD结构中的PreviousMode清零来建立任意写入原语。
-
通过修改当前进程的EPROCESS结构中的 Token 来提升到 SYSTEM 权限。
-
通过操纵幽灵块及其链接块的 HEAP_VS_CHUNK_HEADER 结构来防止检测到损坏的块,从而稳定系统并避免 BSoD。
测试环境
此漏洞在以下环境中进行了测试:
-
Windows 10 版本 22H2(操作系统内部版本 19045.3930)
-
KVA 影子:已启用
-
VBS/HVCI:已禁用VBS/HVCI: Disabled
-
完整性级别:低
演示:
详细的利用步骤
1.建立任意读取原语:
-
利用 HEVD 的 NonPagedPoolNx 缓冲区溢出来破坏相邻块的 POOL_HEADER,从而创建一个幽灵块:
-
设置 CacheAligned 位并操作 PreviousSize 来控制块定位。
-
释放后,这会创建一个与前一个块重叠的幽灵块。
-
幽灵块的 HEAP_VS_CHUNK_HEADER、POOL_HEADER 和 PipeQueueEntry 与前一个块的数据重叠。
-
从前一个块的 PipeQueue 读取会泄露幽灵块的结构。
-
写入前一个块会操纵幽灵块的结构。
-
用伪造的 PipeQueueEntry 覆盖幽灵块,将 linkedIRP 指向用户模式伪造的 PipeQueueEntrySub。
-
将 PipeQueryEntrySub 的 data_ptr 设置为所需的读取地址。
-
使用 PeekNamedPipe 从指定地址触发读取。
2.泄漏内核信息:
-
使用任意读取原语来获取内核基地址、ExpPoolQuotaCookie 和其他关键地址。
-
查找当前进程的EPROCESS结构。
3.建立任意减量原语:
-
使用PipeAttribute在内核空间中创建一个伪 EPROCESS 结构。
-
操作ghost chunk的POOL_HEADER:
-
设置 PoolQuota 位以使内核将标头的一部分解释为 ProcessBilled 指针。 -
设置一个假的 ProcessBilled 指针,计算如下:
-
ProcessBilled = addrof(fake EPROCESS) ⊕ addrof(Ghost Chunk) ⊕ ExpPoolQuotaCookie
-
配置伪 EPROCESS,使其 PoolQuotaBlock 指向(目标地址 – 1)。
-
将 BlockSize 设置为 0x100 字节。
-
触发幽灵块的释放,导致内核:
-
从 (目标地址 – 1) 处的 PoolQuota 中减去 0x100 (BlockSize)。
-
导致目标地址减少0x1。
4.建立任意写入原语:
-
使用任意减量原语来操作当前线程的 KTHREAD 结构的 PreviousMode 字段。
-
将 PreviousMode 从 1(用户模式)减至 0(内核模式)。
-
此操作会绕过本机系统服务例程(例如 NtWriteVirtualMemory)中的地址验证:
-
通常,这些例程会执行检查以防止从用户模式调用时写入内核空间地址。
-
如果 PreviousMode 设置为 KernelMode,则会跳过这些检查。
因此,该漏洞获得了写入任意内核内存地址的能力,从而建立了任意写入原语。
5.提升权限(仅数据攻击):
-
使用任意读取原语来定位系统进程 EPROCESS 结构。
-
使用任意写入原语将系统进程令牌复制到当前进程的令牌。
6.恢复内核状态:
-
修复幽灵块和相邻块的 HEAP_VS_CHUNK_HEADER 结构:
-
使用任意读取原语从内核空间泄漏 RtlpHpHeapGlobals
-
使用以下方法解码并重新编码标头:
-
decodedVsHeader = encodedVsHeader ⊕ addrof(encodedVsHeader) ⊕ RtlpHpHeapGlobals
-
更新 UnsafeSize 和 UnsafePrevSize 以恢复正确的块链接
-
这些修复可以防止检测到损坏的堆结构,从而避免内核模式堆损坏和随后的 BSoD
-
将 PreviousMode 恢复为其原始值 1(UserMode)
建造
要构建项目:
-
HEVD-BufferOverflowNonPagedPoolNx-Win10-22H2.sln在 Visual Studio 2022 中打开解决方案文件。
-
构建解决方案(F7 或构建 > 构建解决方案)。
用法
1.在目标系统上加载 HEVD 驱动程序。
2.启动低完整性命令提示符:
copy %systemroot%system32cmd.exe .cmd-low-integrity.exe
icacls .cmd-low-integrity.exe /setintegritylevel low
.cmd-low-integrity.exe
验证完整性级别:
whoami /groups | find "Mandatory Label"
这应该显示“强制标签低强制级别”。
3.从低完整性命令提示符下,运行已编译的漏洞利用程序。
4.如果成功,就会产生一个 SYSTEM shell。
免责声明
此代码仅供教育目的使用。请负责任地使用它,并且仅在您有权测试的系统上使用。
参考
-
synacktiv/Windows 内核 SegmentHeap 对齐块混乱
https://github.com/synacktiv/Windows-kernel-SegmentHeap-Aligned-Chunk-Confusion
-
cbayet/漏洞-CVE-2017-6008
https://github.com/cbayet/Exploit-CVE-2017-6008
https://github.com/ommadawn46/HEVD-BufferOverflowNonPagedPoolNx-Win10-22H2
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里
原文始发于微信公众号(Ots安全):HackSys 极易受攻击的驱动程序 (HEVD) – BufferOverflowNonPagedPoolNx 漏洞