介绍
近期,SafeBreach Labs的安全研究人员在惠普的HP Touchpoint Analytics软件中发现了一个新型的安全漏洞,该漏洞将导致攻击者在目标设备上实现非法提权。该漏洞的漏洞编号为CVE-2019-6333,CVSS评级为中危漏洞。
在这篇文章中,我们将跟大家介绍该漏洞将如何导致攻击者实现提权,以及如何利用SYSTEM权限在目标服务中加载任意未签名的DLL。
除此之外,我们还将演示如何利用该漏洞来实现一些潜在的恶意活动。
本文还提供了一份PoC代码,该PoC使用了第三方库来读取目标设备中的物理内存数据。
HP Touchpoint Analytics
HP Touchpoint Analytics这个服务很多惠普PC都会预装,该服务可以匿名收集目标硬件性能的诊断信息。
该服务能够以“NT AUTHORITY\SYSTEM”权限运行,这也给该服务提供了非常强大的权限支持。
Open Hardware Monitor
允许HP Touchpoint Analytics访问敏感数据和底层硬件(例如物理内存、MSR和SMBios)的,是一个名叫“Open Hardware Monitor”的开源硬件监控库。Open Hardware Monitor库提供了一个名叫“WinRing0”的已签名内核驱动,它可以在代码库运行时完成提取和安装。
本文中,我们将对HP Touchpoint Analytics和Open Hardware Monitor组件中的漏洞进行分析,并给大家演示如何利用该漏洞来实现提权,并最终获取到SYSTEM权限。
漏洞分析
漏洞发现
在我们的初步研究过程中,我们之所以将目标锁定在了HP Touchpoint Analytics服务上,是因为我们认为这种关键服务应该具有PC硬件的高级别访问权以及诱导实现提权的能力。
在HP Touchpoint Analytics服务启动后,它会以“NT AUTHORITY\SYSTEM”权限执行TouchpointAnalyticsClientService.exe。
执行之后,该服务中的PerformanceMonitor 类会加载已签名的Open Hardware Monitor第三方库,从而启用以下三类检测-GPU、CPU和RAM:
接下来,该服务于会加载Open Hardware Monitor第三方库。这个库能够从各种不同的硬件源收集信息,代码库完成加载后,我们可以在ProcMon中观察到下列活动:
注意:上图中我们已经过滤掉了不相关的事件。
你可以看到,服务会尝试加载三个缺失的DLL文件,最终的加载路径为“ c:\python27”目录:
atiadlxx.dll
atiadlxy.dll
Nvapi64.dll
DLL劫持漏洞演示
在我们的虚拟机中,c:\python27有一个ACL,允许任何认证用户向ALC中写入文件,这将使得提权变得非常简单,并允许常规用户向其中写入缺失的DLL文件,最终以“NT AUTHORITY\SYSTEM”权限执行任意代码。
需要注意的是,管理员用户或进程必须设置目录ACL来允许访问非管理员用户的账号,然后将该目录路径添加至系统的PATH环境变量中。
为了测试这个提权漏洞,我们编译了一个未签名的DLL,它可以将下列文件名写入至txt文件:
1、执行目标文件的用户名;
2、DLL文件名;
此时,我们就可以加载三个任意DLL,并以“NT AUTHORITY\SYSTEM”权限执行我们的代码。
漏洞根源分析
当OpenHardwareMonitor库加载之后,它会初始化一个GPU检测类,并尝试加载Nvidia和ATL DLL库以确保自己的API能够正常使用。
ATI逻辑
我们可以看到系统加载了ATI DLL库 - atiadlxx.dll和atiadlxy.dll,以确保自己的API能够正常使用。
Nvidia逻辑
我们可以看到,系统加载了Nvidia DLL库 - NVApi64.dll来确保自己的API能够正常使用。
我们可以看到,这就是导致漏洞出现的两个根本原因。
未控制的搜索路径-缺少DLL加载的安全管理机制
代码库会使用DllImportAttribute来尝试加载上述未托管的DLL文件,问题就在于,它只会使用DLL文件名来调用,而不是通过DLL的绝对路径。因此,这里需要使用DefaultDllImportSearchPathsAttribute类来控制DLL加载文件的路径。
缺少数字证书认证
程序不会验证它所加载的DLL文件是否拥有数字签名,因此攻击者将能够加载任意未签名的DLL。
漏洞利用(物理内存读取/写入)
Open Hardware Monitor的已签名驱动程序
正如之前所说的,惠普的Touchpoint Analytics软件会使用Open Hardware Monitor库来实现硬件诊断,而这个库使用了第三方签名驱动程序来执行某些底层操作。接下来,我们将演示如何利用该漏洞来获取“NT AUTHORITY\SYSTEM”权限,并使用已签名驱动程序来从物理内存中读取数据。
PoC-读取物理内存
Open Hardware Monitor库是完全开源的,这也就意味着它的驱动也是开源的。根据我们对驱动程序对外函数的分析,我们发现程序可以通过发送特质的IOCTL来读取/写入物理内存数据。我们使用的代码段所实现的指令能够向驱动程序发送一个IOCTL,并返回某个物理内存地址的内容数据。
接下来,我们将其编译成了DLL,并利用该漏洞以SYSTEM权限实现了加载。
从物理内存读取任意地址数据
比如说,我们选取地址0xC00F0,驱动程序将允许访问和读取的地址区间为0xC0000至0xFFFFF。
首先,我们使用内核模式调试器WinDbg来检测该物理地址的内容:
现在,我们可以利用该漏洞来加载未签名的DLL,并将输出结果写入至txt文件中:
大家可以看到,在该漏洞的帮助下,我们能够轻松将任意物理内存地址的内容打印出来。
受影响产品
HP Touchpoint Analytics客户端:版本号低于v4.1.4.2827的所有版本。
参考资料
1、https://github.com/openhardwaremonitor/openhardwaremonitor
* 参考来源:safebreach,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM