リモートWindowsシステムのレジストリ情報を覗き見る
はじめに: Impacket と impacket-registry-read
Impacket は、ネットワークプロトコルの低レベルな操作を目的としたPythonクラスのコレクションです。特に、Windows環境でよく利用されるSMBやMSRPCといったプロトコルを扱うための強力なツール群を提供しており、セキュリティ専門家やシステム管理者にとって不可欠な存在となっています。ペネトレーションテストやレッドチーム活動、あるいはシステムの調査や管理タスクにおいて、その柔軟性と機能性が高く評価されています。
Impacketスイートには多くの便利なスクリプトが含まれていますが、その中でも impacket-registry-read
(古いバージョンでは `reg.py` としても知られていました) は、リモートのWindowsシステムのレジストリにアクセスし、キーや値を読み取るために特化したツールです。適切な認証情報があれば、ターゲットシステムの重要な構成情報、ソフトウェアのインストール状況、ユーザー設定などをネットワーク経由で取得できます。これにより、対象システムの理解を深めたり、潜在的な脆弱性や設定ミスを発見したりする手がかりを得ることが可能になります。🛡️
このブログ記事では、impacket-registry-read
の基本的な使い方から、認証方法、主要なオプション、実践的な利用例、そしてセキュリティ上の考慮事項まで、幅広く解説していきます。
impacket-registry-read とは? 🤔
impacket-registry-read
は、Windowsの標準的な機能であるリモートレジストリサービスを利用して、ネットワーク越しにレジストリ情報を取得するコマンドラインツールです。内部的には、SMBプロトコル上で動作するMSRPC (Microsoft Remote Procedure Call) を介して、ターゲットシステムの `winreg` (Windows Registry) RPCインターフェースと通信します。
具体的には、以下のようなRPC関数呼び出しを利用してレジストリ操作を実現しています(これはImpacketの内部実装に依存します)。
OpenHKLM
,OpenHKCU
など: ルートキー (HKEY_LOCAL_MACHINE, HKEY_CURRENT_USERなど) へのハンドルを取得します。RegOpenKeyExW
: 特定のサブキーを開きます。RegEnumKeyExW
: 指定されたキー配下のサブキーを列挙します。RegEnumValueW
: 指定されたキー配下の値を列挙します。RegQueryValueExW
: 特定の値のデータを読み取ります。RegCloseKey
: 開いたレジストリキーのハンドルを閉じます。
これらの操作を行うためには、ターゲットシステム上でリモートレジストリサービスが有効になっており、かつ、使用するユーザーアカウントが対象のレジストリキーに対する読み取り権限を持っている必要があります。デフォルトでは、管理者権限を持つユーザーは通常、リモートからレジストリにアクセスできます。
利用のための前提条件 ✅
impacket-registry-read
を使用するには、いくつかの前提条件を満たす必要があります。
- Impacketのインストール: Python環境にImpacketライブラリがインストールされている必要があります。通常、pipを使用してインストールできます:
または、GitHubリポジトリから直接インストールすることも可能です。pip install impacket
- ネットワーク接続: 実行元のマシンからターゲットのWindowsシステムへネットワーク的に到達可能である必要があります。通常はTCPの445番ポート(SMB)への接続が必要です。
- ターゲットシステムのSMBサービス: ターゲットのWindowsシステムでSMBサービス(Serverサービス)が実行されている必要があります。これはデフォルトで有効になっていることが多いです。
- リモートレジストリサービス: ターゲットシステムで「Remote Registry」サービスが開始されている必要があります。セキュリティポリシーによっては無効化されている場合があります。
- 認証情報: ターゲットシステムへの有効な認証情報が必要です。以下のいずれかの形式で提供できます。
- ユーザー名とパスワード
- ユーザー名とNTLMハッシュ(LMハッシュとNTハッシュ)
- 有効なKerberosチケット(Kerberos認証を使用する場合)
- アクセス権限: 使用するアカウントには、アクセスしたいレジストリキーや値に対する読み取り権限が必要です。通常、Administratorsグループのメンバーはこの権限を持っていますが、特定のキーには異なるアクセス制御リスト(ACL)が設定されている可能性があります。
基本的な使い方 ⌨️
impacket-registry-read
の基本的なコマンド構文は以下のようになります。
impacket-registry-read <認証情報> <ターゲット指定> <アクション> [オプション]
主要な要素を分解してみましょう。
-
認証情報:
[ドメイン/]ユーザー名:パスワード@
(パスワード認証)[ドメイン/]ユーザー名@
+-hashes LM:NT
(ハッシュ認証)[ドメイン/]ユーザー名@
+-no-pass -k
(Kerberosチケット認証)[ドメイン/]ユーザー名:パスワード@
+-k
(Kerberosパスワード認証)
-
ターゲット指定:
ターゲットIPアドレス
ターゲットホスト名
-
アクションとオプション:
-key <キーパス>
: アクセスするレジストリキーのパスを指定します (例: `HKLM\\SOFTWARE\\Microsoft`)。-value <値の名前>
: 読み取る値の名前を指定します。-key
と共に使用します。-enum_keys
:-key
で指定したキー配下のサブキーを列挙します。-enum_values
:-key
で指定したキー配下の値を列挙します。-outputfile <ファイル名>
: 結果を指定したファイルに保存します。-ts
: 出力にタイムスタンプを追加します。-debug
: デバッグ情報を表示します。トラブルシューティングに役立ちます。
簡単な例:
ターゲット 192.168.1.100
のレジストリキー HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
にある ProductName
という値を、ユーザー admin
、パスワード Password123
で読み取る場合:
impacket-registry-read WORKGROUP/admin:Password123@192.168.1.100 -key "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" -value ProductName
ドメイン環境の場合は、ドメイン名/ユーザー名
の形式で指定します。
impacket-registry-read MYDOMAIN/svc_account:ComplexPass@dc01.mydomain.local -key HKLM\\SYSTEM\\CurrentControlSet\\Services\\DNS -enum_values
認証方法の詳細 🔑
impacket-registry-read
は複数の認証方法をサポートしています。状況に応じて適切な方法を選択してください。
パスワード認証
最も基本的な認証方法です。ユーザー名と平文のパスワードを使用します。
impacket-registry-read [ドメイン/]ユーザー名:パスワード@ターゲット
例:
impacket-registry-read CONTOSO/john.doe:Summer2025@10.0.0.50 -key HKLM\\Software -enum_keys
NTLMハッシュ認証
パスワードの代わりに、そのパスワードに対応するNTLMハッシュ(LMハッシュとNTハッシュのペア)を使用して認証します。「Pass the Hash (PtH)」攻撃で一般的に利用される手法です。
-hashes
オプションを使用し、LMハッシュ:NTハッシュ
の形式で指定します。LMハッシュが不明または使用されていない場合は、空(ただしコロンは必要)またはダミーの値(例: aad3b435b51404ee
)を指定します。
impacket-registry-read [ドメイン/]ユーザー名@ターゲット -hashes LMハッシュ:NTハッシュ
例 (LMハッシュはダミー):
impacket-registry-read CONTOSO/Administrator@10.0.0.50 -hashes aad3b435b51404ee:5d8c6dc1a1f8f3e3e4ff5c3fe7455e6a -key "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa" -value security packages
この方法は、パスワード自体を知らなくても、ハッシュさえ入手できれば認証できるため、ペネトレーションテストなどで有効です。
Kerberos認証
Active Directory環境で推奨される認証方式です。事前に取得したKerberosチケット(通常はTGT)を使用するか、パスワードやハッシュを提供してツールにチケットを取得させることもできます。
1. Kerberosチケットを使用 (-k -no-pass
):
まず、kinit
コマンド (Linux) や mimikatz
(Windows) などでKerberosのTGTを取得し、そのチケットをキャッシュに保存します (通常は環境変数 KRB5CCNAME
で指定されたファイル)。その後、-k
(Kerberos認証を有効化) と -no-pass
(パスワード/ハッシュ不要) オプションを指定して実行します。
# TGTを取得 (例: kinit)
kinit user@DOMAIN.REALM
# impacket-registry-read を実行
impacket-registry-read -k -no-pass DOMAIN/user@target.domain.realm -key ...
2. パスワード/ハッシュを使用してチケットを取得 (-k
):
パスワードまたはハッシュを指定し、-k
オプションを追加すると、Impacketは指定された認証情報を使ってKDC (Key Distribution Center) から必要なKerberosチケット(TGTとサービスチケット)を取得しようとします。
# パスワードを使用
impacket-registry-read DOMAIN/user:Password123@target.domain.realm -k -key ...
# ハッシュを使用
impacket-registry-read DOMAIN/user@target.domain.realm -hashes LM:NT -k -key ...
Kerberos認証を使用するには、実行環境のKerberos設定 (/etc/krb5.conf
など) が正しく構成されており、KDCに到達できる必要があります。
主要なアクションとオプション ⚙️
impacket-registry-read
の挙動を制御するための主要なアクションとオプションを以下にまとめます。
オプション | 説明 | 例 |
---|---|---|
-key <キーパス> |
操作対象のレジストリキーを指定します。ルートキー (HKLM, HKCU, HKCR, HKU, HKCC) から始まるフルパスで指定します。バックスラッシュ (\ ) はエスケープが必要な場合があります (\\ )。 |
-key "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" |
-value <値の名前> |
-key で指定したキー内にある、読み取りたい値の名前を指定します。指定しない場合、(既定) または @ の値が読み取られることがあります(実装による)。 |
-value ProductName |
-enum_keys |
-key で指定したキー直下のサブキーをすべて列挙します。 |
-key HKLM\\Software -enum_keys |
-enum_values |
-key で指定したキーに含まれる値をすべて列挙します(値の名前、種類、データ)。 |
-key "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" -enum_values |
-outputfile <ファイル名> |
標準出力の代わりに、指定したファイルに結果を書き出します。大量のデータを取得する場合に便利です。 | -outputfile registry_output.txt |
-ts |
出力の各行の先頭にタイムスタンプ (YYYY-MM-DD HH:MM:SS) を追加します。ログとして利用する場合に役立ちます。 | -ts |
-debug |
詳細なデバッグ情報を標準エラー出力に表示します。通信内容や内部処理を確認でき、接続エラーや認証エラーのトラブルシューティングに非常に役立ちます。 | -debug |
-port <ポート番号> |
SMB接続に使用するポート番号を指定します。デフォルトは 445 ですが、環境によっては変更されている場合があります (例: 139)。 | -port 445 |
-dc-ip <IPアドレス> |
Kerberos認証を使用する際に、KDCとして使用するドメインコントローラーのIPアドレスを明示的に指定します。DNSが正しく引けない環境などで役立ちます。 | -dc-ip 10.0.0.1 |
-target-ip <IPアドレス> |
ターゲットのホスト名を指定した場合に、その名前解決に使用するIPアドレスを明示的に指定します。DNSに依存せずに特定のIPアドレスに接続したい場合に使用します。 | impacket-registry-read ...@fileserver -target-ip 192.168.1.50 ... |
実践的な利用例 ✨
ここでは、impacket-registry-read
を使った具体的なシナリオをいくつか紹介します。
例1: OS情報の取得
ターゲットシステムの正確なWindowsバージョンとビルド番号を確認します。
impacket-registry-read DOMAIN/user:Pass@192.168.1.10 -key "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" -value ProductName
impacket-registry-read DOMAIN/user:Pass@192.168.1.10 -key "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" -value CurrentBuildNumber
あるいは、-enum_values
を使ってキー内の全情報を一度に取得することもできます。
impacket-registry-read DOMAIN/user:Pass@192.168.1.10 -key "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" -enum_values
例2: 特定のソフトウェアのインストール確認
例えば、特定のアンチウイルスソフト(例: McAfee)がインストールされているか、関連するレジストリキーの存在を確認します。
impacket-registry-read DOMAIN/user:Pass@192.168.1.10 -key "HKLM\\SOFTWARE\\McAfee" -enum_keys
キーが存在すれば、そのソフトウェアがインストールされている可能性が高いです。
例3: 自動起動設定 (Runキー) の確認
ユーザーログオン時に自動実行されるプログラムが登録されている Run
キーの内容を確認します。マルウェアが永続化のために利用することがあります。
# HKEY_CURRENT_USER の Run キー
impacket-registry-read DOMAIN/user:Pass@192.168.1.10 -key "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" -enum_values
# HKEY_LOCAL_MACHINE の Run キー (管理者権限が必要な場合が多い)
impacket-registry-read DOMAIN/admin:Pass@192.168.1.10 -key "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" -enum_values
例4: NTLMハッシュを使用したシステム情報収集
管理者アカウントのNTLMハッシュ aabbcc...:112233...
を使って、システムのサービス設定に関する情報を取得します。
impacket-registry-read DOMAIN/Administrator@192.168.1.10 -hashes aad3b435b51404ee:112233aabbccddeeff -key HKLM\\SYSTEM\\CurrentControlSet\\Services -enum_keys -outputfile services_keys.txt
この例では、CurrentControlSet\Services
配下のサブキー(各サービスに対応)を列挙し、結果を services_keys.txt
に保存しています。
例5: Kerberos認証 (チケット利用) で LSA 設定を確認
事前に kinit
で取得したチケットを使って、LSA (Local Security Authority) 関連の設定を確認します。
# 事前に kinit user@DOMAIN.REALM を実行しておく
export KRB5CCNAME=/tmp/krb5cc_$(id -u)
impacket-registry-read -k -no-pass DOMAIN/user@target.domain.realm -key "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa" -enum_values
例6: デバッグモードでの実行
接続に問題がある場合、-debug
オプションを付けて実行すると、詳細なエラーメッセージや通信の様子が表示され、原因究明に役立ちます。
impacket-registry-read DOMAIN/user:WrongPass@192.168.1.10 -key HKLM\\Software -enum_keys -debug
出力から、認証失敗 (STATUS_LOGON_FAILURE) や接続拒否 (Connection refused)、アクセス拒否 (STATUS_ACCESS_DENIED) などの具体的なエラーコードを確認できます。
セキュリティにおける利用シーン 🎯
impacket-registry-read
は、攻撃者だけでなく、防御側のセキュリティ専門家にとっても有用なツールです。以下のような場面で活用されます。
-
偵察 (Reconnaissance):
- システムの詳細情報(OSバージョン、サービスパック、ホスト名、ドメインメンバーシップなど)の収集。
- インストールされているソフトウェアやそのバージョンの特定。
- ネットワーク設定(IPアドレス、DNSサーバーなど)の確認。
- ユーザーアカウントに関する情報の探索(ただし限定的)。
-
脆弱性評価:
- 特定のセキュリティパッチが適用されているかを示すレジストリキーの確認。
- 既知の脆弱性に関連する設定値(例: SMB署名の無効化、古いプロトコルの有効化)のチェック。
- セキュリティ製品(AV、EDR)の存在や設定状況の確認。
-
ポストエクスプロイテーション:
- システムへの侵入後、さらなる情報を収集するため。
- 設定ファイルや接続文字列などがレジストリに保存されていないかの探索(ただし、機密情報は通常保護されているか、別の場所に保存されます)。
- 永続化メカニズム(例: Runキー、サービス設定)の調査。
-
設定監査:
- 組織のセキュリティポリシーに準拠した設定が行われているかの確認。
- 意図しない設定変更がないかの定期的なチェック。
-
インシデントレスポンス:
- 侵害された可能性のあるシステムから、リモートで迅速に情報を収集するための一手段として。
これらの活動を通じて、システムのセキュリティ状態を評価し、リスクを特定・軽減するための情報を得ることができます。🔍
潜在的な問題とトラブルシューティング 💡
impacket-registry-read
の使用中に遭遇する可能性のある一般的な問題と、その解決策や原因を示します。
接続エラー (Connection refused / Timeout)
- 原因: ターゲットのTCP 445番ポート (SMB) が閉じている、ファイアウォールでブロックされている、SMBサービス (Server) が実行されていない、IPアドレスやホスト名が間違っている。
- 対策: ターゲットへのネットワーク経路を確認 (ping, telnet/nc でポート接続確認)、ファイアウォール設定を確認、ターゲットのサービス状態を確認、入力したターゲット情報が正しいか再確認。
認証エラー (STATUS_LOGON_FAILURE)
- 原因: ユーザー名、パスワード、またはハッシュが間違っている。ドメイン名が正しくない(ワークグループ環境でドメインを指定した、またはその逆)。Kerberos認証の場合、チケットが無効、KDCに到達できない、SPN (Service Principal Name) の問題。
- 対策: 認証情報を再確認。ドメイン/ワークグループ指定が正しいか確認。Kerberosの場合は、
klist
でチケットを確認、KDCとの疎通確認、/etc/krb5.conf
の設定確認、-dc-ip
オプションを試す。-debug
オプションで詳細なエラーを確認。
アクセス拒否エラー (STATUS_ACCESS_DENIED)
- 原因: 認証は成功したが、使用したアカウントに目的のレジストリキー/値への読み取り権限がない。ターゲットシステムで「Remote Registry」サービスが無効化されているか、開始されていない。
- 対策: より権限の高いアカウント(通常はAdministratorsグループのメンバー)を使用する。ターゲットシステムの「Remote Registry」サービスの状態を確認し、必要であれば有効化/開始する(管理者権限が必要)。アクセスしたいキーのACL(アクセス制御リスト)を確認する。
RPCエラー (RPC_S_SERVER_UNAVAILABLE など)
- 原因: ターゲットシステムのRPCサービスに問題がある。ネットワーク機器がRPC通信を妨害している。「Remote Registry」サービスが依存する他のサービスに問題がある。
- 対策: ターゲットシステムのイベントログを確認。RPC関連のサービス状態を確認。「Remote Registry」サービスを再起動してみる。ネットワーク経路上のファイアウォール等でRPC通信が許可されているか確認。
-debug
オプションで詳細情報を確認。
キーまたは値が見つからない
- 原因: 指定したキーパスまたは値の名前が間違っている。タイプミス。対象のOSバージョンやソフトウェア構成では、そのキー/値が存在しない。
- 対策: キーパスと値の名前を正確に再確認。
-enum_keys
や-enum_values
を使って、親キーから探索してみる。
問題が発生した場合は、まず -debug
オプションを付けて実行し、出力される詳細なログを確認することがトラブルシューティングの第一歩となります。
セキュリティ上の考慮事項と対策 🛡️
impacket-registry-read
は強力なツールですが、悪用されるリスクも伴います。組織のセキュリティを維持するためには、以下の点を考慮し、適切な対策を講じることが重要です。
検知 (Detection)
- ネットワーク監視: SMBトラフィック、特に
winreg
RPCインターフェースへの異常なリモートアクセス試行を監視します。特定のソースからの大量のレジストリアクセスは不審な兆候である可能性があります。 - エンドポイントログ監視: Windowsイベントログを活用します。
- リモートレジストリサービス (RemoteRegistry) の開始/停止イベント (Systemログ)。
- セキュリティログで、オブジェクトアクセス監査が有効な場合、レジストリキーへのアクセスイベント (Event ID 4656 – オブジェクトへのハンドルが要求されました、Event ID 4663 – オブジェクトへのアクセスが試行されました) を監視します。どのキーに対するアクセス試行があったかを確認できますが、監査設定が必要です。
- 認証成功/失敗ログ (Event ID 4624, 4625) を監視し、不審なリモートログオン試行がないか確認します。
- EDR/XDRソリューション: 最新のEndpoint Detection and Response (EDR) や Extended Detection and Response (XDR) ソリューションは、Impacketのようなツールによる不審なプロセス実行やネットワーク活動を検知できる場合があります。
防御・軽減策 (Prevention / Mitigation)
- リモートレジストリサービスの無効化: 業務上リモートからのレジストリアクセスが不要なシステムでは、「Remote Registry」サービスを無効化または停止することが最も効果的な対策の一つです。グループポリシー (GPO) を使って組織全体に展開できます。
- 最小権限の原則: ユーザーアカウントやサービスアカウントには、業務に必要な最小限の権限のみを付与します。特に、管理者権限を持つアカウントの数を制限し、厳格に管理します。
- 強力なパスワードポリシーと認証: 推測されにくい複雑なパスワードの使用を強制し、定期的な変更を促します。可能であれば多要素認証 (MFA) を導入します。
- NTLMハッシュの保護: ローカル管理者アカウントのパスワードをシステム間で使い回さない (LAPSの導入を検討)。不要なアカウントの無効化。Credential Guard などの保護機能の利用。
- ネットワークセグメンテーションとファイアウォール: ネットワークをセグメント化し、異なるセグメント間の通信(特にサーバーセグメントや機密性の高いセグメントへのSMB/RPCアクセス)をファイアウォールで厳格に制御します。クライアント間のSMB通信を制限することも有効です。
- SMB署名の有効化: SMB通信の改ざんを防ぐために、SMB署名を要求するように設定します(パフォーマンスへの影響を考慮)。
- 定期的なパッチ適用: OSやソフトウェアの脆弱性を悪用されて認証情報が窃取されることを防ぐため、セキュリティパッチを迅速に適用します。
これらの対策を組み合わせることで、impacket-registry-read
のようなツールが悪用されるリスクを低減し、システム全体のセキュリティを向上させることができます。
まとめ 🏁
impacket-registry-read
は、Impacketスイートの中でも特に、リモートWindowsシステムのレジストリ情報を効率的に収集するための強力なツールです。システム構成の調査、ソフトウェアインベントリの作成、設定監査、そしてセキュリティ評価(ペネトレーションテストや脆弱性診断)など、多岐にわたる用途でその価値を発揮します。パスワード、NTLMハッシュ、Kerberosといった多様な認証方式に対応しており、柔軟な運用が可能です。
しかし、その強力さゆえに、攻撃者によって悪用される可能性も常に意識する必要があります。リモートレジストリサービスの適切な管理、最小権限の原則の徹底、ネットワークレベルでのアクセス制御、そして不審な活動の監視と検知体制の構築が不可欠です。
このツールを理解し、その能力とリスクの両方を把握した上で、倫理的かつ合法的な範囲内で責任を持って使用することが、すべてのセキュリティ専門家やシステム管理者に求められます。 ✨
コメント