
Escalada de privilegios local en HP Support Assistant
Un fallo de escalada de privilegios local en HP Support Assistant mediante el abuso de enlaces duros
Investigador: ManhNDd de Bkav
En la GUI de HP Support Assistant, cuando haces clic en Buscar actualizaciones y mensajes, el servicio HP Support Solution Framework ejecutará algunas tareas, inicia HPSAObjUtil8.exe (se ejecuta como SYSTEM) que cambia los permisos de todos los archivos .xml en C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA. En detalle, HPSAObjUtil8.exe otorga control total sobre esos archivos .xml a todos los usuarios. El siguiente es el código vulnerable en 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);
}
}
}
}
Un usuario puede crear un enlace duro con nombre ???.xml en la carpeta C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA, y apuntarlo a un archivo víctima de nuestra elección (todo lo que necesitamos es acceso de lectura), luego dejar que HPSAObjUtil8 modifique sus permisos para que tengamos permisos totales sobre el archivo (lectura/escritura/eliminación). Así que este fallo nos permite obtener permisos totales sobre archivos del sistema => puedes sobrescribir una DLL del sistema para obtener privilegios de sistema. Por cierto, la puntuación CVSS 3.0 del fallo establece Privilegios requeridos en Alto. Esto debería ser Ninguno, porque probé el fallo con éxito en un usuario no administrador.
Al aplicar ingeniería inversa a HPSF.exe y HPSupportSolutionsFrameworkService.exe, descubrí que el cliente HPSF.exe se comunica con el servicio a través de la interfaz HP.SupportFramework.ServiceManager.Interfaces.IServiceInterface (definida en HP.SupportFramework.ServiceManager.dll). Si el cliente llama al método IserviceInterface.RunAnalysis, el servicio iniciará HPSAObjUtil8 y desencadenará el fallo.
ServiceInterface.Instance.RunAnalysis("en-US", true);
Por lo tanto, tienes que crear un cliente falso y llamar a RunAnalysis. Sin embargo, el servicio valida a su cliente antes de procesar la solicitud:
{
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 a evadir la validación del cliente:
Ahora necesitas encontrar un ejecutable que pueda ser el objetivo del enlace duro. Debería ser un EXE o DLL que se ejecute como SYSTEM automáticamente en algún momento, de modo que cuando lo sobrescribas, obtengas privilegios de SYSTEM. Veo que al llamar a RunAnalysis, HPSupportSolutionsFrameworkService inicia muchos procesos como SYSTEM. Puedes sobrescribir esos procesos con tu propio ejecutable. Sin embargo, el servicio comprueba las firmas de esos EXEs antes de iniciarlos, por lo que no puedes crear EXEs falsos, pero puedes recurrir a DLLs cargadas por esos EXEs. Hay muchas DLLs ya cargadas en algún lugar, y muchas DLLs .NET cuya firma se comprueba antes de ser cargadas, así que no puedes usarlas. Afortunadamente, todavía hay algunas DLLs utilizables:
Intenté modificar hputils64.dll y lo logré. Creo un enlace duro a hputils64.dll. Al llamar a RunAnalysis, HPSAObjUtil8 cambia los permisos de hputils64.dll, y unos segundos después Detect_BatteryFailure.exe se inicia (como LOCAL SYSTEM) y carga hputils64.dll. Antes de que hputils64 se cargue, puedes sobrescribirla, de modo que Detect_BatteryFailure.exe cargue tu DLL maliciosa y finalmente obtengas los privilegios de SYSTEM.
Para escribir el exploit, creé:
Los siguientes son los pasos de explotación en PrivHP4.py:
Para probar el PoC, simplemente clona el repositorio y ejecuta PrivHP4.py.