6.0 KiB
Writable Sys Path +Dll Hijacking Privesc
{{#include ../../../banners/hacktricks-training.md}}
Introduction
Si vous avez découvert 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 Dll Hijacking où vous allez détourner une bibliothèque chargée par un service ou un processus avec plus de privilèges que vous, 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 depuis le chemin système où vous pouvez écrire.
Pour plus d'infos sur ce qu'est Dll Hijacking, consultez :
{{#ref}} ./ {{#endref}}
Privesc avec Dll Hijacking
Trouver une Dll manquante
La première chose dont vous avez besoin est de identifier un processus s'exécutant avec plus de privilèges que vous et qui essaie de charger une Dll depuis le chemin système dans lequel vous pouvez écrire.
Le problème dans ces cas est que ces processus sont probablement déjà en cours d'exécution. Pour trouver quelles Dlls manquent aux services, vous devez lancer procmon dès que possible (avant que les processus ne soient chargés). Donc, pour trouver les .dll manquantes, faites :
- Créez le dossier
C:\privesc_hijacking
et ajoutez le cheminC:\privesc_hijacking
à la variable d'environnement de chemin système. Vous pouvez le faire manuellement ou avec PS :
# Set the folder path to create and check events for
$folderPath = "C:\privesc_hijacking"
# Create the folder if it does not exist
if (!(Test-Path $folderPath -PathType Container)) {
New-Item -ItemType Directory -Path $folderPath | Out-Null
}
# Set the folder path in the System environment variable PATH
$envPath = [Environment]::GetEnvironmentVariable("PATH", "Machine")
if ($envPath -notlike "*$folderPath*") {
$newPath = "$envPath;$folderPath"
[Environment]::SetEnvironmentVariable("PATH", $newPath, "Machine")
}
- Lancez
procmon
et allez dansOptions
-->Enable boot logging
et appuyez surOK
dans l'invite. - 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 dira qu'il a été en cours d'exécution et vous demandera si vous souhaitez stocker les événements dans un fichier. Dites oui et stockez les événements dans un fichier. - Après que le fichier soit généré, fermez la fenêtre
procmon
ouverte et ouvrez le fichier des événements. - Ajoutez ces filtres et vous trouverez tous les Dlls que certains processus ont essayé de charger depuis le dossier System Path écrivable :

Dlls manquants
En exécutant cela sur une machine Windows 11 virtuelle (vmware) gratuite, j'ai obtenu ces résultats :

Dans ce cas, les .exe sont inutiles, donc ignorez-les, les DLL manquantes provenaient de :
Service | Dll | Ligne de commande |
---|---|---|
Planificateur de tâches (Schedule) | WptsExtensions.dll | C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule |
Service de politique de diagnostic (DPS) | Unknown.DLL | C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS |
??? | SharedRes.dll | C:\Windows\system32\svchost.exe -k UnistackSvcGroup |
Après avoir trouvé cela, j'ai trouvé cet article de blog intéressant qui explique également comment abuser de WptsExtensions.dll pour l'élévation de privilèges. C'est 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 juste 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...
Warning
Notez que tous les services ne sont pas exécutés avec
NT AUTHORITY\SYSTEM
, certains sont également exécutés avecNT AUTHORITY\LOCAL SERVICE
, qui a moins de privilèges et vous ne pourrez pas créer un nouvel utilisateur en abusant de ses permissions.
Cependant, cet utilisateur a le privilègeseImpersonate
, donc vous pouvez utiliser la potato suite pour élever les privilèges. Donc, dans ce cas, un shell inversé est une meilleure option que d'essayer de créer un utilisateur.
Au moment de la rédaction, le service Planificateur de tâches est exécuté avec Nt AUTHORITY\SYSTEM.
Ayant 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é parce qu'il provenait de msfvenom), enregistrez-le dans le chemin système écrivable sous le nom WptsExtensions.dll et redémarrez l'ordinateur (ou redémarrez le service ou faites tout 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 le truc procmon pour vérifier si la bibliothèque a été chargée comme prévu).
{{#include ../../../banners/hacktricks-training.md}}