通过滥用硬链接实现 HP Support Assistant 中的本地权限提升
研究人员:Bkav 的 ManhNDd
在 HP Support Assistant GUI 中,当你点击 检查更新和消息 时,服务 HP Support Solution Framework 会运行一些任务,启动 HPSAObjUtil8.exe(以 SYSTEM 权限运行),该程序会更改 C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA 中所有 .xml 文件的权限。具体来说,HPSAObjUtil8.exe 会将这些 .xml 文件的完全控制权授予所有用户。以下是 HPSAObjUtil8 中的漏洞代码:
public static void AddTempLogsPermission()
{
string path = Environment.GetEnvironmentVariable("ProgramData") + "\\Hewlett-Packard\\HP Support Framework\\Logs\\Temp\\HPSA";
if (Directory.Exists(path))
{
string[] files = Directory.GetFiles(path, "*.xml");
if (files != null && files.Length != 0)
{
foreach (string fileOrFolderName in files)
{
Patches._utils.AddFileSecurity(fileOrFolderName);
}
}
}
}
用户可以在 C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA 文件夹中创建一个名为 ???.xml 的硬链接,并将其指向我们选择的受害者文件(只需读取权限),然后让 HPSAObjUtil8 修改其权限,使我们对该文件拥有完全控制权(读/写/删除)。因此,此漏洞允许我们获得系统文件的完全控制权 => 你可以覆盖系统 DLL 以获取系统权限。顺便提一下,该漏洞的 CVSS 3.0 评分将 所需权限 设置为高。这应该为无,因为我在非管理员用户上成功测试了该漏洞。
通过逆向 HPSF.exe 和 HPSupportSolutionsFrameworkService.exe,我发现客户端 HPSF.exe 通过接口 HP.SupportFramework.ServiceManager.Interfaces.IServiceInterface(定义在 HP.SupportFramework.ServiceManager.dll 中)与服务通信。如果客户端调用方法 IserviceInterface.RunAnalysis,服务将启动 HPSAObjUtil8 并触发漏洞。
ServiceInterface.Instance.RunAnalysis("en-US", true);
因此,你需要创建一个虚假客户端并调用 RunAnalysis。但是,服务在处理请求之前会验证其客户端:
internal static bool \u0001(int \u0002)
{
Process processById = Process.GetProcessById(\u0002);
string text = \u000E.\u0001(processById);
if (processById.MainModule.FileName.ToLowerInvariant() != text.ToLowerInvariant())
{
if (DebugLog.IsDebug)
{
DebugLog.LogDebugMessage("Invalid File detected: " + text, DebugLog.IndentType.None);
}
return false;
}
Process parent = processById.GetParent();
bool flag = true;
int num = 0;
while (parent != null && flag && num <= 5)
{
bool flag2;
flag = \u000E.\u0001(parent, out flag2);
if (!flag || flag2)
{
break;
}
num++;
parent = parent.GetParent();
}
return flag;
}
让我们绕过客户端验证:
现在,你需要找到一个可作为硬链接目标的可执行文件。它应该是一个会在一段时间后自动以 SYSTEM 权限运行的 EXE 或 DLL,这样当你覆盖它时,就能获得 SYSTEM 权限。我发现调用 RunAnalysis 时,HPSupportSolutionsFrameworkService 会启动许多由 SYSTEM 运行的进程。你可以用自己的可执行文件覆盖这些进程。但是,服务会在启动这些 EXE 之前检查其签名,因此你不能创建虚假 EXE,而只能利用这些 EXE 加载的 DLL。有许多 DLL 已经加载在某个位置,并且许多 .NET DLL 在加载前会检查签名,因此你不能使用它们。幸运的是,仍然有一些 DLL 可用:
我尝试修改了 hputils64.dll 并成功。我创建了一个指向 hputils64.dll 的硬链接。当调用 RunAnalysis 时,HPSAObjUtil8 更改了 hputils64.dll 的权限,几秒钟后 Detect_BatteryFailure.exe(以 LOCAL SYSTEM 权限运行)启动并加载 hputils64.dll。在 hputils64 加载之前,你可以覆盖它,这样 Detect_BatteryFailure.exe 就会加载你的恶意 DLL,最终获得 SYSTEM 权限。
为了编写利用代码,我创建了:
以下是 PrivHP4.py 中的利用步骤:
要测试 PoC,只需克隆仓库并运行 PrivHP4.py。