
PoC pour l'élévation de privilèges dans le service Windows 10 Diagnostics Hub Standard Collector
PoC pour l'élévation de privilèges dans le service Standard Collector du Diagnostics Hub de Windows 10
La bibliothèque Diagnostics Hub Packaging, utilisée par le service Windows Standard Collector, peut être forcée à copier un fichier arbitraire vers un emplacement arbitraire en raison du manque d'emprunt d'identité du client dans DiagnosticsHub.StandardCollector.Runtime.dll.
Voici un compte-rendu détaillé de la façon dont cette vulnérabilité a été découverte et exploitée : Privilege Escalation Vulnerability in Windows Standard Collector Service.
Le service Standard Collector permet de définir plusieurs valeurs lors de la configuration d'une session de diagnostic, notamment le répertoire scratch et l'ID de session. L'ID de session peut être n'importe quel GUID et le répertoire scratch peut être n'importe quel emplacement où l'utilisateur dispose de droits d'écriture. Si la session de collecte est configurée avec un ID de c13851b2-b1e1-438f-bf73-949df897f1bf et un chemin scratch de C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\, les événements suivants se produisent lors de l'appel de la méthode GetCurrentResult de l'objet ICollectionSession :
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-5DF276F69E65Ces dossiers et fichiers ETL sont créés par le service de collecte pour le package .diagsession qui est normalement créé lorsqu'une session se termine. L'appel de la méthode Stop sur l'objet ICollectionSession amène le service de collecte à valider le package de diagnostic en appelant Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage. La fonction CommitPackage copie ou déplace le fichier d'origine {scratch path}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl vers le dossier GUID aléatoire : {scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl
L'opération de copie/déplacement déclenchée par la fonction CommitPackagingResult dans DiagnosticsHub.StandardCollector.Runtime.dll est effectuée sans emprunter l'identité de l'utilisateur (contrairement à la création initiale des fichiers/dossiers), ce qui peut conduire à un problème TOCTOU si le dossier cible est remplacé par un point de montage qui redirige la copie vers un emplacement arbitraire. Pour exploiter ce problème de manière utile, un attaquant doit remplacer le contenu du fichier ETL avant qu'il ne soit copié. Cela peut être fait en gagnant la course (race condition) avec un OpLock après que le service a libéré le descripteur du fichier.
Bien que nous ne contrôlions pas entièrement le nom du fichier .etl copié, nous pouvons utiliser l'astuce du lien symbolique de répertoire d'objets pour le contrôler. La configuration point de montage + lien symbolique ressemblerait à ceci :
{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.dllLe contrôle du contenu du fichier, de l'emplacement de copie et du nom du fichier offre à un attaquant de nombreuses possibilités de chargement de DLL. Cependant, le PoC inclus démontre que le contrôle du nom de fichier n'est pas nécessaire, car le service de collecte charge volontiers une DLL quel que soit son nom, tant qu'elle se trouve dans le répertoire C:\Windows\System32 ou C:\Windows\System32\DiagSvcs. Pour ce faire, on démarre une nouvelle session de collecte avec un agent dont le nom d'assembly correspond au nom de la DLL copiée c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl.
Le PoC inclus est une solution Visual Studio avec un projet DLL C++ pour le payload qui lance notepad.exe et un projet C# pour interagir avec le service et exploiter la vulnérabilité à l'aide de la bibliothèque NtApiDotNet.
Étapes pour reproduire :
Résultat attendu :
L'opération de validation du package emprunte l'identité de l'utilisateur et échoue lors de la tentative de copie du fichier.
Résultat observé :
Le fichier est copié dans le dossier cible du point de montage C:\Windows\System32, puis chargé comme agent de collecte, et enfin, notepad.exe est lancé avec les privilèges SYSTEM.