受影响产品总结
Pritunl VPN 客户端服务存在一个任意文件写入漏洞,攻击者可以以 SYSTEM 身份在 Windows 系统上执行。此漏洞源于 Pritunl ProgramData 文件夹的不安全目录权限。攻击者可以利用该任意文件写入漏洞进行特权提升,因为特权的 Pritunl VPN 服务在未指定可执行文件完整路径的情况下以 SYSTEM 身份执行命令。
影响: 在 Windows 上提升特权至 SYSTEM。
- 厂商: Pritunl
- 产品: Pritunl VPN 客户端
- 确认受影响版本: 1.2.3019.52
- 修复版本: 1.2.3019.52a
- 产品链接: Pritunl VPN 客户端安装
- 确认受影响平台: Windows
什么是 Pritunl VPN?
Pritunl 是一个分布式 VPN 服务器,允许企业通过站点到站点的连接以及远程用户访问将其数据中心和多个云环境连接在一起。作为一个开源项目,它是寻求 OpenVPN 兼容性但具备更大规模和云兼容性的公司的常见选择。
连接到 Pritunl VPN 提供了一些选项。虽然服务器页面声明“所有 OpenVPN 客户端均受支持”,但使用 Pritunl OpenVPN 客户端提供了额外的集成。
安全性也是该应用程序的重点。在其安全页面上,Pritunl 自称为“最安全的 VPN 服务器”,并将其开源代码库作为“保证网络安全的唯一手段”进行推广。
作为渗透测试人员,我们多次接触到 Pritunl,通常是在连接 AWS/GCP/Azure 云环境时。
以 SYSTEM 身份的任意文件写入技术细节
用户将 VPN 配置文件导入 Pritunl VPN 客户端后,会写入文件至 “%APPDATA%\pritunl\profiles[profile_ID].ovpn”。当用户尝试连接到该配置文件时,VPN 配置文件会去除危险的 OpenVPN 指令,然后由 Pritunl VPN 服务写入 “%PROGRAMDATA%\Pritunl[profile_ID].ovpn”。文件写入后,Pritunl VPN 服务作为 openvpn.exe 可执行文件的包装器执行 OpenVPN,并在 “–config” 参数中提供经过清理的配置文件。
由于默认情况下,任何用户都可以在 %PROGRAMDATA%\Pritunl* 中创建新文件,因此可以不断写入包含危险 OpenVPN 指令的配置文件到该目录中,匹配的配置文件 ID 会导致 Pritunl VPN 服务最终以修改后的配置文件执行 openvpn.exe。
尽管 openvpn.exe 是以 “–security-script 1” 标志执行的,以防止外部命令执行,但这仍然允许使用 “log” OpenVPN 指令,该指令会将日志输出写入任何指定的文件,并且可以控制日志输出的部分内容。
在导入名为 “privesc” 的配置文件后,可以使用以下 PowerShell 命令并在循环运行时不断点击“连接”:
powershell
$profile_id = ((Select-String '{"name":"privesc"' $env:APPDATA\pritunl\profiles\*).filename).split('.')[0];
while (1) {
"client`ntls-client`ndev TUN`nlog `"C:\\Program Files (x86)\\Pritunl\\ipconfig.bat`"`nauth-user-pass`nca `"INJECTED CONTENT`"" | Add-Content "C:\ProgramData\Pritunl\$profile_id"
}
利用文件写入进行完全特权提升
可以通过以下方式利用以 SYSTEM 身份的任意文件写入漏洞来获得以 SYSTEM 身份执行命令的权限。
每次使用 Pritunl VPN 客户端尝试连接时,Pritunl VPN 服务会以 SYSTEM 身份调用 “ipconfig” 命令。执行 “ipconfig” 的命令行未指定可执行文件的完整路径。由于此命令是在 “C:\Program Files (x86)\Pritunl\” 的工作目录中执行,因此可以利用上述任意文件写入漏洞将命令写入 “C:\Program Files (x86)\Pritunl\ipconfig.bat”。然后,通过再次尝试使用 Pritunl VPN 客户端连接,将以 SYSTEM 身份执行该批处理文件。
结论
披露时间线
虽然这是我们在 VPN 客户端中发现的众多问题之一(更多信息将在不久后发布),但这是唯一一个开源项目。
这也提醒我们,虽然开源软件确实提供了透明度的好处,但并不是安全的万能药。
感谢 Zachary Huff 和 Pritunl 团队在披露后迅速修复漏洞。
- 2022年2月17日:向 Pritunl 报告
- 2022年2月17日:厂商修复提交至 GitHub 仓库
- 2022年3月29日:Pritunl 客户端 v1.2.3019.52a 发布并由厂商宣布
- 2022年4月5日:完全披露(博客文章)发布