impacket-dpapi 徹底解説:Windowsの機密情報を復号する 🔑

セキュリティツール

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 BLOB: DPAPIによって暗号化されたデータそのものです。このバイナリデータには、暗号化された実際の情報だけでなく、復号に必要なメタデータ(使用されたマスターキーのGUIDなど)が含まれています。
  • マスターキー (Master Key): ユーザーのログオン情報(パスワードなど)やシステムの情報に基づいて生成される秘密鍵です。DPAPI BLOBを直接暗号化/復号するためのセッションキーを生成する際に使用されます。マスターキー自体も保護されており、通常はユーザーのパスワードから派生したキーや、ドメイン環境ではドメインバックアップキーで暗号化されています。
  • マスターキーファイル: マスターキーはファイルとして保存されます。通常、ユーザープロファイルディレクトリ内の %APPDATA%\Microsoft\Protect\{SID}\ (SIDはユーザーのセキュリティ識別子) にGUID名のファイルとして格納されています。どのマスターキーが最新かは Preferred ファイルで示されます。
  • ドメインバックアップキー (Domain Backup Key): Active Directoryドメイン環境では、ユーザーマスターキーはユーザーのパスワードだけでなく、ドメインコントローラーが保持するRSAキーペア(バックアップキー)の公開鍵でも暗号化されます。これは、ユーザーがパスワードを忘れた場合や管理者がアクセスする必要がある場合に備えた回復メカニズムです。この秘密鍵があれば、ドメイン内の任意のユーザーのマスターキーを復号できます。
  • CREDHISTファイル: ローカルユーザーの場合、過去のパスワード情報が暗号化されて保存されることがあります。これにより、パスワード変更後も古いマスターキーを復号できる場合があります。
  1. アプリケーションが CryptProtectData 関数を呼び出し、平文データとスコープ(ユーザーまたはマシン)を指定します。
  2. DPAPIは、指定されたスコープに対応するマスターキー(またはそこから派生したキー)を使用してデータを暗号化します。
  3. 暗号化されたデータと関連メタデータを含むDPAPI BLOBが生成され、アプリケーションに返されます。
  4. アプリケーションが CryptUnprotectData 関数を呼び出し、DPAPI BLOBを渡します。
  5. DPAPIはBLOB内のメタデータから必要なマスターキーを特定し、適切な鍵(ユーザーパスワード由来の鍵やドメインバックアップキーなど)を使ってマスターキーを復号します。
  6. 復号されたマスターキー(またはそこから派生したキー)を使用して、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で保護されたデータを復号するには、状況に応じて以下のいずれかの情報やアクセス権が必要になります。

  • 対象ユーザーのコンテキストでの実行: 最も簡単な方法です。対象ユーザーとしてログインしている状態でツールを実行すれば、OSが内部的に鍵管理を行うため、追加情報なしで復号できる場合があります (ただし、dpapi.py 自体はオフライン処理が主目的です)。
  • 対象ユーザーのパスワード: ユーザーの平文パスワードが分かっていれば、マスターキーを復号できます。
  • 対象ユーザーのNTLMハッシュ (ドメインユーザーの場合): ドメインユーザーの場合、パスワードの代わりにNTLMハッシュを使ってマスターキーを復号できます。これは Mimikatz などで取得できる可能性があります。
  • 対象ユーザーのパスワードのSHA1ハッシュ (ローカルユーザーの場合): ローカルユーザーの場合、パスワードのUTF-16LEエンコードされたSHA1ハッシュを使用してマスターキーを復号できます。
  • ドメインバックアップキー (ドメインユーザーの場合): ドメイン管理者権限があれば、ドメインコントローラーからドメインバックアップキー(PVKファイル)をエクスポートできます。このキーがあれば、そのドメイン内の任意のユーザーのマスターキーを復号できます。
  • 復号済みのマスターキー: 何らかの方法で既にマスターキー自体を復号できている場合、そのキー(通常は16進数文字列)を直接指定して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 バナー表示を抑制します。

実践的な利用シナリオ例

ユーザー “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進数形式で表示されます。

ドメインユーザー “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ハッシュは空でも構いません。

ドメインバックアップキーファイル (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
        

シナリオ1~3などでマスターキー (0xABCDEF...) を復号済みで、それに対応するDPAPI BLOBファイル (blob.dat) を復号したい場合。


python dpapi.py blob -file /path/to/blob.dat -key 0xABCDEF...
        

成功すると、復号されたデータが16進ダンプと可能な場合はASCII形式で表示されます。

Windows Credential Managerから取得した *.vcrd ファイルがあり、対応するユーザーのパスワードとSIDが分かっている場合。


python dpapi.py credential -file /path/to/credential.vcrd -sid S-1-5-21-... -password Password123
        

ファイル内に複数の資格情報が含まれている場合、それぞれが復号されて表示されます。

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]
        
⚠️ 重要: これらのコマンドはあくまで例です。実際のファイルパス、SID、パスワード、ハッシュ、キーなどは、調査対象の環境に合わせて適切に置き換える必要があります。また、ファイルの取得や必要な認証情報の入手は、これらのコマンド実行の前段階として必要です。

対策と緩和策

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 の理解と適切な活用の一助となれば幸いです。🚀

コメント

タイトルとURLをコピーしました