Windows利用技巧系列之利用任意对象目录创建实现本地提权
字数 1879 2025-08-29 08:32:24

Windows本地提权漏洞利用技术分析:利用任意对象目录创建实现提权

漏洞概述

本漏洞(Issue 1550)允许攻击者通过CSRSS特权进程创建任意对象目录,从而实现从普通用户权限提升到SYSTEM权限。该漏洞存在于Desktop Bridge应用程序进程创建过程中,具体涉及AppInfo服务调用的未公开API CreateAppContainerToken

核心问题

  1. 权限问题CreateAppContainerToken API以SYSTEM身份在用户的AppContainerNamedObjects对象目录下创建对象目录
  2. 目录控制:用户可以删除对象管理器符号链接并重定向目录创建到对象管理器命名空间中的几乎任何位置
  3. 安全描述符:创建的目录使用显式安全描述符,赋予用户完全访问权限

技术背景

对象管理器目录

  • 与普通文件目录相互独立
  • 使用单独的系统调用(如NtCreateDirectoryObject而非NtCreateFile
  • 容易受到文件系统上类似的安全问题影响,包括提权型创建和符号链接植入攻击

KnownDlls机制

  • 包含许多以NAME.DLL形式命名的映像节区对象
  • 当应用程序加载SYSTEM32目录内的DLL时,加载程序首先检查KnownDlls中是否已存在该节区
  • 默认情况下只有管理员有写权限

漏洞利用链

第一阶段:创建任意对象目录

  1. 利用CreateAppContainerToken API的缺陷
  2. 在用户控制的AppContainerNamedObjects目录下创建对象目录
  3. 通过删除符号链接和重定向,实现在对象管理器命名空间中任意位置创建目录

技术难点

  • 如果没有在AppContainerNamedObjects下创建对象目录,NtCreateLowBoxToken系统调用会失败
  • 目录会被创建但几乎立即被删除
  • 解决方法:在目录被删除前打开其句柄(在多处理器系统上成功率很高)

第二阶段:滥用DefineDosDevice机制

  1. DefineDosDevice函数行为

    • 在当前会话的CSRSS服务中调用RPC方法BaseSrvDefineDosDevice
    • 允许创建永久符号链接(通常需要SeCreatePermanentPrivilege权限)
    • 不对lpDeviceName参数是否为驱动器号进行验证
  2. 关键发现

    • 可以指定名称如GLOBALROOT\RPC Control\ABC,在用户DosDevices目录外创建符号链接
    • 实现代码会将DosDevice前缀\??添加到设备名称
  3. 全局符号链接检测

    • 如果打开的符号链接名称以\GLOBAL??\开头,则禁用身份切换
    • 允许以SYSTEM身份重建链接

完整利用步骤

  1. 使用漏洞创建目录\GLOBAL??\KnownDlls
  2. 在新目录中创建要劫持的DLL(如TAPI32.DLL)的符号链接
  3. 在用户DOS设备目录中创建指向\GLOBAL??GLOBALROOT符号链接
  4. 调用DefineDosDevice,指定设备名称GLOBALROOT\KnownDlls\TAPI32.DLL和目标路径
  5. 在目标位置创建映像节区对象
  6. 强制特权服务(如Diagnostics Hub)加载该DLL

绕过Protected Process Light(PPL)保护

  • PPL进程仍使用KnownDlls
  • CSRSS作为最高级别PPL运行,具有KnownDlls目录的写权限
  • 身份切换被废除后,进程保持全部访问权限

漏洞修复

Microsoft在2018年6月补丁中修复了该漏洞,具体措施:

  1. 添加新API CreateAppContainerTokenForUser
  2. 在创建新AppContainer令牌期间进行身份切换
  3. 确保仅使用用户权限创建所有对象

防御建议

  1. 确保系统已安装2018年6月及之后的Windows安全更新
  2. 监控对DefineDosDevice API的异常调用
  3. 加强对KnownDlls目录的访问控制
  4. 限制低权限用户对对象管理器命名空间的修改能力

总结

该漏洞利用展示了Windows对象管理器命名空间中的复杂交互关系,通过组合多个看似无害的功能(CreateAppContainerTokenDefineDosDevice),实现了从低权限到SYSTEM权限的完整提权链。这种利用方式强调了深入理解系统内部机制的重要性,以及在安全设计中考虑组件间交互的必要性。

Windows本地提权漏洞利用技术分析:利用任意对象目录创建实现提权 漏洞概述 本漏洞(Issue 1550)允许攻击者通过CSRSS特权进程创建任意对象目录,从而实现从普通用户权限提升到SYSTEM权限。该漏洞存在于Desktop Bridge应用程序进程创建过程中,具体涉及AppInfo服务调用的未公开API CreateAppContainerToken 。 核心问题 权限问题 : CreateAppContainerToken API以SYSTEM身份在用户的 AppContainerNamedObjects 对象目录下创建对象目录 目录控制 :用户可以删除对象管理器符号链接并重定向目录创建到对象管理器命名空间中的几乎任何位置 安全描述符 :创建的目录使用显式安全描述符,赋予用户完全访问权限 技术背景 对象管理器目录 与普通文件目录相互独立 使用单独的系统调用(如 NtCreateDirectoryObject 而非 NtCreateFile ) 容易受到文件系统上类似的安全问题影响,包括提权型创建和符号链接植入攻击 KnownDlls机制 包含许多以 NAME.DLL 形式命名的映像节区对象 当应用程序加载SYSTEM32目录内的DLL时,加载程序首先检查KnownDlls中是否已存在该节区 默认情况下只有管理员有写权限 漏洞利用链 第一阶段:创建任意对象目录 利用 CreateAppContainerToken API的缺陷 在用户控制的 AppContainerNamedObjects 目录下创建对象目录 通过删除符号链接和重定向,实现在对象管理器命名空间中任意位置创建目录 技术难点 : 如果没有在 AppContainerNamedObjects 下创建对象目录, NtCreateLowBoxToken 系统调用会失败 目录会被创建但几乎立即被删除 解决方法:在目录被删除前打开其句柄(在多处理器系统上成功率很高) 第二阶段:滥用DefineDosDevice机制 DefineDosDevice函数行为 : 在当前会话的CSRSS服务中调用RPC方法 BaseSrvDefineDosDevice 允许创建永久符号链接(通常需要 SeCreatePermanentPrivilege 权限) 不对 lpDeviceName 参数是否为驱动器号进行验证 关键发现 : 可以指定名称如 GLOBALROOT\RPC Control\ABC ,在用户DosDevices目录外创建符号链接 实现代码会将DosDevice前缀 \?? 添加到设备名称 全局符号链接检测 : 如果打开的符号链接名称以 \GLOBAL??\ 开头,则禁用身份切换 允许以SYSTEM身份重建链接 完整利用步骤 使用漏洞创建目录 \GLOBAL??\KnownDlls 在新目录中创建要劫持的DLL(如TAPI32.DLL)的符号链接 在用户DOS设备目录中创建指向 \GLOBAL?? 的 GLOBALROOT 符号链接 调用 DefineDosDevice ,指定设备名称 GLOBALROOT\KnownDlls\TAPI32.DLL 和目标路径 在目标位置创建映像节区对象 强制特权服务(如Diagnostics Hub)加载该DLL 绕过Protected Process Light(PPL)保护 PPL进程仍使用KnownDlls CSRSS作为最高级别PPL运行,具有KnownDlls目录的写权限 身份切换被废除后,进程保持全部访问权限 漏洞修复 Microsoft在2018年6月补丁中修复了该漏洞,具体措施: 添加新API CreateAppContainerTokenForUser 在创建新AppContainer令牌期间进行身份切换 确保仅使用用户权限创建所有对象 防御建议 确保系统已安装2018年6月及之后的Windows安全更新 监控对 DefineDosDevice API的异常调用 加强对KnownDlls目录的访问控制 限制低权限用户对对象管理器命名空间的修改能力 总结 该漏洞利用展示了Windows对象管理器命名空间中的复杂交互关系,通过组合多个看似无害的功能( CreateAppContainerToken 和 DefineDosDevice ),实现了从低权限到SYSTEM权限的完整提权链。这种利用方式强调了深入理解系统内部机制的重要性,以及在安全设计中考虑组件间交互的必要性。