
Lokale Privilegienausweitung im HP Support Assistant
Ein Fehler zur lokalen Rechteausweitung im HP Support Assistant durch Missbrauch eines Hardlinks
Forscher: ManhNDd von Bkav
In der HP Support Assistant GUI führt der Dienst HP Support Solution Framework einige Aufgaben aus, wenn Sie auf Check for updates and messages klicken. Dabei wird HPSAObjUtil8.exe (ausgeführt als SYSTEM) gestartet, das die Berechtigungen aller .xml-Dateien in C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA ändert. Im Detail gewährt HPSAObjUtil8.exe allen Benutzern die vollständige Kontrolle über diese .xml-Dateien. Der verwundbare Code in HPSAObjUtil8 lautet wie folgt:
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);
}
}
}
}
Ein Benutzer kann im Ordner C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA einen Hardlink mit dem Namen ???.xml erstellen und ihn auf eine Zieldatei unserer Wahl zeigen lassen (wir benötigen lediglich Lesezugriff). Anschließend lässt man HPSAObjUtil8 die Berechtigungen dieser Datei ändern, sodass wir volle Berechtigungen (Lesen/Schreiben/Löschen) über die Datei erhalten. Daher ermöglicht uns dieser Fehler, volle Berechtigungen über Systemdateien zu erlangen => Sie können eine System-DLL überschreiben, um Systemrechte zu erhalten. Übrigens setzt der CVSS-3.0-Score des Fehlers Privileges Required auf High. Dies sollte eigentlich None sein, da ich den Fehler erfolgreich mit einem Nicht-Administrator-Benutzer getestet habe.
Durch Reverse Engineering von HPSF.exe und HPSupportSolutionsFrameworkService.exe habe ich herausgefunden, dass der Client HPSF.exe über das Interface HP.SupportFramework.ServiceManager.Interfaces.IServiceInterface (definiert in HP.SupportFramework.ServiceManager.dll) mit dem Dienst kommuniziert. Wenn der Client die Methode IserviceInterface.RunAnalysis aufruft, startet der Dienst HPSAObjUtil8 und löst den Fehler aus.
ServiceInterface.Instance.RunAnalysis("en-US", true);
Sie müssen also einen gefälschten Client erstellen und RunAnalysis aufrufen. Der Dienst validiert seinen Client jedoch, bevor er die Anforderung verarbeitet:
{
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;
}
Umgehen wir die Client-Validierung:
Nun müssen Sie eine ausführbare Datei finden, die als Ziel für den Hardlink dienen kann. Es sollte eine EXE oder DLL sein, die irgendwann automatisch als SYSTEM ausgeführt wird, sodass Sie beim Überschreiben SYSTEM-Rechte erhalten. Mir ist aufgefallen, dass HPSupportSolutionsFrameworkService beim Aufruf von RunAnalysis viele Prozesse als SYSTEM startet. Sie können diese Prozesse mit Ihrer eigenen ausführbaren Datei überschreiben. Der Dienst prüft jedoch die Signaturen dieser EXEs, bevor er sie startet. Sie können also keine gefälschten EXEs erstellen, sondern müssen auf DLLs zurückgreifen, die von diesen EXEs geladen werden. Es gibt viele DLLs, die bereits irgendwo geladen werden, und viele .NET-DLLs werden vor dem Laden signaturgeprüft, sodass Sie sie nicht verwenden können. Glücklicherweise gibt es noch einige DLLs, die verwendbar sind:
Ich habe versucht, hputils64.dll zu modifizieren, und das ist mir gelungen. Ich erstelle einen Hardlink auf hputils64.dll. Beim Aufruf von RunAnalysis ändert HPSAObjUtil8 die Berechtigungen von hputils64.dll. Einige Sekunden später startet Detect_BatteryFailure.exe (als LOCAL SYSTEM) und lädt hputils64.dll. Bevor hputils64 geladen wird, können Sie die Datei überschreiben, sodass Detect_BatteryFailure.exe Ihre bösartige DLL lädt und Sie schließlich SYSTEM-Rechte erhalten.
Für den Exploit habe ich Folgendes erstellt:
Im Folgenden sind die Schritte zur Ausnutzung in PrivHP4.py:
Um den PoC zu testen, klonen Sie einfach das Repository und führen Sie PrivHP4.py aus.