
Windows - Armement d'écritures de fichiers privilégiées avec le service Update Session Orchestrator
⚠️ Mise à jour du 2020-06-06 : cette astuce ne fonctionne plus sur les dernières versions de Windows 10 Insider Preview. Cela signifie que, bien qu'elle fonctionne encore sur la version standard de Windows 10, vous devriez vous attendre à ce qu'elle soit corrigée dans les mois à venir.
Cette Preuve de Concept (PoC) montre une technique qui peut être utilisée pour exploiter les vulnérabilités d'écriture de fichier privilégiées sous Windows. Elle offre une alternative à l'« exploit » de chargement de DLL DiagHub trouvé par James Forshaw (alias @tiraniddo), qui a été corrigé par Microsoft à partir de la version 1903.
À partir de Windows 10, Microsoft a introduit le service Update Session Orchestrator. En tant qu'utilisateur standard, vous pouvez interagir avec ce service via COM, et par exemple lancer une « recherche de mises à jour » (vérifier si des mises à jour sont disponibles) ou démarrer le téléchargement des mises à jour en attente. Il existe même un outil intégré non documenté appelé usoclient.exe, qui remplit cet objectif.
Du point de vue d'un attaquant, ce service est intéressant car il s'exécute en tant que NT AUTHORITY\System et tente de charger une DLL inexistante (windowscoredeviceinfo.dll) lorsqu'une session de mise à jour est créée.
Cela signifie que, si nous trouvions une vulnérabilité d'écriture de fichier privilégiée dans Windows ou dans un logiciel tiers, nous pourrions copier notre propre version de windowscoredeviceinfo.dll dans C:\Windows\Sytem32\ et la faire charger par le service USO pour obtenir une exécution de code arbitraire en tant que NT AUTHORITY\System.
Pour plus d'informations :
Partie 1 - https://itm4n.github.io/usodllloader-part1/
Partie 2 - https://itm4n.github.io/usodllloader-part2/
Cette solution est composée de deux projets : WindowsCoreDeviceInfo et UsoDllLoader.
Il fournit une DLL de PoC qui démarrera un shell lié (bind shell) sur le port 1337 (localhost uniquement), chaque fois que la fonction QueryDeviceInformation() est appelée. C'est le nom de la fonction utilisée par les workers USO.
C'est une version allégée de usoclient.exe. Il peut être exécuté en tant qu'utilisateur standard pour interagir avec le service USO et lui faire charger windowscoredeviceinfo.dll. Ensuite, il tentera de se connecter au shell lié. En cas d'erreurs, veuillez lire la section « Problèmes connus ».
La solution est déjà préconfigurée, donc la compilation devrait être facile. J'utilise Visual Studio 2019. Cela pourrait ne pas fonctionner avec des versions plus anciennes.
Release et l'architecture x64..\x64\Release\WindowsCoreDeviceInfo.dll et le chargeur .\x64\Release\UsoDllLoader.exe.À des fins de test, vous pouvez :
WindowsCoreDeviceInfo.dll dans C:\Windows\System32\.NT AUTHORITY\SYSTEM.Si UsoDllLoader.exe échoue, vous pouvez faire ce qui précède manuellement.
WindowsCoreDeviceInfo.dll dans C:\Windows\System32\.usoclient StartInteractiveScan en tant qu'utilisateur standard. Notez que vous n'obtiendrez aucun retour de la commande.nc.exe 127.0.0.1 1337 pour vous connecter au shell lié.Cette méthode échouera probablement si une ou plusieurs mises à jour sont en attente d'installation, ou si des mises à jour sont en cours d'installation.
Selon la version de Windows, UsoDllLoader.exe peut échouer avec divers codes d'erreur. Je n'ai pas trop investigué ces problèmes. La raison en est qu'il s'agit seulement d'une PoC, que j'ai développée pour ma commodité. Ce qui importe le plus est la DLL, pas le chargeur. Voir « Utilisation 2 » pour plus de détails.