Windows注册表漏洞实战利用:Hive内存破坏技术详解

本文深入探讨Windows注册表中基于Hive的内存破坏漏洞的实战利用技术,涵盖从初始内存破坏到最终权限提升的完整攻击链,包括OOB cell索引、内核对象操纵和现代安全缓解措施绕过等高级技术。

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

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

漏洞分类

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

利用策略

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

初始内存破坏原语

利用经典内存破坏漏洞通常涉及以下步骤:

  1. 初始内存破坏原语
  2. 利润(以任意代码执行、权限提升等形式)

Hive内存破坏的特殊性

我们知道,Hive在低级内存管理方面表现出非常特殊的行为(它们如何以及在何处映射到内存中),自定义分配器处理已分配和释放的内存块的方式,以及存储在那里的数据的性质。所有这些使得从攻击性安全的角度来看,利用这类漏洞特别有趣。

潜在利用选项

1. 仅Hive内部破坏

在特权系统Hive中执行仅Hive攻击是可能的,但需要找到一个非常好的漏洞,可以在现有密钥上触发,而无需加载自定义Hive。

2. 滥用regf不一致性触发内核池破坏

Hive内存破坏可能升级为某些形式的池破坏。这为利用提供了更广泛的选择,因为内核的各个部分使用了各种池分配。

3. Hive间内存破坏

在实践中,可能有其他数据位于我们的bin映射在内存中的紧邻位置。如果发生这种情况,使用线性缓冲区溢出可能可以无缝跨越原始Hive和更高内存地址中一些更有趣的对象之间的边界。

最终原语:越界Cell索引

Cell索引是Hive的等效指针:它们是32位值,允许分配的Cell相互引用。将Cell索引转换为其对应的虚拟地址是通过称为Cell映射的特殊3级结构实现的,类似于CPU页表。

编写利用程序

步骤0:选择漏洞

在约17个与Hive内存破坏相关的漏洞中,我们选择了CVE-2023-23420进行演示利用。这个漏洞特别独特,因为它可以仅使用API/系统调用触发,使得攻击者可以破坏任何具有写访问权限的Hive。

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

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

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

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

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

在这一点上,我们可以通过我们的魔法值读取和写入_CMHIVE结构,也可以操作任何其他解析为有效地址的越界Cell索引。

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

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

利用缓解措施

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

结论

通过这些文章,我希望尽可能多地记录注册表的实现细节;这些细节可能永远不会公开。我的目标是展示这个机制是多么有趣和内部复杂,特别是它在Windows整体安全中扮演的重要角色。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计