Avira VPN本地提权漏洞分析

阅读量    711287 | 评论 1   稿费 140

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

“提权”的图片搜索结果"

 

0x00 前言

当Phantom VPN Service(Avira.VPNService.exe)启动时,会检查系统中是否存在可用更新。该服务会执行C:\ProgramData\Avira\VPN\Update目录中的更新程序,然而低权限用户具备该目录的写入权限。此外,该服务所使用的防御机制也能被攻击者绕过。攻击者可以将正常的Avira可执行文件与恶意DLL植入C:\ProgramData\Avira\VPN\Update目录中,诱导服务执行更新文件。更新过程中存在DLL劫持问题,最终攻击者能够以SYSTEM权限执行代码。

漏洞概要信息如下:

产品版本:Avira VPN
测试系统:Windows 10 1709 (x64)
漏洞概要:Avira VPN服务本地提权

 

0x01 漏洞分析

当Phantom VPN Service(Avira.VPNService.exe)启动时,首先会检查系统中是否存在更新,更新程序位于C:\ProgramData目录中(默认情况下低权限用户具备该目录写入权限)。在更新过程中,该服务会调用VPNUpdater.UpdateProduct(),后者会继续调用Updater.UpdateToNewPackageIfValid()。该函数负责处理VPN软件的所有更新逻辑:

一旦进入Updater.UpdateToNewPackageifValid()代码分支,该服务首先会调用Updater.CheckForDownloadedUpdatePackage(),检查本机中是否已下载更新文件。更具体一些,服务会检查磁盘上是否存在C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe,判断该更新文件是否已安装:

为了判断更新包是否已安装,目标服务会比较更新程序与VPN服务自身(Avira.VPNService.exe)的ProductVersion属性,如果更新程序的ProductVersion版本高于Avira.VPNService.exeProductVersion版本,则会执行后续的安装操作:

验证C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe存在且尚未安装后,该服务会调用Updater.IsUpdateFolderAccessRestricted()。该函数的功能似乎是确保C:\ProgramData\Avira\VPN\Update处于锁定状态,并且不能被低权限用户写入(以便在执行更新操作前保护更新程序)。服务首先会检查该目录是否隶属于NT AUTHORITY\SYSTEMNT AUTHORITY\SERVICE或者Administrators用户(相应值存储在AcceptedSIDs属性中):

如果更新目录不隶属于这些SID,那么该函数将返回,并且目标服务会调用Updater.RestoreUpdateFolder()函数,立即删除C:\ProgramData\Avira\VPN\Update,然后再次创建该目录,将新创建目录的DACL限制在前面提到的这3个SID。如果该目录所有者已位于这3个SID中,那么目标服务会遍历目录DACL中的所有项目,确保DACL中也存在这3个SID值(因此这里我猜测目标服务希望确保只有这3个特权用户/组才能控制该目录的内容)。

这里的问题在于,攻击者有可能绕过这些检查机制,将恶意更新文件植入C:\ProgramData\Avira\Update中。第一个任务就是绕过更新目录的“Owner”属性检查,攻击者可以寻找由SYSTEM所有、且低权限用户具备写权限的某个目录,将该目录移动到C:\ProgramData\Avira\Update。由于在同一个卷上移动文件/目录时,Windows可以保持相同的权限属性,因此这种情况下更新目录的所有者将保持为SYSTEM,从而绕过目标服务的检测机制。

为了滥用这个特性,我们可以将我们自己的AviraVPNInstaller.exe(及相关依赖项)拷贝到C:\ProgramData\Avira\Launcher\LogFiles,该目录由SYSTEM所有,并且低权限用户可写:

完成该操作后,我们可以将C:\ProgramData\Avira\Launcher\Logfiles移动到C:\ProgramData\Avira\VPN\Update

现在我们构造了能够绕过“Owner”属性检查的C:\ProgramData\Avira\VPN\Update目录,接下来需要绕过DACL检查,确保其中包含目标服务允许的3个SID值。这里我们可以直接设置更新目录的DACL,使其包含AdministratorsSYSTEMSERVICE

完成如上操作后,现在只有这3个SID对应的用户才能访问更新目录。绕过Owner及DACL检查后,最后一个任务就是解决文件完整性校验。在执行更新文件之前,目标服务会调用Updater.IsUpdatePackageAuthentic()来检查该程序,确保程序经过Avira签名,并且签名有效。如果C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe未经Avira签名,或者不包含有效的数字签名,那么目标服务就不会执行该程序。为了绕过这一点,我们需要找到经Avira签名的一个文件,并且其ProductVersion属性大于当前安装的Avira.VPNService.exe版本号。经过一番搜索后,我找到了经过Avira签名的一个可执行文件:CefSharp.BrowserSubprocess.exe,对应的版本号为65.0.0.0

由于该可执行文件经过Avira签名,且数字签名有效、版本号大于Avira.VPNService.exe的当前版本号,因此可以绕过目标服务部署的所有检查机制。接下来,我们可以将该文件重命名为AviraVPNInstaller.exe,然后执行前面提到的文件拷贝及目录移动操作。

目前为止,我们已经满足如下条件:

1、拥有经过Avira签名的可执行文件,其ProductVersion大于系统当前安装的Avira.VPNService.exe。并且当该可执行文件启动时,会搜索当前工作目录中的VERSION.dll

2、我们可以绕过目录Owner及DACL检查机制,将重命名后的可执行文件以及恶意VERSION.dll植入C:\ProgramData\Avira\VPN\Update目录中。

当VPN服务启动时(自动或者手动重启),会检查系统中是否存在C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe,然后检查Update目录是否由SYSTEM所有、目录DACL中是否包含AdministratorsSYSTEM以及SERVICE SID。通过以上检查后,VPN服务会检查AviraVPNInstaller.exe的文件完整性,判断文件是否经过Avira签名、签名是否有效、ProductVersion是否大于系统当前已安装的VPN服务版本。这些条件全部满足后,目标服务就会以SYSTEM权限执行我们重命名后的AviraVPNInstaller.exe,加载我们的恶意VERSION.dll,最终实现本地权限提升。

最新版Avira VPN已经修复了该漏洞。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多