Writable Sys Path +Dll Hijacking Privesc
Introduction
Si vous découvrez que vous pouvez écrire dans un dossier de chemin système (notez que cela ne fonctionnera pas si vous pouvez écrire dans un dossier de chemin utilisateur), il est possible que vous puissiez escalader les privilèges dans le système.
Pour ce faire, vous pouvez abuser d'un Hijacking de Dll où vous allez détourner une bibliothèque en cours de chargement par un service ou un processus avec plus de privilèges que les vôtres, et parce que ce service charge une Dll qui n'existe probablement même pas dans tout le système, il va essayer de la charger à partir du chemin système où vous pouvez écrire.
Pour plus d'informations sur ce qu'est le Dll Hijacking, consultez :
Dll HijackingPrivilège d'escalade avec Dll Hijacking
Trouver une Dll manquante
La première chose dont vous avez besoin est d'identifier un processus s'exécutant avec plus de privilèges que les vôtres qui tente de charger une Dll à partir du chemin système dans lequel vous pouvez écrire.
Le problème dans ces cas est que probablement ces processus sont déjà en cours d'exécution. Pour trouver quelles Dll manquent aux services, vous devez lancer procmon dès que possible (avant le chargement des processus). Ainsi, pour trouver les .dll manquantes, faites :
Créez le dossier
C:\privesc_hijacking
et ajoutez le cheminC:\privesc_hijacking
à la variable d'environnement du chemin système. Vous pouvez le faire manuellement ou avec PS :
Lancez
procmon
et allez dansOptions
-->Activer l'enregistrement au démarrage
et appuyez surOK
dans la fenêtre qui s'affiche.Ensuite, redémarrez. Lorsque l'ordinateur redémarre,
procmon
commencera à enregistrer les événements dès que possible.Une fois que Windows est démarré, exécutez
procmon
à nouveau, il vous indiquera qu'il était en cours d'exécution et vous demandera si vous souhaitez enregistrer les événements dans un fichier. Dites oui et enregistrez les événements dans un fichier.Après la génération du fichier, fermez la fenêtre
procmon
ouverte et ouvrez le fichier des événements.Ajoutez ces filtres et vous trouverez toutes les DLL que certains processus ont tenté de charger à partir du dossier Chemin système inscriptible :
DLLs manquantes
En exécutant ceci dans une machine virtuelle (vmware) Windows 11 gratuite, j'ai obtenu ces résultats :
Dans ce cas, les .exe sont inutiles, ignorez-les, les DLL manquantes provenaient de :
Service | Dll | Ligne de commande |
---|---|---|
Planificateur de tâches (Schedule) | WptsExtensions.dll |
|
Service de stratégie de diagnostic (DPS) | Unknown.DLL |
|
??? | SharedRes.dll |
|
Après avoir trouvé cela, j'ai trouvé ce billet de blog intéressant qui explique également comment abuser de WptsExtensions.dll pour l'élévation de privilèges. Ce que nous allons faire maintenant.
Exploitation
Donc, pour élever les privilèges, nous allons détourner la bibliothèque WptsExtensions.dll. Ayant le chemin et le nom, nous devons simplement générer la DLL malveillante.
Vous pouvez essayer d'utiliser l'un de ces exemples. Vous pourriez exécuter des charges utiles telles que : obtenir un shell inversé, ajouter un utilisateur, exécuter un beacon...
Notez que tous les services ne sont pas exécutés avec NT AUTHORITY\SYSTEM
, certains sont également exécutés avec NT AUTHORITY\LOCAL SERVICE
qui a moins de privilèges et vous ne pourrez pas créer un nouvel utilisateur pour abuser de ses autorisations.
Cependant, cet utilisateur a le privilège seImpersonate
, vous pouvez donc utiliser la suite potato pour élever les privilèges. Ainsi, dans ce cas, un shell inversé est une meilleure option que d'essayer de créer un utilisateur.
Au moment de l'écriture, le service Planificateur de tâches est exécuté avec Nt AUTHORITY\SYSTEM.
Après avoir généré la DLL malveillante (dans mon cas, j'ai utilisé un shell inversé x64 et j'ai obtenu un shell, mais Defender l'a tué car il provenait de msfvenom), enregistrez-la dans le Chemin système inscriptible avec le nom WptsExtensions.dll et redémarrez l'ordinateur (ou redémarrez le service ou faites ce qu'il faut pour relancer le service/programme affecté).
Lorsque le service est redémarré, la DLL devrait être chargée et exécutée (vous pouvez réutiliser l'astuce procmon pour vérifier si la bibliothèque a été chargée comme prévu).
Last updated