Windows利用技巧:利用任意对象目录创建进行本地提权
字数 1894 2025-08-29 08:32:30

Windows利用技巧:利用任意对象目录创建进行本地提权

漏洞概述

本漏洞(CVE-2018-8410)允许攻击者利用CSRSS特权进程的某些行为创建任意对象目录,从而实现本地权限提升。该漏洞的核心在于AppInfo服务在创建Desktop Bridge应用程序时的不安全操作。

技术背景

  • 对象管理器目录:Windows对象管理器中的目录结构,与文件系统目录不同,使用NtCreateDirectoryObject等系统调用操作
  • AppContainerNamedObjects:每个用户的应用容器命名对象目录,通常位于\Sessions\X\AppContainerNamedObjects

漏洞根源

AppInfo服务在创建新应用时调用未记录的API CreateAppContainerToken,该API会在用户的AppContainerNamedObjects对象目录下创建对象目录,但存在两个关键问题:

  1. 调用时未模拟用户身份,导致以SYSTEM权限创建目录
  2. 创建目录时使用了显式安全描述符,允许用户完全访问

漏洞利用链

初始利用

  1. 利用漏洞在用户可控位置创建任意对象目录
  2. 通过删除对象管理器符号链接并重定向目录,将创建的目录指向对象管理器命名空间中的任意位置

难点:如果目录未在AppContainerNamedObjects下创建,NtCreateLowBoxToken系统调用会失败,目录会被删除。解决方法是在删除前获取目录句柄。

完整提权利用

利用链涉及多个Windows组件和特性:

  1. KnownDlls机制:Windows预加载DLL的机制,位于\KnownDlls目录
  2. DefineDosDevice API:用于创建DOS设备符号链接的Win32 API
  3. CSRSS服务:Windows子系统进程,具有高权限

详细利用步骤

  1. 创建目标目录

    • 利用漏洞创建目录\GLOBAL??\KnownDlls
  2. 设置符号链接

    • 在新目录中创建要劫持的DLL名称的符号链接(如TAPI32.DLL)
    • 在用户DOS设备目录创建名为GLOBALROOT的符号链接,指向\GLOBAL??
  3. 调用DefineDosDevice

    • 指定设备名GLOBALROOT\KnownDlls\TAPI32.DLL
    • 目标路径设为用户可创建节对象的位置
    • 导致CSRSS以SYSTEM权限创建符号链接\KnownDlls\TAPI32.DLL
  4. DLL劫持

    • 在目标位置创建恶意DLL的映像节对象
    • 通过特权服务(如Diagnostics Hub)加载被劫持的DLL

绕过Protected Process Light (PPL)保护

  • CSRSS作为最高级别PPL运行,可以写入KnownDlls目录
  • 当模拟被移除时,使用进程身份获取完全访问权限

漏洞修复

Microsoft在2018年6月修复此漏洞:

  1. 引入新API CreateAppContainerTokenForUser,在创建AppContainer令牌期间模拟用户令牌
  2. 确保所有对象创建操作都使用用户权限而非SYSTEM权限

技术要点总结

  1. 对象管理器目录安全:与文件系统目录类似,容易受到特权创建和符号链接劫持攻击
  2. API滥用DefineDosDevice API允许在用户DOS设备目录外创建符号链接
  3. 模拟上下文:服务在关键操作中未正确模拟调用者导致权限问题
  4. 系统组件交互:利用CSRSS服务的高权限特性完成提权链

防御建议

  1. 确保服务在操作用户相关资源时正确模拟用户上下文
  2. 限制高权限进程对关键对象目录的写入权限
  3. 监控异常的对象目录创建操作
  4. 及时应用Windows安全更新

附录:关键API和对象

