
PoC für Privilegieneskalation im Windows 10 Diagnostics Hub Standard Collector Service
PoC für Privilege Escalation im Windows 10 Diagnostics Hub Standard Collector Service
Die Diagnostics Hub Packaging-Bibliothek, die vom Windows Standard Collector Service verwendet wird, kann gezwungen werden, eine beliebige Datei an einen beliebigen Speicherort zu kopieren, da in DiagnosticsHub.StandardCollector.Runtime.dll keine Client-Impersonation durchgeführt wird.
Hier finden Sie eine ausführliche Beschreibung, wie diese Schwachstelle gefunden und ausgenutzt wurde: Privilege Escalation Vulnerability in Windows Standard Collector Service.
Der Standard Collector Service erlaubt es, beim Konfigurieren einer Diagnosesitzung mehrere Werte festzulegen, einschließlich des Scratch-Verzeichnisses und der Sitzungs-ID. Die Sitzungs-ID kann eine beliebige GUID sein, und das Scratch-Verzeichnis kann ein beliebiger Ort sein, an dem der Benutzer Schreibrechte besitzt. Wenn die Sammlungssitzung mit einer ID von c13851b2-b1e1-438f-bf73-949df897f1bf und einem Scratch-Pfad von C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\ konfiguriert ist, treten beim Aufrufen der GetCurrentResult-Methode des ICollectionSession-Objekts die folgenden Ereignisse auf:
C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etlC:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65Diese Ordner und ETL-Dateien werden vom Collector-Dienst für das .diagsession-Paket erstellt, das normalerweise erstellt wird, wenn eine Sitzung beendet wurde. Das Aufrufen der Stop-Methode auf dem ICollectionSession-Objekt veranlasst den Collector-Dienst, das Diagnosepaket durch Aufruf von Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage zu übernehmen. Die CommitPackage-Funktion kopiert oder verschiebt die ursprüngliche Datei {scratch path}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl in den Ordner mit der zufälligen GUID: {scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl
Der Kopier-/Verschiebevorgang, der durch die CommitPackagingResult-Funktion in DiagnosticsHub.StandardCollector.Runtime.dll ausgelöst wird, wird ohne Impersonation des Benutzers durchgeführt (anders als bei der anfänglichen Erstellung von Dateien/Ordnern), was zu einem möglichen TOCTOU-Problem führt, wenn der Zielordner durch einen Mount-Point ersetzt wird, der das Kopieren auf einen beliebigen Speicherort umleitet. Um dieses Problem sinnvoll auszunutzen, müsste ein Angreifer den Inhalt der ETL-Datei austauschen, bevor sie kopiert wird. Dies kann erreicht werden, indem man die Race Condition mit einem OpLock gewinnt, nachdem das Dateihandle vom Dienst freigegeben wurde.
Obwohl wir den Namen der kopierten .etl-Datei nicht vollständig kontrollieren, können wir den Symlink-Trick des Objektverzeichnisses nutzen, um ihn zu kontrollieren. Der Aufbau aus Mount-Point und Symlink würde in etwa so aussehen:
{scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\ -> \RPC Control\\RPC Control\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl -> C:\Windows\System32\anything.dllDie Kontrolle über den Dateiinhalt, den Kopierort und den Dateinamen gibt einem Angreifer zahlreiche Möglichkeiten zum Laden von DLLs. Der enthaltene PoC zeigt jedoch, dass die Kontrolle über den Dateinamen nicht erforderlich ist, da der Collector-Dienst bereitwillig eine DLL mit einem beliebigen Dateinamen lädt, solange sie sich im Verzeichnis C:\Windows\System32 oder C:\Windows\System32\DiagSvcs befindet. Dies wird erreicht, indem eine neue Collector-Sitzung mit einem Agenten gestartet wird, dessen Assembly-Name mit dem Namen der kopierten DLL c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl übereinstimmt.
Der enthaltene PoC ist eine Visual-Studio-Projektmappe mit einem C++-DLL-Projekt für die notepad.exe-Popup-Payload und einem C#-Projekt zur Interaktion mit dem Dienst und zur Ausnutzung der Schwachstelle mit der NtApiDotNet-Bibliothek.
Schritte zur Reproduktion:
Erwartetes Ergebnis:
Der Paket-Commit-Vorgang impersoniert den Benutzer und schlägt beim Versuch, die Datei zu kopieren, fehl.
Beobachtetes Ergebnis:
Die Datei wird in den Mount-Point-Zielordner C:\Windows\System32 kopiert, dann als Collector-Agent geladen, und schließlich wird notepad.exe mit SYSTEM-Berechtigungen gestartet.