Impacketスイートの一部であるdpapi.pyスクリプトの使い方を学び、Windows DPAPIで保護されたデータの解読に挑戦しましょう。
はじめに:impacket-dpapiとは?
コンピュータセキュリティの世界、特にペネトレーションテストやフォレンジック調査において、システム内に保存された機密情報へのアクセスは重要なステップです。Windows環境では、多くのアプリケーションやシステムコンポーネントが「Data Protection API (DPAPI)」と呼ばれる仕組みを利用して、パスワードや秘密鍵などのセンシティブなデータを保護しています。
ここで登場するのが、impacket-dpapi
(より正確には、Impacketスイートに含まれる dpapi.py
スクリプト) です。Impacketは、ネットワークプロトコルの操作やセキュリティ評価に広く使われるPythonライブラリ群であり、その中にDPAPIで暗号化されたデータ(DPAPI BLOB)を復号するためのツールが含まれています。
このブログ記事では、impacket-dpapi
の基本的な使い方から、具体的な利用シナリオ、そして必要となる前提知識までを詳しく解説します。セキュリティ専門家やシステム管理者が、このツールの能力を理解し、適切に活用するための一助となれば幸いです。😊
DPAPIの仕組み:Windowsデータ保護の要
impacket-dpapiを理解するには、まずそれが対象とするDPAPIについて知る必要があります。DPAPI (Data Protection Application Programming Interface) は、Windows 2000から導入された、開発者が簡単にデータの暗号化・復号を実装できるようにするためのAPIです。
主な目的は、パスワードや秘密鍵のような機密情報を、それらを生成・利用するユーザーやコンピュータ自身に紐付けて保護することです。これにより、開発者は複雑な鍵管理の問題から解放されます。
DPAPIの構成要素
DPAPIの仕組みは主に以下の要素で構成されています。
- DPAPI BLOB: DPAPIによって暗号化されたデータそのものです。このバイナリデータには、暗号化された実際の情報だけでなく、復号に必要なメタデータ(使用されたマスターキーのGUIDなど)が含まれています。
- マスターキー (Master Key): ユーザーのログオン情報(パスワードなど)やシステムの情報に基づいて生成される秘密鍵です。DPAPI BLOBを直接暗号化/復号するためのセッションキーを生成する際に使用されます。マスターキー自体も保護されており、通常はユーザーのパスワードから派生したキーや、ドメイン環境ではドメインバックアップキーで暗号化されています。
- マスターキーファイル: マスターキーはファイルとして保存されます。通常、ユーザープロファイルディレクトリ内の
%APPDATA%\Microsoft\Protect\{SID}\
(SIDはユーザーのセキュリティ識別子) にGUID名のファイルとして格納されています。どのマスターキーが最新かはPreferred
ファイルで示されます。 - ドメインバックアップキー (Domain Backup Key): Active Directoryドメイン環境では、ユーザーマスターキーはユーザーのパスワードだけでなく、ドメインコントローラーが保持するRSAキーペア(バックアップキー)の公開鍵でも暗号化されます。これは、ユーザーがパスワードを忘れた場合や管理者がアクセスする必要がある場合に備えた回復メカニズムです。この秘密鍵があれば、ドメイン内の任意のユーザーのマスターキーを復号できます。
- CREDHISTファイル: ローカルユーザーの場合、過去のパスワード情報が暗号化されて保存されることがあります。これにより、パスワード変更後も古いマスターキーを復号できる場合があります。
暗号化・復号の流れ(概念)
- アプリケーションが
CryptProtectData
関数を呼び出し、平文データとスコープ(ユーザーまたはマシン)を指定します。 - DPAPIは、指定されたスコープに対応するマスターキー(またはそこから派生したキー)を使用してデータを暗号化します。
- 暗号化されたデータと関連メタデータを含むDPAPI BLOBが生成され、アプリケーションに返されます。
- アプリケーションが
CryptUnprotectData
関数を呼び出し、DPAPI BLOBを渡します。 - DPAPIはBLOB内のメタデータから必要なマスターキーを特定し、適切な鍵(ユーザーパスワード由来の鍵やドメインバックアップキーなど)を使ってマスターキーを復号します。
- 復号されたマスターキー(またはそこから派生したキー)を使用して、BLOB内の暗号化データを復号し、平文データをアプリケーションに返します。
この仕組みにより、通常はデータが作成されたユーザーコンテキスト(またはマシンコンテキスト)でのみ、特別な操作なしに復号が可能になります。しかし、攻撃者は必要な鍵情報(パスワード、ハッシュ、バックアップキーなど)を入手することで、オフラインでこれらの保護されたデータを復号しようと試みます。 inilah di mana impacket-dpapi datang berperan. 💪
impacket-dpapi (dpapi.py) の機能
dpapi.py
は、Impacketライブラリ群に含まれるPythonスクリプトで、DPAPI BLOBやマスターキーファイル、Windows Credential/Vaultファイルなどを解析・復号するために設計されています。
主な機能は以下の通りです。
- マスターキーファイルの復号: ユーザーのパスワード、NTLMハッシュ、SHA1ハッシュ、またはドメインバックアップキーを使用して、暗号化されたマスターキーファイルを復号します。
- DPAPI BLOBの復号: 復号されたマスターキー(またはそのハッシュ)を使用して、DPAPI BLOBから元のデータを抽出します。
- Credential/Vaultファイルの解析と復号: Windows Credential ManagerやVaultファイル(
.vcrd
)を解析し、そこに含まれるDPAPI BLOBを特定・復号します。 - メタデータの表示: DPAPI BLOBやマスターキーファイルに含まれるバージョン情報、GUID、暗号アルゴリズムなどのメタデータを表示します。
このツールは、ペネトレーションテストのポストエクスプロイテーション段階や、フォレンジック調査において、取得したファイルから機密情報を抽出する際に非常に役立ちます。例えば、侵害したシステムからChromeのログイン情報や保存されたRDP接続パスワードなどを抜き出すことが可能です。
利用に必要な前提条件
dpapi.py
を使ってDPAPIで保護されたデータを復号するには、状況に応じて以下のいずれかの情報やアクセス権が必要になります。
ユーザーDPAPI BLOBの復号
- 対象ユーザーのコンテキストでの実行: 最も簡単な方法です。対象ユーザーとしてログインしている状態でツールを実行すれば、OSが内部的に鍵管理を行うため、追加情報なしで復号できる場合があります (ただし、
dpapi.py
自体はオフライン処理が主目的です)。 - 対象ユーザーのパスワード: ユーザーの平文パスワードが分かっていれば、マスターキーを復号できます。
- 対象ユーザーのNTLMハッシュ (ドメインユーザーの場合): ドメインユーザーの場合、パスワードの代わりにNTLMハッシュを使ってマスターキーを復号できます。これは Mimikatz などで取得できる可能性があります。
- 対象ユーザーのパスワードのSHA1ハッシュ (ローカルユーザーの場合): ローカルユーザーの場合、パスワードのUTF-16LEエンコードされたSHA1ハッシュを使用してマスターキーを復号できます。
- ドメインバックアップキー (ドメインユーザーの場合): ドメイン管理者権限があれば、ドメインコントローラーからドメインバックアップキー(PVKファイル)をエクスポートできます。このキーがあれば、そのドメイン内の任意のユーザーのマスターキーを復号できます。
- 復号済みのマスターキー: 何らかの方法で既にマスターキー自体を復号できている場合、そのキー(通常は16進数文字列)を直接指定してDPAPI BLOBを復号できます。
システムDPAPI BLOBの復号
- SYSTEMアカウントのコンテキストでの実行: SYSTEMとして実行できれば、システムマスターキーにアクセスできます。
- SYSTEM DPAPIキー (LSAシークレット): システムマスターキーは、LSA (Local Security Authority) のシークレット
DPAPI_SYSTEM
によって保護されています。SYSTEM、SECURITY、SAMレジストリハイブがあれば、secretsdump.pyやMimikatzなどでこのLSAシークレットを抽出し、システムマスターキーを復号できます。
必要なファイル
- 復号対象のDPAPI BLOBファイル: Chromeのログイン情報 (
Login Data
)、Windows Vaultファイル (*.vcrd
)、特定のアプリケーションが生成したファイルなど。 - マスターキーファイル:
%APPDATA%\Microsoft\Protect\{SID}\
内にあるGUID名のファイル。BLOBのメタデータを見て、どのマスターキーが必要かを確認する必要があります。 - (システムDPAPIの場合) レジストリハイブ: SYSTEM, SECURITY, SAM ファイル。
- (ドメインバックアップキーを使う場合) PVKファイル: ドメインコントローラーからエクスポートされたバックアップキーファイル。
impacket-dpapi (dpapi.py) の基本的な使い方
dpapi.py
は Impacket スイートの一部として提供されます。通常、Impacket をインストールすると /usr/share/doc/python3-impacket/examples/dpapi.py
や Python の site-packages ディレクトリ内の impacket/examples/dpapi.py
などに配置されます。実行は Python インタープリタ経由で行います。
基本的なコマンドの構造は以下のようになります。
python dpapi.py [操作モード] [オプション]
主な操作モード
モード | 説明 |
---|---|
blob |
単一のDPAPI BLOBファイルを解析・復号します。 |
masterkey |
マスターキーファイルを復号します。 |
credential |
Windows Credential ファイル (.vcrd ) を解析・復号します。 |
vault |
Windows Vault ファイル (Policy.vpol , *.vcrd ) を解析・復号します。 |
共通の主要オプション
オプション | 説明 |
---|---|
-file [ファイルパス] |
処理対象のファイル(BLOB, マスターキー, Credential, Vault)を指定します。 |
-sid [SID] |
対象ユーザーのセキュリティ識別子 (SID) を指定します。マスターキーの復号に必要です。 |
-password [パスワード] |
対象ユーザーの平文パスワードを指定します。 |
-hashes [LMHASH:NTHASH] |
対象ユーザーのLMハッシュとNTLMハッシュを指定します(通常、NTハッシュのみで十分です。例: aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 )。ドメインユーザーのマスターキー復号に使用します。 |
-sha1 [SHA1ハッシュ] |
対象ユーザーのパスワードのSHA1ハッシュ(UTF-16LEエンコード)を指定します。ローカルユーザーのマスターキー復号に使用します。 |
-key [復号済みマスターキー] |
既に復号済みのマスターキー(16進数文字列形式)を直接指定して、BLOBやCredentialファイルを復号します。 |
-backupkey [PVKファイルパス] |
ドメインバックアップキー(PVKファイル)のパスを指定します。ドメインユーザーのマスターキー復号に使用します。 |
-system [SYSTEMハイブパス] |
SYSTEMレジストリハイブのパスを指定します。システムDPAPIキーの取得に必要です。 |
-security [SECURITYハイブパス] |
SECURITYレジストリハイブのパスを指定します。システムDPAPIキーの取得に必要です。 |
-sam [SAMハイブパス] |
SAMレジストリハイブのパスを指定します(主にローカルユーザーのハッシュ取得用ですが、システムDPAPIでも関連する場合があります)。 |
-debug |
デバッグ情報を表示します。エラー発生時の原因究明に役立ちます。 |
-quiet |
バナー表示を抑制します。 |
dpapi.py blob -file [BLOBファイル]
を実行し、メタデータを確認して必要なマスターキーのGUIDを特定するのが一般的な最初のステップです。
実践的な利用シナリオ例
シナリオ1: パスワードを使ってマスターキーを復号する
ユーザー “testuser” (SID: S-1-5-21-…) のパスワード “Password123” が判明しており、マスターキーファイル (GUID.key
) を入手した場合。
python dpapi.py masterkey -file /path/to/GUID.key -sid S-1-5-21-... -password Password123
成功すると、復号されたマスターキーが16進数形式で表示されます。
シナリオ2: NTLMハッシュを使ってドメインユーザーのマスターキーを復号する
ドメインユーザー “domuser” (SID: S-1-5-21-…) のNTLMハッシュ 31d6...
が判明しており、マスターキーファイルを入手した場合。
python dpapi.py masterkey -file /path/to/GUID.key -sid S-1-5-21-... -hashes :31d6cfe0d16ae931b73c59d7e0c089c0
LMハッシュは空でも構いません。
シナリオ3: ドメインバックアップキーを使ってマスターキーを復号する
ドメインバックアップキーファイル (backupkey.pvk
) を入手しており、任意のドメインユーザー (SID: S-1-5-21-…) のマスターキーファイルを復号したい場合。
# まず、impacketの secretsdump.py などでドメインコントローラーから PVK ファイルを取得
# 例: secretsdump.py -backupkey . DOMAIN/AdminUser@DC_IP
# dpapi.py でマスターキーを復号
python dpapi.py masterkey -file /path/to/GUID.key -sid S-1-5-21-... -backupkey backupkey.pvk
シナリオ4: 復号済みマスターキーを使ってDPAPI BLOBを復号する
シナリオ1~3などでマスターキー (0xABCDEF...
) を復号済みで、それに対応するDPAPI BLOBファイル (blob.dat
) を復号したい場合。
python dpapi.py blob -file /path/to/blob.dat -key 0xABCDEF...
成功すると、復号されたデータが16進ダンプと可能な場合はASCII形式で表示されます。
シナリオ5: Credentialファイルをパスワードで復号する
Windows Credential Managerから取得した *.vcrd
ファイルがあり、対応するユーザーのパスワードとSIDが分かっている場合。
python dpapi.py credential -file /path/to/credential.vcrd -sid S-1-5-21-... -password Password123
ファイル内に複数の資格情報が含まれている場合、それぞれが復号されて表示されます。
シナリオ6: システムDPAPIで保護されたファイルを復号する
SYSTEMアカウントによって保護されたDPAPI BLOBファイル (system_blob.dat
) があり、必要なレジストリハイブ (SYSTEM, SECURITY) を入手した場合。
# まず、システムDPAPIキーを抽出 (SAMも念のため指定)
python dpapi.py system -sam /path/to/SAM -system /path/to/SYSTEM -security /path/to/SECURITY
# 上記で表示された DPAPI_SYSTEM キー (例: 0x1234...) を使用してBLOBを復号
python dpapi.py blob -file /path/to/system_blob.dat -key 0x1234... -system
# または、マスターキーを先に復号する
# 1. BLOBからマスターキーGUIDを確認: python dpapi.py blob -file /path/to/system_blob.dat
# 2. システムマスターキーを復号: python dpapi.py masterkey -file /path/to/system_mk_guid.key -system -security /path/to/SECURITY -system /path/to/SYSTEM
# (システムマスターキーは通常 C:\Windows\System32\Microsoft\Protect\S-1-5-18\User\ にある)
# 3. 復号したマスターキーでBLOBを復号: python dpapi.py blob -file /path/to/system_blob.dat -key [復号済みMK]
対策と緩和策
impacket-dpapi
のようなツールによるDPAPIデータの不正な復号を防ぐためには、以下のような対策が考えられます。
- 強力なパスワードポリシーの強制: ユーザーパスワードがDPAPI保護の根幹であるため、推測困難な複雑なパスワードの使用を強制し、定期的な変更を義務付けることが基本です。
- アカウント侵害の防止: パスワード、NTLMハッシュ、セッショントークンなどの認証情報が漏洩しないように、フィッシング対策、マルウェア対策、多要素認証(MFA)の導入、特権アクセス管理(PAM)の徹底などが重要です。
- ドメインバックアップキーの保護とローテーション: ドメイン管理者権限の厳格な管理と監視を行い、不正なバックアップキーのエクスポートを防ぎます。また、万が一漏洩した場合の影響を軽減するため、定期的にバックアップキーをローテーションすることが推奨されます(ただし、運用への影響を考慮する必要があります)。
- エンドポイントセキュリティの強化: EDR (Endpoint Detection and Response) ソリューションなどを導入し、MimikatzやImpacketのようなツールの実行や、レジストリハイブ、マスターキーファイルへの不審なアクセスを検知・ブロックします。
- 不要な認証情報の削除: Credential Managerやブラウザに保存された不要なパスワードは定期的に削除するようユーザーに啓発します。
DPAPI自体はWindowsの重要な保護機能ですが、その鍵となる情報が侵害されれば、保護は容易に破られてしまいます。多層的な防御アプローチが不可欠です。🛡️
まとめ
impacket-dpapi
(dpapi.py
) は、Windows環境におけるDPAPI保護メカニズムを理解し、セキュリティ評価を行う上で強力なツールです。ユーザーパスワード、NTLMハッシュ、ドメインバックアップキーなどの認証情報を利用して、マスターキーや保護されたデータBLOBをオフラインで復号する機能を提供します。
このツールを効果的に使用するには、DPAPIの基本的な仕組み、必要な前提条件(認証情報やファイル)、そしてコマンドラインオプションを正確に理解することが重要です。ペネトレーションテストやフォレンジック調査において、隠された機密情報を発見するための重要な手段となり得ますが、その使用は常に倫理的かつ法的な範囲内に留めなければなりません。
同時に、防御側の視点からは、DPAPIが依存する認証情報の保護がいかに重要であるかを再認識させられます。強力なパスワード管理、アカウント侵害対策、そしてドメインバックアップキーの厳格な管理が、DPAPIによる保護を維持するための鍵となります。
この記事が、impacket-dpapi
の理解と適切な活用の一助となれば幸いです。🚀
コメント