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对象目录下创建对象目录,但存在两个关键问题:
- 调用时未模拟用户身份,导致以SYSTEM权限创建目录
- 创建目录时使用了显式安全描述符,允许用户完全访问
漏洞利用链
初始利用
- 利用漏洞在用户可控位置创建任意对象目录
- 通过删除对象管理器符号链接并重定向目录,将创建的目录指向对象管理器命名空间中的任意位置
难点:如果目录未在AppContainerNamedObjects下创建,NtCreateLowBoxToken系统调用会失败,目录会被删除。解决方法是在删除前获取目录句柄。
完整提权利用
利用链涉及多个Windows组件和特性:
- KnownDlls机制:Windows预加载DLL的机制,位于
\KnownDlls目录 - DefineDosDevice API:用于创建DOS设备符号链接的Win32 API
- CSRSS服务:Windows子系统进程,具有高权限
详细利用步骤
-
创建目标目录:
- 利用漏洞创建目录
\GLOBAL??\KnownDlls
- 利用漏洞创建目录
-
设置符号链接:
- 在新目录中创建要劫持的DLL名称的符号链接(如
TAPI32.DLL) - 在用户DOS设备目录创建名为
GLOBALROOT的符号链接,指向\GLOBAL??
- 在新目录中创建要劫持的DLL名称的符号链接(如
-
调用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滥用:
DefineDosDeviceAPI允许在用户DOS设备目录外创建符号链接 - 模拟上下文:服务在关键操作中未正确模拟调用者导致权限问题
- 系统组件交互:利用CSRSS服务的高权限特性完成提权链
防御建议
- 确保服务在操作用户相关资源时正确模拟用户上下文
- 限制高权限进程对关键对象目录的写入权限
- 监控异常的对象目录创建操作
- 及时应用Windows安全更新
附录:关键API和对象
| 名称 | 类型 | 描述 |
|---|---|---|
NtCreateDirectoryObject |
系统调用 | 创建对象管理器目录 |
CreateAppContainerToken |
未记录API | 创建AppContainer令牌 |
DefineDosDevice |
Win32 API | 创建DOS设备符号链接 |
\KnownDlls |
对象目录 | 系统预加载DLL的目录 |
\GLOBAL?? |
对象目录 | 全局DOS设备目录 |
\AppContainerNamedObjects |
对象目录 | 用户AppContainer命名对象目录 |