名称 类型 描述
NtCreateDirectoryObject 系统调用 创建对象管理器目录
CreateAppContainerToken 未记录API 创建AppContainer令牌
DefineDosDevice Win32 API 创建DOS设备符号链接
\KnownDlls 对象目录 系统预加载DLL的目录
\GLOBAL?? 对象目录 全局DOS设备目录
\AppContainerNamedObjects 对象目录 用户AppContainer命名对象目录
Windows利用技巧:利用任意对象目录创建进行本地提权 漏洞概述 本漏洞(CVE-2018-8410)允许攻击者利用CSRSS特权进程的某些行为创建任意对象目录,从而实现本地权限提升。该漏洞的核心在于AppInfo服务在创建Desktop Bridge应用程序时的不安全操作。 技术背景 对象管理器目录 :Windows对象管理器中的目录结构,与文件系统目录不同,使用 NtCreateDirectoryObject 等系统调用操作 AppContainerNamedObjects :每个用户的应用容器命名对象目录,通常位于 \Sessions\X\AppContainerNamedObjects 下 漏洞根源 AppInfo服务在创建新应用时调用未记录的API CreateAppContainerToken ,该API会在用户的 AppContainerNamedObjects 对象目录下创建对象目录,但存在两个关键问题: 调用时未模拟用户身份,导致以SYSTEM权限创建目录 创建目录时使用了显式安全描述符,允许用户完全访问 漏洞利用链 初始利用 利用漏洞在用户可控位置创建任意对象目录 通过删除对象管理器符号链接并重定向目录,将创建的目录指向对象管理器命名空间中的任意位置 难点 :如果目录未在 AppContainerNamedObjects 下创建, NtCreateLowBoxToken 系统调用会失败,目录会被删除。解决方法是在删除前获取目录句柄。 完整提权利用 利用链涉及多个Windows组件和特性: KnownDlls机制 :Windows预加载DLL的机制,位于 \KnownDlls 目录 DefineDosDevice API :用于创建DOS设备符号链接的Win32 API CSRSS服务 :Windows子系统进程,具有高权限 详细利用步骤 创建目标目录 : 利用漏洞创建目录 \GLOBAL??\KnownDlls 设置符号链接 : 在新目录中创建要劫持的DLL名称的符号链接(如 TAPI32.DLL ) 在用户DOS设备目录创建名为 GLOBALROOT 的符号链接,指向 \GLOBAL?? 调用DefineDosDevice : 指定设备名 GLOBALROOT\KnownDlls\TAPI32.DLL 目标路径设为用户可创建节对象的位置 导致CSRSS以SYSTEM权限创建符号链接 \KnownDlls\TAPI32.DLL DLL劫持 : 在目标位置创建恶意DLL的映像节对象 通过特权服务(如Diagnostics Hub)加载被劫持的DLL 绕过Protected Process Light (PPL)保护 CSRSS作为最高级别PPL运行,可以写入 KnownDlls 目录 当模拟被移除时,使用进程身份获取完全访问权限 漏洞修复 Microsoft在2018年6月修复此漏洞: 引入新API CreateAppContainerTokenForUser ,在创建AppContainer令牌期间模拟用户令牌 确保所有对象创建操作都使用用户权限而非SYSTEM权限 技术要点总结 对象管理器目录安全 :与文件系统目录类似,容易受到特权创建和符号链接劫持攻击 API滥用 : DefineDosDevice API允许在用户DOS设备目录外创建符号链接 模拟上下文 :服务在关键操作中未正确模拟调用者导致权限问题 系统组件交互 :利用CSRSS服务的高权限特性完成提权链 防御建议 确保服务在操作用户相关资源时正确模拟用户上下文 限制高权限进程对关键对象目录的写入权限 监控异常的对象目录创建操作 及时应用Windows安全更新 附录:关键API和对象 | 名称 | 类型 | 描述 | |------|------|------| | NtCreateDirectoryObject | 系统调用 | 创建对象管理器目录 | | CreateAppContainerToken | 未记录API | 创建AppContainer令牌 | | DefineDosDevice | Win32 API | 创建DOS设备符号链接 | | \KnownDlls | 对象目录 | 系统预加载DLL的目录 | | \GLOBAL?? | 对象目录 | 全局DOS设备目录 | | \AppContainerNamedObjects | 对象目录 | 用户AppContainer命名对象目录 |