browserforensics
Retour à tous les articles

DPAPI Windows hors ligne : désencapsuler la clé os_crypt

2026-06-17 · 4 min

La clé de cookies de Chromium est un blob DPAPI : une clé AES-256 chiffrée sous les identifiants de l'utilisateur Windows. La manière naïve de la désencapsuler consiste à appeler CryptUnprotectData en étant connecté en tant que cet utilisateur. Sur une image acquise, vous n'avez pas ce luxe — mais DPAPI est entièrement réversible hors ligne si vous disposez des bonnes entrées. Voici toute la chaîne.

Avec quoi DPAPI protège

DPAPI ne chiffre jamais vos données directement avec votre mot de passe. Il utilise une masterkey — un secret de 64 octets stocké, lui-même chiffré, dans :

%APPDATA%\Microsoft\Protect\<SID>\<GUID>

Un fichier par masterkey, nommé par GUID ; le dossier est nommé par le SID de l'utilisateur. Un blob DPAPI enregistre, dans son en-tête, le GUID de la masterkey qui l'a scellé — le blob vous indique donc de quel fichier masterkey vous avez besoin.

Pour déchiffrer un blob, il vous faut par conséquent trois éléments sur disque plus un secret :

  1. le blob (ici, l'encrypted_key de Local State),
  2. le fichier masterkey pour le GUID que le blob désigne,
  3. le SID de l'utilisateur (le nom du dossier \Protect\),
  4. le hash NT ou le mot de passe de l'utilisateur.

Étape 1 — déchiffrer la masterkey

Le fichier masterkey est chiffré avec une clé dérivée du secret utilisateur et du SID. La fonction deriveKeysFromUserkey d'impacket fait référence :

preKey = HMAC-SHA1( NT_hash, UTF16LE(sid + "\0") )

(À partir d'un mot de passe à la place, l'équivalent utilise SHA1(password) et MD4(password) — et MD4(password) est le hash NT, ce qui explique pourquoi le hash seul suffit.) Ce preKey alimente ensuite la dérivation de masterkey de Microsoft, qui n'est pas du PBKDF2 standard — elle accumule par XOR PRF(P, derived) plutôt que PRF(P, U_prev). Si vous vous trompez de boucle, tout ce qui suit n'est que déchets.

Les octets dérivés se scindent en une clé AES-256 et un IV, déchiffrent le corps de la masterkey en AES-CBC, et — point crucial — le résultat porte un HMAC que vous vérifiez. Cette autovérification est ce qui rend le DPAPI hors ligne digne de confiance : un mauvais SID ou un mauvais hash échoue au HMAC, de sorte qu'un déchiffrement réussi est prouvablement correct. Il n'y a pas de mode d'échec « ça paraît plausible ».

Les masterkeys modernes de Windows 10/11 utilisent AES-256 avec un PRF HMAC-SHA1 ou HMAC-SHA512. Les plus anciennes utilisaient 3DES ; ce chemin est rare et ne vaut pas la peine d'être porté pour une clé de cookies.

Étape 2 — déchiffrer le blob

Avec la masterkey de 64 octets en main, le blob encrypted_key se déchiffre selon ses propres termes :

keyHash    = SHA1(masterkey)
sessionKey = HMAC-SHA512(keyHash, blob.salt)
plaintext  = AES-256-CBC-decrypt(blob.data, key = sessionKey[:32], iv = 0)

Retirez le padding PKCS#7 et vous obtenez la clé AES de 32 octets — la même clé qui déchiffre toutes les valeurs de cookies v10 du profil. Chrome appelle CryptProtectData sans entropie, il n'y a donc pas de secret supplémentaire à fournir.

D'où provient le hash NT

La chaîne nécessite le hash NT de l'utilisateur (ou son mot de passe). Sur une image disque, vous le récupérez de la même manière que pour n'importe quel travail sur identifiants : depuis la ruche SAM, déchiffrée avec la boot key issue de SYSTEM. C'est exactement ce que produit un outil de type secretsdump. L'enchaînement pratique est donc :

  • SYSTEM + SAM → hash NT de l'utilisateur,
  • Local State + fichier masterkey + SID + ce hash NT → clé AES Chrome,
  • clé AES + Cookies → clair.

Pour un compte de domaine dont vous n'avez pas le mot de passe, le mot de passe en clair de l'utilisateur (s'il est connu) fonctionne directement ; sinon, la masterkey peut être récupérable via la clé de sauvegarde du domaine — hors du périmètre ici.

Une note sur les clés app-bound (v20)

Tout ce qui précède désencapsule l'encrypted_key v10 classique. L'app_bound_encrypted_key v20 ajoute une couche DPAPI système (récupérable depuis la clé machine de la ruche SECURITY) plus une étape de service app-bound qui n'est pas de la cryptographie hors ligne pure. Considérez le v20 comme partiellement hors ligne jusqu'à ce que l'outillage rattrape son retard.

Le faire sans machine Windows

Rien de tout cela ne nécessite la machine d'origine — ce sont du HMAC, du SHA, de l'AES-CBC et un KDF particulier. C'est précisément pour cela que cela peut s'exécuter entièrement dans un onglet de navigateur, sans qu'aucun mot de passe ni aucune clé ne quitte jamais la page.

Pour aller plus loin