Windows利用技巧:利用任意文件写进行本地提权
字数 1676 2025-08-29 08:32:30
Windows本地提权技术:利用任意文件写入漏洞
1. 前言
本文详细讲解如何利用Windows系统中的任意文件写入漏洞进行本地提权(Local Elevation of Privilege, EoP)。这种技术特别适用于Windows 10系统,但原理也可应用于其他版本。
2. 任意文件写入漏洞概述
任意文件写入漏洞是指攻击者能够在通常无法访问的位置创建或修改文件。这通常由以下原因导致:
- 权限服务错误地清理了用户传递的信息
- 符号链接劫持攻击,用户可以将链接写入之后由权限服务使用的位置
理想的漏洞情况是攻击者不仅能控制写入文件的位置,还能控制文件内容。
3. 传统DLL劫持技术
传统利用任意文件写入漏洞的方法是执行DLL劫持。Windows加载DLL的顺序如下:
- 检查已知DLL列表(操作系统预缓存的DLL)
- 检查程序所在目录
- 检查系统位置(如C:\WINDOWS\SYSTEM32和C:\WINDOWS)
- 搜索当前环境变量
DLL劫持的两个主要问题:
- 通常需要创建特权进程的新实例
- 大多数系统二进制文件已安装在SYSTEM32中
4. DiagHub服务介绍
"Microsoft(R)诊断中心标准收集器服务"(简称DiagHub)是一个更有效的提权目标:
- 在Windows 10中引入
- 目的是代表沙盒应用程序(如Edge和IE)使用ETW收集诊断信息
- 关键特性:可以配置为从SYSTEM32目录加载任意DLL
- 所有功能通过已注册的DCOM对象公开
5. 逆向DCOM对象
5.1 识别接口
使用OleViewDotNet工具分析DiagHub服务:
- 查找"Microsoft(R)诊断中心标准收集器服务"
- 查看支持的接口,重点关注:
IStandardCollectorAuthorizationServiceIStandardCollectorService
5.2 接口方法分析
IStandardCollectorService接口的关键方法:
HRESULT CreateSession(_In_ struct Struct_24* p0,
_In_ IStandardCollectorClientDelegate* p1,
_Out_ ICollectionSession** p2);
HRESULT GetSession(_In_ GUID* p0, _Out_ ICollectionSession** p1);
HRESULT DestroySession(_In_ GUID* p0);
HRESULT DestroySessionAsync(_In_ GUID* p0);
HRESULT AddLifetimeMonitorProcessIdForSession(_In_ GUID* p0, [In] int p1);
5.3 加载DLL的流程
- 使用
CreateSession创建新诊断会话 - 在新会话上调用
ICollectionSession::AddAgent方法,传递DLL名称 - 服务会:
- 验证DLL路径
- 使用
LoadLibraryExW加载DLL - 调用
DllGetClassObject方法
6. 利用任意文件写入漏洞
6.1 Storage Service漏洞分析
SvcMoveFileInheritSecurity RPC方法存在两个漏洞:
- 问题1427:符号链接滥用导致任意文件创建
- 问题1428(本文重点):滥用硬链接修改文件权限
6.2 利用硬链接修改权限
利用步骤:
- 在SYSTEM32中为目标文件创建硬链接
- 创建具有可继承ACE的新目录
- 请求RPC服务将硬链接文件移动到新目录
- 服务调用
SetNamedSecurityInfo应用继承的ACE到硬链接文件 - 修改SYSTEM32中原始文件的安全属性
6.3 选择目标文件
选择标准:
- 不由TrustedInstaller组拥有
- 不会导致操作系统安装损坏
示例文件:license.rtf(Windows许可证声明文件)
7. 完整利用步骤
- 使用Storage Service漏洞修改
license.rtf文件的安全属性 - 将恶意DLL复制到
license.rtf - 使用DiagHub服务加载修改后的"许可证文件"作为DLL
- 以SYSTEM权限执行任意代码
8. 示例代码
IStandardCollectorService* service;
CoCreateInstance(CLSID_CollectorService, nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&service));
SessionConfiguration config = {};
config.version = 1;
config.monitor_pid = ::GetCurrentProcessId();
CoCreateGuid(&config.guid);
config.path = ::SysAllocString(L"C:\\Dummy");
ICollectionSession* session;
service->CreateSession(&config, nullptr, &session);
GUID agent_guid;
CoCreateGuid(&agent_guid);
session->AddAgent(L"dummy.dll", agent_guid);
9. 防御措施
微软已修复相关漏洞,但类似技术仍可能有效:
- 确保服务正确处理模拟和文件操作
- 限制DCOM对象的访问权限
- 监控SYSTEM32目录下的异常文件修改
10. 总结
本文介绍了一种高效的Windows本地提权技术,结合了:
- 任意文件写入漏洞(通过Storage Service)
- DiagHub服务的DLL加载功能
- 硬链接和权限继承机制
这种技术不仅适用于普通用户权限,甚至可以从Edge LPAC等沙盒环境中使用。