Windows 10 诊断中心标准收集器服务中权限提升的概念验证(PoC)
由于 DiagnosticsHub.StandardCollector.Runtime.dll 中缺少客户端模拟功能,Windows 标准收集器服务所使用的诊断中心打包库可以被强制将任意文件复制到任意位置。
以下是关于如何发现和利用此漏洞的详细说明:Windows 标准收集器服务中的权限提升漏洞
标准收集器服务在配置诊断会话时允许定义多个值,包括暂存目录和会话 ID。会话 ID 可以是任意 GUID,暂存目录可以是用户具有写入权限的任何位置。如果将收集会话配置为 ID c13851b2-b1e1-438f-bf73-949df897f1bf 和暂存路径 C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\,则在调用 ICollectionSession 对象的 GetCurrentResult 方法时会发生以下事件:
C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etlC:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65这些文件夹和 ETL 文件由收集器服务为 .diagsession 包创建,该包通常在会话结束时创建。调用 ICollectionSession 对象的 Stop 方法会导致收集器服务通过调用 Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage 来提交诊断包。CommitPackage 函数会将原始 {scratch path}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl 文件复制或移动到随机 GUID 文件夹:{scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl
由 DiagnosticsHub.StandardCollector.Runtime.dll 中的 CommitPackagingResult 函数触发的复制/移动操作在没有模拟用户的情况下执行(与初始文件/文件夹创建不同),如果目标文件夹被替换为将复制重定向到任意位置的挂载点,则可能导致 TOCTOU 问题。为了以有用的方式利用此问题,攻击者需要在复制之前替换 ETL 文件的内容。这可以通过在服务释放文件句柄后利用 OpLock 赢得竞争条件来完成。
尽管我们不能完全控制被复制的 .etl 文件的名称,但我们可以使用对象目录符号链接技巧来控制它。挂载点+符号链接的设置大致如下:
{scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\ -> \RPC Control\\RPC Control\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl -> C:\Windows\System32\anything.dll控制文件内容、复制位置和文件名给攻击者提供了多种 DLL 加载的可能性。然而,所包含的 PoC 演示了不需要控制文件名,因为只要 DLL 位于 C:\Windows\System32 或 C:\Windows\System32\DiagSvcs 目录中,收集器服务就会愉快地加载任何文件名的 DLL。这是通过启动一个新的收集器会话,使用一个程序集名称与复制的 DLL 名称 c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl 相匹配的代理来实现的。
所包含的 PoC 是一个 VS 解决方案,包含一个用于弹出 notepad.exe 有效负载的 C++ DLL 项目和一个用于与服务交互并利用 NtApiDotNet 库利用漏洞的 C# 项目。
重现步骤:
预期结果:
包提交操作模拟用户,并在尝试复制文件时失败。
实际结果:
文件被复制到挂载点目标文件夹 C:\Windows\System32,然后作为收集器代理加载,最后以 SYSTEM 权限生成 notepad.exe。