欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2018-0952:Windows Standard Collector Service中的权限提

来源: 作者: 时间:2019-02-24 19:29 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

一、前言
如果大家不想深入了解这个漏洞的发现过程,可以简单阅读一下这篇文章以及相关的PoC代码。
我在研究及研发方面非常喜欢使用Process Monitor这款工具。在开发攻击型安全工具时,我经常使用Procmon来监控这些工具如何与Windows交互以及相应的检测方法。今年早些时候,当我使用Visual Studio来调试一些代码并使用Procmon来监控代码行为时,我注意到了一些有趣的行为。通常情况下我会在Procmon中设置针对Visual Studio进程的例外过滤器,降低输出中的噪音事件,但在设置过滤器之前,我注意到有个SYSTEM进程会往用户目录中写入数据。

图1. StandardCollector.Service.exe往用户Temp目录中写入数据
如果某个特权服务会往用户资源中写入数据,就很有可能存在符号链接(symlink)攻击向量,比如我之前发现的Cylance权限提升漏洞一样。为了确认我们如何才能影响该服务的具体行为,我查看了服务已加载的库,开始深入研究Standard Collector Service。

图2. StandardCollector.Service.exe加载的Visual Studio DLL文件
 
二、发现过程
根据这些程序库的具体路径,我们可以判断出Standard Collector Service是Visual Studio的一款诊断工具。查看相关目录中的库及可执行文件后,我发现其中某些程序使用的是.NET语言来开发,比如其中有个独立的CLI工具(VSDiagnostics.exe),该工具的帮助信息如下所示:

图3. VSDiagnostics CLI工具的帮助信息
我们可以使用dnSpy加载VSDiagnostics,了解该工具的一些信息,发现工具如何与Standard Collector Service交互。首先,应用会获取IStandardCollectorService的一个实例并使用会话配置来创建ICollectionSession:

图4. 配置diagnostics collection session的初始步骤
接下来使用CLSID以及DLL名称将agent添加到ICollectionSession中,这种行为也是用户可以控制的一种有趣的行为,我还记得之前也曾通过这种DLL加载行为来利用漏洞。目前看来,Visual Studio Standard Collector Service貌似与Windows 10自带的Diagnostics Hub Standard Collector Service非常相似或者完全相同。为了验证这一点,我使用OleViewDotNet来查询这些服务所支持的接口:

图5. OleViewDotNet中显示的Windows Diagnostics Hub Standard Collector Service
查看IStandardCollectorService的代理定义后,我们可以找到其他一些熟悉的接口,尤其是VSDiagnostics中的ICollectionSession接口:

图6. OleViewDotNet中的ICollectionSession接口定义
记下接口ID信息(“IID”),然后返回.NET interop库,比较这两个接口的IID,发现这些值并不一致:

图7. Visual Studio ICollectionSession使用了不同的IID
进一步深入分析.NET代码,我发现Visual Studio的这些特定接口会通过代理DLL来加载:

图8. VSDiagnostics.exe中用来加载DLL的函数
快速查看DiagnosticsHub.StandardCollector.Proxy.dll中的ManualRegisterInterfaces函数后,我们可以发现其中有一段简单的循环代码,用来遍历一组IID,其中就包含ICollectionSession对应的一个IID:

图9. 代理DLL中的ManualRegisterInterfaces函数

图10. 待注册的IID数组中包含Visual Studio的ICollectionSession IID
进一步理解Visual Studio Collector Service后,我想试一下能否复用同样的.NET interop代码来控制Windows Collector Service。为了与正确的服务进行交互,我需要将Visual Studio的CLSID以及IID替换为Windows Collector Service对应的CLSID以及IID,使用修改后的代码来生成一个客户端,该客户端的作用是使用collector service创建并启动一个诊断会话:

图11. 与Collector Service交互的客户端代码片段
启动Procmon,运行客户端后我们可以在看到有些文件和目录会在C:\Temp临时目录中创建。在Procmon中分析这些日志后,我们可以看到第一次目录创建操作其实使用到了client impersonation技术:

[1] [2]  下一页

