
Escalação Local de Privilégios no HP Support Assistant
Um bug de escalação de privilégio local no HP Support Assistant abusando de hard link
Pesquisador: ManhNDd da Bkav
No HP Support Assistant GUI, quando você clica em Check for updates and messages, o serviço HP Support Solution Framework executará algumas tarefas, inicia HPSAObjUtil8.exe (executado como SYSTEM) que altera a permissão de todos os arquivos .xml em C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA. Em detalhes, HPSAObjUtil8.exe concede controle total sobre esses arquivos .xml a todos os usuários. Segue o código vulnerável em 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);
}
}
}
}
Um usuário pode criar um hardlink com nome ???.xml na pasta C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA, e apontá-lo para um arquivo vítima de nossa escolha (tudo que precisamos é acesso de leitura), então deixar HPSAObjUtil8 modificar as permissões dele para que tenhamos permissões totais sobre o arquivo (leitura/escrita/exclusão). Portanto, esse bug nos permite obter permissões totais sobre arquivos do sistema => você pode sobrescrever uma DLL do sistema para obter privilégios de sistema. A propósito, a pontuação CVSS 3.0 do bug define Privileges Required como Alto. Isso deveria ser Nenhum, porque testei o bug com sucesso em um usuário não administrador.
Ao reverter o HPSF.exe e o HPSupportSolutionsFrameworkService.exe, descobri que o cliente HPSF.exe se comunica com o serviço através da interface HP.SupportFramework.ServiceManager.Interfaces.IServiceInterface (definida em HP.SupportFramework.ServiceManager.dll). Se o cliente chamar o método IserviceInterface.RunAnalysis, o serviço iniciará o HPSAObjUtil8 e acionará o bug.
ServiceInterface.Instance.RunAnalysis("en-US", true);
Então você precisa criar um cliente falso e chamar RunAnalysis. No entanto, o serviço valida seu cliente antes de processar a solicitação:
{
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;
}
Vamos contornar a validação do cliente:
Agora você precisa encontrar um executável que possa ser o alvo do hardlink. Deve ser um EXE ou DLL que será executado como SYSTEM automaticamente em algum momento, para que quando você o sobrescrever, obtenha privilégios SYSTEM. Vejo que ao chamar RunAnalysis, HPSupportSolutionsFrameworkService inicia muitos processos como SYSTEM. Você pode sobrescrever esses processos com seu próprio executável. No entanto, o serviço verifica as assinaturas desses EXEs antes de iniciá-los, então você não pode criar EXEs falsos, mas recorrer a DLLs carregadas por esses EXEs. Há muitas DLLs já carregadas em algum lugar, e muitas DLLs .NET têm assinatura verificada antes de serem carregadas, então você não pode usá-las. Felizmente, ainda existem algumas DLLs utilizáveis:
Tentei modificar hputils64.dll e consegui. Crio um hardlink para hputils64.dll. Ao chamar RunAnalysis, HPSAObjUtil8 altera as permissões de hputils64.dll, então alguns segundos depois Detect_BatteryFailure.exe é iniciado (como LOCAL SYSTEM) e carrega hputils64.dll. Antes de hputils64 ser carregado, você pode sobrescrevê-lo, para que Detect_BatteryFailure.exe carregue sua DLL maliciosa e você finalmente obtenha o direito SYSTEM.
Para escrever o exploit, criei:
A seguir estão os passos de exploração em PrivHP4.py:
Para testar o PoC, basta clonar o repositório e executar PrivHP4.py.