Impacket dpapi.py
DPAPI のマスターキー、資格情報、Vault、CREDHIST などを解析・復号します。一部の操作ではリモートホストから材料を取得します。
| 項目 | 内容 |
|---|---|
| 実装 | examples/dpapi.py |
| カテゴリ | 秘密情報 / DPAPI / レジストリ / ファイル解析 |
| 規模 | 633 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/dpapi.py -h で確認できます。
subcommand: backupkeys、masterkey、credential、vault、unprotect、credhist
| 引数 | 説明 |
|---|---|
-debug | Turn DEBUG output ON |
-ts | Adds timestamp to every logging output |
-t / --target | [[domain/]username[:password]@] |
-hashes | NTLM hashes, format is LMHASH:NTHASH |
-no-pass | don’t ask for password (useful for -k) |
-k | Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the ones specified in the command line |
-aesKey | AES key to use for Kerberos Authentication (128 or 256 bits) |
-dc-ip | IP Address of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameter |
--export | export keys to file |
-file | Master Key File to parse(必須) |
-sid | SID of the user |
-pvk | Domain backup privatekey to use for decryption |
-key | Specific key to use for decryption |
-password | User’s password. If you specified the SID and not the password it will be prompted |
-system | SYSTEM hive to parse |
-security | SECURITY hive to parse |
-vcrd | Vault Credential file |
-vpol | Vault Policy file |
-entropy | String with extra entropy needed for decryption |
-entropy-file | File with binary entropy contents (overwrites -entropy) |
-outfile | unprotect で復号したバイト列をファイルに保存します。省略時は hexdump を表示します。 |
-entry | Entry index in CREDHIST |
関連技術: DPAPI / SAM / LSA / NTDS の master key 階層、deriveKeysFromUser、Vault。
詳細な処理フロー
Section titled “詳細な処理フロー”backupkeys、masterkey、credential、vault、unprotect、credhist subcommand から入力構造を選びます。各 binary file を対応 structure で parse し、password/SID/user key/domain PVK/DPAPI_SYSTEM などから候補 key を導出、MAC/署名を確認して復号・表示します。
仕組みの詳細
Section titled “仕組みの詳細”DPAPI は一つの password で直接すべての secret を暗号化するのではなく、 user/machine key から master key を保護し、その master key で credential や Vault の個別 blob を保護する階層です。このコマンドの subcommand は階層の どの file を入力し、どの key source まで既知かに応じて分かれています。
masterkey は MasterKeyFile header と複数 section を解析し、SID+password、
NT/SHA key、DPAPI_SYSTEM、domain backup private key などから復号 key を導出
します。credential と unprotect は master key の SHA1 等を受け取り、
DPAPI_BLOB の algorithm、salt、HMAC、ciphertext を検証・復号します。
credhist は password 変更前の user key chain を遡るための形式です。
Vault は policy file (vpol) に暗号化された Vault key があり、その key で
credential record (vcrd) の属性を復号します。domain backup key 経路は
remote BKRP/LSA から private key material を取得・変換します。GUID で blob と
master key を対応付け、MAC 検証に失敗した平文候補を成功として表示しないことが
全 subcommand 共通の要点です。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
DPAPI | 64 | __init__()、getDPAPI_SYSTEM()、getLSA()、run() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket.uuid | bin_to_string |
impacket | crypto, version |
impacket.smbconnection | SMBConnection |
impacket.dcerpc.v5 | bkrp, lsad, transport |
impacket.dcerpc.v5.rpcrt | RPC_C_AUTHN_GSS_NEGOTIATE, RPC_C_AUTHN_LEVEL_PKT_PRIVACY |
impacket.examples | logger |
impacket.examples.utils | parse_target |
impacket.examples.secretsdump | LSASecrets, LocalOperations |
impacket.structure | hexdump |
impacket.dpapi | CREDENTIAL_BLOB, CREDHIST_FILE, CredHist, CredentialFile, DPAPI_BLOB, DPAPI_DOMAIN_RSA_MASTER_KEY, DomainKey, MasterKey, MasterKeyFile, PREFERRED_BACKUP_KEY, PRIVATE_KEY_BLOB, PVK_FILE_HDR, P_BACKUP_KEY, VAULT_KNOWN_SCHEMAS, VAULT_VCRD, VAULT_VPOL, VAULT_VPOL_KEYS, deriveKeysFromUser, deriveKeysFromUserkey, privatekeyblob_to_pkcs1 |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
Cryptodome | pycryptodomex | 直接 import、宣言済み |
six | six | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
- オプションによりローカルファイルを作成または更新します。既存ファイルの扱いと秘密情報を含む出力の権限を確認してください。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
実装を変更するとき
Section titled “実装を変更するとき”impacket.dpapi / crypto、Cryptodome、SMB/RPC bkrp / lsad、examples.secretsdump に依存します。DPAPI.run() の action 分岐と key source の優先順位が中心です。
- 構文:
python -m py_compile examples/dpapi.py - CLI:
python examples/dpapi.py -h - 関連テスト:
tests/misc/test_dpapi.py - 関連テスト:
tests/SMB_RPC/test_rpcrt.py - 関連テスト:
tests/misc/test_dcerpc_v5_ndr.py - 関連テスト:
tests/misc/test_structure.py

