Avira VPN 本地提权漏洞分析

0x01 漏洞描述

启动Phantom VPN服务(Avira.VPNService.exe)时,它将检查是否有可用的更新,该服务从C:\ ProgramData \ Avira \ VPN \ Update执行更新,该更新可由低特权用户写入。此外,该服务还会做检查以防止可能被利用,这使攻击者可以将有效的Avira可执行文件以和恶意DLL 植入C:\ ProgramData \ Avira \ VPN \ Update ”中,并使服务执行更新文件,就可以进行DLL劫持,这会导致SYSTEM权限的代码执行。

基本信息
产品版本:Avira Phantom VPN
下载地址:https://package.avira.com/package/oeavira/win/int/avira_en_vpn__ws.exe
操作系统:Windows 10 v1709(x64)
漏洞信息:Avira VPN提权漏洞

0x02 漏洞分析

漏洞产品版本是 Avira VPN,测试的操作系统版本为 Windows 10 1709(x64)。

当Phantom VPN服务(Avira.VPNService.exe)启动时,要做的第一件事就是检查更新,该更新在C:\ ProgramData中完成(默认情况下,低特权用户可写),该服务通过调用“ VPNUpdater.UpdateProduct() ”来执行此操作,然后依次调用“ Updater.UpdateToNewPackageIfValid() ”。

此功能处理更新VPN软件的所有逻辑:

img

输入“ Updater.UpdateToNewPackageifValid() ”后,服务会首先检查是否存在通过调用“ Updater.CheckForDownloadedUpdatePackage() ” 下载的更新。为此,它将检查是否存在“ C:\ ProgramData \ Avira \ VPN \ Update \ AviraVPNInstaller.exe ”,以及是否已安装更新文件:

img

该服务通过将更新可执行文件的“ ProductVersion ”属性与VPN服务本身(Avira.VPNService.exe)的“ ProductVersion ”属性进行比较,确定更新是否已存在。如果更新可执行文件的ProductVersion大于“ Avira.VPNService.exe”的ProductVersion,则该服务将继续根据安装路径进行:

img

在确认“ C:\ ProgramData \ Avira \ VPN \ Update \ AviraVPNInstaller.exe ”存在并且尚未安装之后,该服务将调用“ Updater.IsUpdateFolderAccessRestricted() ”,出现此功能是为了确保“ C:\ ProgramData \ Avira \ VPN \ Update ”被锁定并且不能由低特权用户写入(为了在执行更新之前保护更新可执行文件),该服务通过首先检查文件夹是否由NT AUTHORITY \ SYSTEMNT AUTHORITY \ SERVICEAdministrators拥有(存储在“ AcceptedSID”中的值)来实现:

img

如果更新文件夹不属于这些SID中的任何一个,则函数将返回并调用“ Updater.RestoreUpdateFolder() ”,这将立即删除“ C:\ ProgramData \ Avira \ VPN \ Update ”,然后重新创建它带有限制访问上述3个接受的SID的DACL。如果该文件夹的所有者是那些接受的SID中的任何一个,则该服务然后循环遍历该文件夹的DACL中的每个条目,以确保这3个接受的SID也位于DACL中(我假设确保只有这3个特权用户/组可以控制文件夹的内容)。

这里的问题是,可以绕开这些检查并在“ C:\ ProgramData \ Avira \ Update ”中植入恶意的更新。第一项任务是通过更新文件夹上的“ 所有者 ”检查,只需在SYSTEM拥有的文件系统上移动另一个文件夹,即可将低特权用户可写的另一个文件夹移动到“ C:\ ProgramData \ Avira \ Update”来实现。由于在同一卷上移动文件/文件夹将保留权限,因此更新文件夹的所有者为“ SYSTEM”,服务要检查的内容。

要滥用此权限,我可以将我的“ AviraVPNInstaller.exe”版本(及其依赖项)复制到“ C:\ ProgramData \ Avira \ Launcher \ LogFiles ”,该文件由SYSTEM拥有,但可由低特权用户写入:

img

完成后,我可以将“ C:\ ProgramData \ Avira \ Launcher \ Logfiles ”移动到“ C:\ ProgramData \ Avira \ VPN \ Update ”:

img

至此,我已经通过了“所有者”检查的“ C:\ ProgramData \ Avira \ VPN \ Update ”版本。下一个障碍是通过DACL检查,以确保该服务能够确保存在3个接受的SID,只需在更新文件夹上将DACL设置为包含“ 管理员 ”,“ 系统 ”和“ 服务 ”即可完成:

img

完成后,更新文件夹将只能由3个接受的SID访问。绕过所有者和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’:

img

由于此可执行文件由Avira签名,具有有效的数字证书,并且产品版本大于当前版本的“ Avira.VPNService.exe”,因此它将通过该服务实现的所有检查。该可执行文件已重命名为“ AviraVPNInstaller.exe”,并在上面的文件复制和文件夹移动操作中使用。

至此,有了以下内容:

  1. 有效的Avira签名的可执行文件,其ProductVersion大于安装的Avira.VPNService.exe版本,当该可执行文件启动时,它将在当前工作目录中查找“ VERSION.dll”
  2. 通过绕过文件夹所有者和DACL检查,可以将该重命名的可执行文件以及VERSION.dll的恶意副本植入C:\ ProgramData \ Avira \ VPN \ Update中

一旦VPN服务启动(通过重新引导或手动启动),将看到存在“ C:\ ProgramData \ Avira \ VPN \ Update \ AviraVPNInstaller.exe ”。然后,将看到“ Update”文件夹归“ SYSTEM”所有,并且文件夹DACL包含“ Administrators”,“ SYSTEM”和“ SERVICE” SID。

然后,它将检查“ AviraVPNInstaller.exe”的文件完整性,并查看该文件是否已由Avira签名,数字签名是否有效以及ProductVersion是否大于已部署的VPN服务。通过所有这些检查之后,该服务将执行重命名版本的“ AviraVPNInstaller.exe”作为SYSTEM并加载恶意的“ VERSION.dll”,从而导致本地特权升级:

img

最新的Avira VPN版本已对此漏洞打了补丁。


   转载规则


《Avira VPN 本地提权漏洞分析》 0xbird 采用 知识共享署名 4.0 国际许可协议 进行许可。
 本篇
Avira VPN 本地提权漏洞分析 Avira VPN 本地提权漏洞分析
0x01 漏洞描述启动Phantom VPN服务(Avira.VPNService.exe)时,它将检查是否有可用的更新,该服务从C:\ ProgramData \ Avira \ VPN \ Update执行更新,该更新可由低特权用户写
2020-04-03
下一篇 
Apache Tomcat Ghostcat漏洞详细分析(CVE-2020-1938) Apache Tomcat Ghostcat漏洞详细分析(CVE-2020-1938)
在Apache Tomcat中发现的Ghostcat漏洞(CVE-2020-1938,CNVD-2020-10487)最近成为了关注的焦点,研究员发现此漏洞可以实现远程代码执行(RCE)。 Apache Tomcat是流行的开源Java s
2020-04-02
  目录