From 81868fb3592dcaeda87cded1207459c5aa445f55 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 10 Jul 2025 10:20:04 +0000 Subject: [PATCH] Translated ['src/windows-hardening/windows-local-privilege-escalation/dp --- .../dpapi-extracting-passwords.md | 96 ++++++++++++++----- 1 file changed, 72 insertions(+), 24 deletions(-) diff --git a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md index d5f2cb533..96104b03b 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md @@ -6,9 +6,9 @@ ## DPAPIとは -データ保護API(DPAPI)は、主にWindowsオペレーティングシステム内で**非対称プライベートキーの対称暗号化**に利用され、ユーザーまたはシステムの秘密を重要なエントロピーのソースとして活用します。このアプローチは、開発者がユーザーのログオン秘密から派生したキーを使用してデータを暗号化できるようにすることで、暗号化を簡素化し、システム暗号化の場合はシステムのドメイン認証秘密を使用することで、開発者が暗号化キーの保護を自分で管理する必要を排除します。 +データ保護API(DPAPI)は、主にWindowsオペレーティングシステム内で**非対称プライベートキーの対称暗号化**に利用され、ユーザーまたはシステムの秘密を重要なエントロピーのソースとして活用します。このアプローチは、開発者がユーザーのログオン秘密から派生したキーを使用してデータを暗号化できるようにすることで、暗号化を簡素化し、システム暗号化の場合はシステムのドメイン認証秘密を使用することで、開発者が暗号化キーの保護を自ら管理する必要を排除します。 -DPAPIを使用する最も一般的な方法は、**`CryptProtectData`および`CryptUnprotectData`**関数を通じてであり、これによりアプリケーションは現在ログオンしているプロセスのセッションでデータを安全に暗号化および復号化できます。これは、暗号化されたデータはそれを暗号化したのと同じユーザーまたはシステムによってのみ復号化できることを意味します。 +DPAPIを使用する最も一般的な方法は、**`CryptProtectData`および`CryptUnprotectData`**関数を通じてであり、これによりアプリケーションは現在ログオンしているプロセスのセッションでデータを安全に暗号化および復号化できます。これは、暗号化されたデータはそれを暗号化した同じユーザーまたはシステムによってのみ復号化できることを意味します。 さらに、これらの関数は**`entropy`パラメータ**も受け入れ、暗号化および復号化中に使用されます。したがって、このパラメータを使用して暗号化されたものを復号化するには、暗号化中に使用されたのと同じエントロピー値を提供する必要があります。 @@ -16,10 +16,10 @@ DPAPIを使用する最も一般的な方法は、**`CryptProtectData`および` DPAPIは、各ユーザーの資格情報に基づいてユニークなキー(**`pre-key`**と呼ばれる)を生成します。このキーはユーザーのパスワードやその他の要因から派生し、アルゴリズムはユーザーのタイプによって異なりますが、最終的にはSHA1になります。たとえば、ドメインユーザーの場合、**ユーザーのHTLMハッシュに依存します**。 -これは特に興味深いことで、攻撃者がユーザーのパスワードハッシュを取得できれば、次のことが可能です: +これは特に興味深いことで、攻撃者がユーザーのパスワードハッシュを取得できれば、次のことが可能になります: -- **そのユーザーのキーを使用してDPAPIで暗号化されたデータを復号化**し、APIに連絡する必要がありません -- **オフラインでパスワードをクラック**し、有効なDPAPIキーを生成しようとする +- **そのユーザーのキーを使用してDPAPIで暗号化されたデータを復号化**することができ、APIに連絡する必要がありません +- **オフラインでパスワードをクラック**し、有効なDPAPIキーを生成しようとすること さらに、ユーザーがDPAPIを使用してデータを暗号化するたびに、新しい**マスターキー**が生成されます。このマスターキーが実際にデータを暗号化するために使用されます。各マスターキーには、それを識別する**GUID**(グローバル一意識別子)が付与されます。 @@ -29,10 +29,10 @@ DPAPIは、各ユーザーの資格情報に基づいてユニークなキー( 暗号化されたブロブには、そのヘッダー内にデータを暗号化するために使用された**マスターキーのGUID**が含まれています。 -> [!NOTE] +> [!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 @@ -47,7 +47,7 @@ Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID} ### マシン/システムキーの生成 -これはマシンがデータを暗号化するために使用するキーです。これは**DPAPI_SYSTEM LSAシークレット**に基づいており、SYSTEMユーザーのみがアクセスできる特別なキーです。このキーは、マシンレベルの資格情報やシステム全体のシークレットなど、システム自体がアクセスする必要があるデータを暗号化するために使用されます。 +これはマシンがデータを暗号化するために使用するキーです。これは**DPAPI_SYSTEM LSAシークレット**に基づいており、これはSYSTEMユーザーのみがアクセスできる特別なキーです。このキーは、マシンレベルの資格情報やシステム全体のシークレットなど、システム自体がアクセスする必要があるデータを暗号化するために使用されます。 これらのキーは**ドメインバックアップを持っていない**ため、ローカルでのみアクセス可能であることに注意してください: @@ -63,7 +63,7 @@ DPAPIによって保護されている個人データには以下が含まれま - OutlookやWindows MailなどのアプリケーションのEメールおよび内部FTPアカウントのパスワード - 共有フォルダ、リソース、ワイヤレスネットワーク、Windows Vaultのパスワード、暗号化キーを含む - リモートデスクトップ接続、.NET Passport、およびさまざまな暗号化および認証目的のための秘密鍵のパスワード -- Credential Managerによって管理されるネットワークパスワードおよびCryptProtectDataを使用するアプリケーション内の個人データ、Skype、MSNメッセンジャーなど +- Credential Managerによって管理されるネットワークパスワードおよびSkype、MSNメッセンジャーなどのCryptProtectDataを使用するアプリケーション内の個人データ - レジストリ内の暗号化されたブロブ - ... @@ -72,9 +72,9 @@ DPAPIによって保護されている個人データには以下が含まれま - スケジュールされたタスクのパスワード - ... -### マスターキー抽出オプション +### マスタキー抽出オプション -- ユーザーがドメイン管理者権限を持っている場合、彼らは**ドメインバックアップキー**にアクセスして、ドメイン内のすべてのユーザーマスタキーを復号化できます: +- ユーザーがドメイン管理者権限を持っている場合、彼らは**ドメインバックアップキー**にアクセスしてドメイン内のすべてのユーザーマスタキーを復号化できます: ```bash # Mimikatz lsadump::backupkeys /system: /export @@ -82,7 +82,7 @@ lsadump::backupkeys /system: /export # SharpDPAPI SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk] ``` -- ローカル管理者権限を持っている場合、すべての接続ユーザーのDPAPIマスターキーとSYSTEMキーを抽出するために**LSASSメモリにアクセス**することが可能です。 +- ローカル管理者権限を持つことで、**LSASSメモリにアクセス**して、すべての接続ユーザーのDPAPIマスターキーとSYSTEMキーを抽出することが可能です。 ```bash # Mimikatz mimikatz sekurlsa::dpapi @@ -229,9 +229,34 @@ 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**](https://github.com/SpecterOps/EntropyCapture) (2022) は、ターゲットプロセス内のDPAPI関数をフックし、提供された任意のエントロピーを透過的に記録するユーザーモードDLLです。`outlook.exe`や`vpnclient.exe`のようなプロセスに対して**DLLインジェクション**モードでEntropyCaptureを実行すると、各エントロピーバッファを呼び出しプロセスとブロブにマッピングしたファイルが出力されます。キャプチャされたエントロピーは、後で**SharpDPAPI**(`/entropy:`)や**Mimikatz**(`/entropy:`)に供給してデータを復号化するために使用できます。 citeturn5search0 +```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: +``` +### マスターキーのオフラインクラッキング (Hashcat & DPAPISnoop) + +Microsoftは、Windows 10 v1607(2016)から**コンテキスト3**マスターキー形式を導入しました。`hashcat` v6.2.6(2023年12月)は、ユーザーパスワードをマスターキーファイルから直接GPU加速でクラッキングするためのハッシュモード**22100**(DPAPIマスターキーv1コンテキスト)、**22101**(コンテキスト1)、および**22102**(コンテキスト3)を追加しました。したがって、攻撃者はターゲットシステムと対話することなく、ワードリストまたはブルートフォース攻撃を実行できます。 citeturn8search1 + +`DPAPISnoop`(2024)はこのプロセスを自動化します: +```bash +# Parse a whole Protect folder, generate hashcat format and crack +DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\ --mode hashcat --outfile bob.hc +hashcat -m 22102 bob.hc wordlist.txt -O -w4 +``` +ツールは、CredentialおよびVaultのブロブを解析し、クラッキングされたキーでそれらを復号化し、平文のパスワードをエクスポートすることもできます。 + ### 他のマシンのデータにアクセスする -**SharpDPAPI** と **SharpChrome** では、リモートマシンのデータにアクセスするために **`/server:HOST`** オプションを指定できます。もちろん、そのマシンにアクセスできる必要があり、以下の例では **ドメインバックアップ暗号化キーが知られている** と仮定しています。 +**SharpDPAPI**および**SharpChrome**では、リモートマシンのデータにアクセスするために**`/server:HOST`**オプションを指定できます。もちろん、そのマシンにアクセスできる必要があり、以下の例では**ドメインバックアップ暗号化キーが知られている**と仮定しています。 ```bash SharpDPAPI.exe triage /server:HOST /pvk:BASE64 SharpChrome cookies /server:HOST /pvk:BASE64 @@ -240,27 +265,50 @@ SharpChrome cookies /server:HOST /pvk:BASE64 ### HEKATOMB -[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) は、LDAP ディレクトリからすべてのユーザーとコンピュータを抽出し、RPC を通じてドメインコントローラのバックアップキーを抽出するツールです。スクリプトはすべてのコンピュータの IP アドレスを解決し、すべてのコンピュータで smbclient を実行して、すべてのユーザーの DPAPI ブロブを取得し、ドメインバックアップキーでそれらを復号化します。 +[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) は、LDAP ディレクトリからすべてのユーザーとコンピュータを抽出し、RPC を通じてドメインコントローラのバックアップキーを抽出するツールです。スクリプトはすべてのコンピュータの IP アドレスを解決し、すべてのコンピュータで smbclient を実行して、すべてのユーザーの DPAPI ブロブを取得し、ドメインバックアップキーでそれを復号化します。 `python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp` -LDAP から抽出したコンピュータのリストを使用すると、知らなかったサブネットワークを見つけることができます! +LDAP から抽出したコンピュータのリストを使用すると、知らなかったサブネットワークをすべて見つけることができます! -### DonPAPI +### DonPAPI 2.x (2024-05) -[**DonPAPI**](https://github.com/login-securite/DonPAPI) は、DPAPI によって保護された秘密を自動的にダンプできます。 +[**DonPAPI**](https://github.com/login-securite/DonPAPI) は、DPAPI によって保護された秘密を自動的にダンプできます。2.x リリースでは以下が導入されました: -### 一般的な検出 +* 数百のホストからのブロブの並列収集 +* **context 3** マスタキーの解析と自動 Hashcat クラッキング統合 +* Chrome の「アプリバウンド」暗号化クッキーのサポート(次のセクションを参照) +* 新しい **`--snapshot`** モードでエンドポイントを繰り返しポーリングし、新しく作成されたブロブを比較します citeturn1search2 + +### DPAPISnoop + +[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) は、マスタキー/資格情報/ボールトファイルの C# パーサーで、Hashcat/JtR 形式で出力でき、オプションで自動的にクラッキングを呼び出すことができます。Windows 11 24H1 までのマシンおよびユーザーマスタキー形式を完全にサポートしています。 citeturn2search0 + + +## 一般的な検出 - `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`、`C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` およびその他の DPAPI 関連ディレクトリへのアクセス。 -- 特に C$ や ADMIN$ のようなネットワーク共有から。 -- LSASS メモリにアクセスするための Mimikatz の使用。 -- イベント **4662**: オブジェクトに対して操作が行われました。 -- このイベントを確認して、`BCKUPKEY` オブジェクトにアクセスされたかどうかを確認できます。 +- 特に **C$** や **ADMIN$** のようなネットワーク共有から。 +- LSASS メモリにアクセスするための **Mimikatz**、**SharpDPAPI** または類似のツールの使用。 +- イベント **4662**: *オブジェクトに対して操作が行われました* – **`BCKUPKEY`** オブジェクトへのアクセスと相関させることができます。 +- プロセスが *SeTrustedCredManAccessPrivilege*(資格情報マネージャー)を要求する際のイベント **4673/4674**。 + +--- +### 2023-2025 の脆弱性とエコシステムの変化 + +* **CVE-2023-36004 – Windows DPAPI セキュアチャネルの偽装**(2023年11月)。ネットワークアクセスを持つ攻撃者は、ドメインメンバーを騙して悪意のある DPAPI バックアップキーを取得させ、ユーザーマスタキーの復号化を可能にします。2023年11月の累積更新でパッチが適用されました – 管理者は DC とワークステーションが完全にパッチされていることを確認する必要があります。 citeturn4search0 +* **Chrome 127 “アプリバウンド” クッキー暗号化**(2024年7月)は、従来の DPAPI のみの保護を、ユーザーの **Credential Manager** に保存された追加のキーで置き換えました。オフラインでのクッキーの復号化には、DPAPI マスタキーと **GCM ラップされたアプリバウンドキー** の両方が必要です。SharpChrome v2.3 と DonPAPI 2.x は、ユーザーコンテキストで実行することで追加のキーを回復できます。 citeturn0search0 + ## 参考文献 -- [https://www.passcape.com/index.php?section=docsys\&cmd=details\&id=28#13](https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13) -- [https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++](https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c) +- https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13 +- https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c +- 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/ +- https://github.com/Hashcat/Hashcat/releases/tag/v6.2.6 +- https://github.com/Leftp/DPAPISnoop +- https://pypi.org/project/donpapi/2.0.0/ {{#include ../../banners/hacktricks-training.md}}