一、前言
如果大家不想深入了解这个漏洞的发现过程,可以简单阅读一下这篇文章以及相关的PoC代码。
我在研究及研发方面非常喜欢使用Process Monitor这款工具。在开发攻击型安全工具时,我经常使用Procmon来监控这些工具如何与Windows交互以及相应的检测方法。今年早些时候,当我使用Visual Studio来调试一些代码并使用Procmon来监控代码行为时,我注意到了一些有趣的行为。通常情况下我会在Procmon中设置针对Visual Studio进程的例外过滤器,降低输出中的噪音事件,但在设置过滤器之前,我注意到有个SYSTEM进程会往用户目录中写入数据。

图1. StandardCollector.Service.exe往用户Temp目录中写入数据
如果某个特权服务会往用户资源中写入数据,就很有可能存在符号链接(symlink)攻击向量,比如我之前发现的Cylance权限提升漏洞一样。为了确认我们如何才能影响该服务的具体行为,我查看了服务已加载的库,开始深入研究Standard Collector Service。

本文来自无奈人生安全网


图2. StandardCollector.Service.exe加载的Visual Studio DLL文件
 
二、发现过程
根据这些程序库的具体路径,我们可以判断出Standard Collector Service是Visual Studio的一款诊断工具。查看相关目录中的库及可执行文件后,我发现其中某些程序使用的是.NET语言来开发,比如其中有个独立的CLI工具(VSDiagnostics.exe),该工具的帮助信息如下所示:

图3. VSDiagnostics CLI工具的帮助信息
我们可以使用dnSpy加载VSDiagnostics,了解该工具的一些信息,发现工具如何与Standard Collector Service交互。首先,应用会获取IStandardCollectorService的一个实例并使用会话配置来创建ICollectionSession:
本文来自无奈人生安全网
图4. 配置diagnostics collection session的初始步骤
接下来使用CLSID以及DLL名称将agent添加到ICollectionSession中,这种行为也是用户可以控制的一种有趣的行为,我还记得之前也曾通过这种DLL加载行为来利用漏洞。目前看来,Visual Studio Standard Collector Service貌似与Windows 10自带的Diagnostics Hub Standard Collector Service非常相似或者完全相同。为了验证这一点,我使用OleViewDotNet来查询这些服务所支持的接口:

图5. OleViewDotNet中显示的Windows Diagnostics Hub Standard Collector Service
查看IStandardCollectorService的代理定义后,我们可以找到其他一些熟悉的接口,尤其是VSDiagnostics中的ICollectionSession接口:

图6. OleViewDotNet中的ICollectionSession接口定义 copyright 无奈人生
记下接口ID信息(“IID”),然后返回.NET interop库,比较这两个接口的IID,发现这些值并不一致:

图7. Visual Studio ICollectionSession使用了不同的IID
进一步深入分析.NET代码,我发现Visual Studio的这些特定接口会通过代理DLL来加载:

图8. VSDiagnostics.exe中用来加载DLL的函数
快速查看DiagnosticsHub.StandardCollector.Proxy.dll中的ManualRegisterInterfaces函数后,我们可以发现其中有一段简单的循环代码,用来遍历一组IID,其中就包含ICollectionSession对应的一个IID:
无奈人生安全网
图9. 代理DLL中的ManualRegisterInterfaces函数

图10. 待注册的IID数组中包含Visual Studio的ICollectionSession IID
进一步理解Visual Studio Collector Service后,我想试一下能否复用同样的.NET interop代码来控制Windows Collector Service。为了与正确的服务进行交互,我需要将Visual Studio的CLSID以及IID替换为Windows Collector Service对应的CLSID以及IID,使用修改后的代码来生成一个客户端,该客户端的作用是使用collector service创建并启动一个诊断会话:

图11. 与Collector Service交互的客户端代码片段
启动Procmon,运行客户端后我们可以在看到有些文件和目录会在C:\Temp临时目录中创建。在Procmon中分析这些日志后,我们可以看到第一次目录创建操作其实使用到了client impersonation技术: 本文来自无奈人生安全网
无奈人生安全网

[1] [2]  下一页

copyright 无奈人生

。 (责任编辑:admin)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。