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.exe
的ProductVersion
版本,则会执行后续的安装操作:
验证C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe
存在且尚未安装后,该服务会调用Updater.IsUpdateFolderAccessRestricted()
。该函数的功能似乎是确保C:\ProgramData\Avira\VPN\Update
处于锁定状态,并且不能被低权限用户写入(以便在执行更新操作前保护更新程序)。服务首先会检查该目录是否隶属于NT AUTHORITY\SYSTEM
、NT 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,使其包含Administrators
、SYSTEM
及SERVICE
:
完成如上操作后,现在只有这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中是否包含Administrators
、SYSTEM
以及SERVICE
SID。通过以上检查后,VPN服务会检查AviraVPNInstaller.exe
的文件完整性,判断文件是否经过Avira签名、签名是否有效、ProductVersion
是否大于系统当前已安装的VPN服务版本。这些条件全部满足后,目标服务就会以SYSTEM
权限执行我们重命名后的AviraVPNInstaller.exe
,加载我们的恶意VERSION.dll
,最终实现本地权限提升。
最新版Avira VPN已经修复了该漏洞。
发表评论
您还未登录,请先登录。
登录