Avira VPN的本地提权漏洞

iso60001  1586天前

22.png

产品版本:Avira VPN

测试操作系统:windows 10 1709 (x64)

漏洞:Avira VPN本地权限升级

简介

当Phantom VPN服务(Avira.VPNService.exe)启动时,它会自动检查是否有可用的更新。这主要和C:\ProgramData\Avira\VPN\Update有关,而且该目标可以被低特权用户所写入。虽然该服务也有相关防护,但可以被绕过。这使得攻击者能往C:\ProgramData\Avira\VPN\Update植入一个有效的Avira可执行文件和一个恶意DLL,触发服务执行更新文件,从而发生DLL劫持,以SYSTEM权限执行恶意代码。

漏洞解释

当Phantom VPN服务(Avira.VPNService.exe)启动时,它首先要做的事情之一就是检查更新,这是在C:\ProgramData中完成的(默认情况下,低权限用户是可以写入的)。该服务主要通过调用VPNUpdater.UpdateProduct()来实现这一点,而它又会调用Updater.UpdateToNewPackageIfValid()。该函数主要处理更新VPN软件的所有逻辑:

33.png

当进入Updater.UpdateToNewPackageifValid()时,会首先检查是否有通过调用Updater.CheckForDownloadedUpdatePackage()去下载更新。这主要通过检查是否存在C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe以及更新文件是否已经安装:

44.png

确定是否安装主要通过比较更新包和VPN服务的ProductVersion属性。如果更新文件的ProductVersion大于Avira.VPNService.exeProductVersion,则更新流程继续:

55.png

在确认C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe存在且尚未安装之后,服务会调用Updater.IsUpdateFolderAccessRestricted()函数。这个函数似乎是确保C:\ProgramData\Avira\VPN\Update被锁定,不能被低权限用户写入(为了保护更新文件)。它会首先检查文件夹是否属于NT AUTHORITY\SYSTEMNT AUTHORITY\ service或管理员(存储在AcceptedSIDs中的值):

66.png

如果更新文件夹不属于任何SID,函数将调用Updater.RestoreUpdateFolder(),它会立即删除C:\ProgramData\Avira\VPN\Update,然后重新创建,并限制访问用户(只允许以上三类用户)。如果文件夹的拥有者是以上三者之一,则服务会遍历所有DACL,确保只有以上三类用户能控制文件夹内容。

不过以上安全检查存在缺陷,我们可轻松绕过,并往C:\ProgramData\Avira\Update植入恶意更新文件。

我们第一个任务是绕过文件夹的“所有者”检查,这可以通过简单地将文件系统上的另一个由SYSTEM拥有但也可被低权限所写入的文件夹移动到C:\ProgramData\Avira\Update来实现。因为移动同一卷上的文件/文件夹将保留其权限设置,因此更新文件夹的所有者将是“SYSTEM”,这就可以通过检查。

为了实际利用,我们可以复制AviraVPNInstaller.exe(及其依赖项)到C:\ProgramData\Avira\Launcher\LogFiles,它也属于“SYSTEM”,但可被低权限用户写入:

77.png

一旦完成,接下来就可以移动C:\ProgramData\Avira\Launcher\LogfilesC:\ProgramData\Avira\VPN\Update

88.png

此时,我们有一个C:\ProgramData\Avira\VPN\Update可通过“所有者”检查。下一个障碍是绕过DACL检查,这可以通过设置更新文件夹的DACL来实现,使其包括“Administrators”、“SYSTEM”和“SERVICE”:

99.png

一旦完成,更新文件夹只能被3类指定用户所访问。在绕过了“所有者”和“DACL”检查之后,最后一个障碍是绕过文件完整性检查。在执行更新文件之前,服务会检查它是否由Avira所签名且签名是否有效(通过调用Updater.IsUpdatePackageAuthentic())。如果C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe不是由Avira签名或是签名无效,则服务不会执行它。为了避免这种情况,我们需要一个由Avira签名的文件,该文件的ProductVersion要大于当前Avira.VPNService.exe的版本。经过一番搜寻,我发现了一个由Avira签名的可执行文件,名字为CefSharp.BrowserSubprocess.exe,产品版本为65.0.0.0

100.png

因为这个可执行文件是由Avira签署的,产品版本大于当前的Avira.VPNService.exe,所以它将通过服务的所有安全检查。当然你需要将这个可执行文件重命名为AviraVPNInstaller.exe,并和恶意的VERSION.dll一起,使用一系列上述所提及的绕过操作把它们移动到更新文件夹中。

当VPN服务启动,它将发现C:\ProgramData\Avira\VPN\Update\AviraVPNInstaller.exe文件存在,并激活一系列检查。它将看到“更新”文件夹属于“SYSTEM”,而DACL包含“Administrators”、“SYSTEM”和“SERVICE”的SID。接着它将检查AviraVPNInstaller.exe文件的完整性,看看它是否由Avira签署的,数字签名是否有效的,产品版本是否比现有VPN服务版本更大。通过以上所有这些检查后,服务将以“STSTEM”身份执行AviraVPNInstaller.exe,最终导致本地权限提升:

110.png

该漏洞已在最新版本的Avira VPN中得到修复。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://enigma0x3.net/2020/01/15/avira-vpn-local-privilege-escalation-via-insecure-update-location/

最新评论

昵称
邮箱
提交评论