Windows注册表漏洞利用实战:深入解析hive内存破坏技术

Windows注册表冒险 #8:hive内存破坏的实战利用

引言

在之前的博客文章中,我们重点讨论了注册表的一般安全分析以及如何有效寻找其中的漏洞。在这里,我们将把注意力转向基于hive的内存破坏漏洞的利用,即那些允许攻击者覆盖活动hive内存映射中数据的漏洞。这是Windows注册表特有的一类问题,但又具有足够的通用性,本文描述的技术适用于我过去的17个漏洞,也可能适用于未来的任何类似漏洞。

漏洞分类

与其他类型的内存破坏一样,绝大多数hive内存破坏问题可以分为两类:空间违规(如缓冲区溢出)和时间违规(如释放后使用)。

利用策略

我们的目标是选择最有前途的漏洞候选者,然后为其创建分步利用程序,将常规用户在系统中的权限从中等完整性级别提升到系统级权限。我们的目标是Windows 11,还有一个额外要求是成功绕过所有现代安全缓解措施。

内存布局利用

Windows注册表单元分配器(即内部的HvAllocateCell、HvReallocateCell和HvFreeCell函数)的运作方式非常有利于利用。首先,它完全缺乏针对内存破坏的任何保护措施;其次,它没有任何随机性元素,使其行为完全可预测。

系统hive攻击

要通过对系统密钥执行仅数据攻击成功执行,我们通常不限于一个特定的hive,而是可以选择任何适合我们的hive。利用在HKLM下挂载的大多数(如果不是全部)hive中的hive破坏,将使攻击者能够提升权限。

跨hive内存破坏

在实践中,我们不仅限于修改我们正在操作的特定hive中的数据,因为在内存中我们的bin映射附近可能还有其他数据。如果发生这种情况,使用线性缓冲区溢出可能可以无缝跨越原始hive和更高内存地址中一些更有趣的对象之间的边界。

越界cell索引

cell索引是hive的指针等价物:它们是32位值,允许分配的单元相互引用。HvpGetCellPaged函数不对输入索引执行任何边界检查,这为利用提供了可能。

对于小于2 MiB的hive,Windows应用了一个称为"small dir"的额外优化。在这种情况下,内核不是分配1024个元素的整个Directory数组并仅使用其中一个,而是将_CMHIVE.Hive.Storage[...].Map指针设置为_CMHIVE.Hive.Storage[...].SmallDir字段的地址,该字段模拟单元素数组。

实际利用步骤

步骤0:选择漏洞

在约17个与hive内存破坏相关的漏洞中,CVE-2023-23420是一个特别的选择,因为它可以仅使用API/系统调用触发,使得攻击任何攻击者具有写权限的hive成为可能。

步骤1:滥用UAF建立动态控制的值单元

我们的攻击将针对HKCU hive,更具体地说是其易失性存储空间。利用过程始于一个密钥节点释放后使用,我们的目标是在第一阶段结束时完全控制两个注册表值的_CM_KEY_VALUE表示。

步骤2:获取对CMHIVE内核对象的读写访问权限

由于我们现在完全控制了一些注册表值,下一个逻辑步骤是用特制的OOB cell索引初始化它们,然后检查我们是否实际可以访问它代表的内核结构。

步骤3:获取对整个内核地址空间的任意读写访问权限

此时,我们可以通过我们的魔法值读取和写入_CMHIVE结构,也可以操作解析为有效地址的任何其他越界cell索引。这意味着我们不再需要担心内核ASLR,因为_CMHIVE readily泄漏了ntoskrnl.exe的基地址以及内核池中的许多其他地址。

步骤4:提升进程安全令牌

拥有任意内核读写原语和ntoskrnl.exe地址后,提升权限只是一种形式。最简单的方法可能是从nt!KiProcessListHead开始迭代所有进程的链表(由_EPROCESS结构组成),在列表中找到"System"进程和我们自己的进程,然后将前者的安全令牌复制到后者。

利用缓解措施

注册表中的越界cell索引是一种强大的利用技术,其主要优势在于其确定性。在特定版本的操作系统中,给定的OOB索引将始终导致引用_CMHIVE结构的相同字段,这消除了使用任何概率性利用方法(如内核池喷洒)的需要。

结论

通过这些文章,我希望能尽可能多地记录注册表的实现细节;这些细节可能永远不会重见天日。我的目标是展示这个机制是多么有趣和内部复杂,特别是它在Windows整体安全中扮演的重要角色。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2025-10-21 15:12  qife  阅读(5)  评论(0)    收藏  举报