Windows Management Instrumentation (WMI) を活用して情報を収集する
はじめに
impacket-wmiquery
(または wmiquery.py
) は、Impacket スイートに含まれる強力なツールの一つです。Impacket は、ネットワークプロトコルを扱うための Python クラスのコレクションであり、特に SMB や MSRPC といったプロトコルを低レベルで操作する機能を提供します。セキュリティ研究者やペネトレーションテスター、システム管理者がネットワーク探索、侵入テスト、システムの管理、インシデント対応などで広く利用しています。
その中でも wmiquery.py
は、Windows Management Instrumentation (WMI) を使用してリモートの Windows システムに対して WMI Query Language (WQL) クエリを実行し、システム情報を取得したり、オブジェクトの説明を得たりするために特化しています。WMI は Windows の管理基盤であり、OS、ハードウェア、ソフトウェア、プロセス、サービスなど、システムのほぼ全ての側面に関する情報へのアクセスと管理を可能にします。
このブログ記事では、impacket-wmiquery
の基本的な使い方から、認証方法、よく使われる WQL クエリの例、そして応用的な使い方までを詳しく解説します。このツールを使いこなすことで、Windows 環境の調査や管理がより効率的かつ効果的になるでしょう。✨
前提条件 🛠️
impacket-wmiquery
を使用するには、以下のものが必要です。
- Python 環境: Impacket は Python で書かれているため、Python 3.x がインストールされている必要があります。
- Impacket ライブラリ: Impacket スイート本体をインストールする必要があります。通常、以下のコマンドでインストールできます。
または、GitHub リポジトリから直接クローンしてセットアップすることも可能です。pip install impacket
Impacket の examples スクリプト (git clone https://github.com/fortra/impacket.git cd impacket python setup.py install
wmiquery.py
など) は、Impacket をインストールした後、通常impacket/examples
ディレクトリ内にあります。パスを通すか、直接そのディレクトリから実行します。 - ターゲットシステムへのアクセス権: リモートの Windows システムに対して WMI クエリを実行するには、そのシステムに対する適切な認証情報(ユーザー名とパスワード、または NTLM ハッシュなど)と、WMI を介したリモートアクセス権限(通常は管理者権限)が必要です。
- ネットワーク接続: 実行元マシンからターゲット Windows システムへのネットワーク接続が必要です。特に、DCOM (RPC) や SMB に関連するポート (TCP 135, 445 など、および動的 RPC ポート) へのアクセスがファイアウォールで許可されている必要があります。
基本的な使い方 💻
wmiquery.py
の基本的な構文は以下の通りです。
python wmiquery.py [[ドメイン/]ユーザー名[:パスワード]@]<ターゲットホスト名 or IPアドレス> [オプション]
コマンドを実行すると、認証情報が正しければ接続が確立され、WQL>
というプロンプトが表示されます。このプロンプトで WQL クエリを入力して実行します。
主なオプション
オプション | 説明 |
---|---|
target |
接続先のターゲットを指定します。形式は [[ドメイン/]ユーザー名[:パスワード]@]<ターゲットホスト名 or IPアドレス> です。パスワードを省略すると、プロンプトで聞かれます。 |
-hashes LMHASH:NTHASH |
パスワードの代わりに NTLM ハッシュ (LM:NT 形式) を使用して認証します。Pass-the-Hash 攻撃でよく利用されます。 |
-no-pass |
パスワードプロンプトを表示しません。-k (Kerberos 認証) と併用する場合などに使います。 |
-k |
Kerberos 認証を使用します。環境変数 KRB5CCNAME で指定された ccache ファイルから TGT を取得しようとします。-dc-ip オプションで KDC (ドメインコントローラー) の IP アドレスを指定できます。 |
-aesKey HEXキー |
Kerberos 認証で使用する AES キー (128 または 256 ビット) を指定します。 |
-dc-ip IPアドレス |
Kerberos 認証時に使用するドメインコントローラーの IP アドレスを指定します。省略した場合、ターゲットのドメイン部分 (FQDN) が使用されます。 |
-namespace 名前空間 |
接続する WMI 名前空間を指定します。デフォルトは //./root/cimv2 ですが、root\subscription など他の名前空間を指定することもできます。 |
-file ファイルパス |
WQL シェルで実行するコマンドが記述された入力ファイルを指定します。 |
-debug |
デバッグ出力を有効にします。接続やクエリの問題を調査する際に役立ちます。 |
-rpc-auth-level {integrity|privacy|default} |
RPC 認証レベルを指定します。integrity (整合性)、privacy (機密性)、default から選択できます。 |
-com-version MAJOR:MINOR |
使用する DCOM バージョンを指定します (例: 5.7 )。 |
実行例
ユーザー名とパスワードで接続:
python wmiquery.py MYDOMAIN/Administrator:Password123@192.168.1.100
NTLM ハッシュで接続:
python wmiquery.py MYDOMAIN/Administrator@192.168.1.100 -hashes aad3b435b51404eeaad3b435b51404ee:0123456789abcdef0123456789abcdef
Kerberos 認証 (ccache ファイルを使用) で接続:
export KRB5CCNAME=/tmp/krb5cc_myuser
python wmiquery.py MYDOMAIN/myuser@target-server.mydomain.local -k -no-pass
WQL シェル内のコマンド
接続後の WQL>
プロンプトでは、WQL クエリ以外にもいくつかの内部コマンドが利用できます。
help
: 利用可能なコマンドのヘルプを表示します。exit
: シェルを終了します。describe <クラス名>
: 指定した WMI クラスの定義(プロパティやメソッド)を表示します。 (例:describe Win32_Process
)lcd <パス>
: ローカルマシンのカレントディレクトリを変更します。! <コマンド>
: ローカルマシンのシェルコマンドを実行します。 (例:! ls -l
)
よく使われる WQL クエリの例 📊
WQL>
プロンプトで様々な WQL クエリを実行することで、ターゲットシステムの情報を収集できます。以下に、ペネトレーションテストやシステム管理でよく使われるクエリの例をいくつか示します。
目的 | WQL クエリ例 | 説明 |
---|---|---|
OS 情報の取得 | SELECT Caption, Version, OSArchitecture, InstallDate FROM Win32_OperatingSystem |
OS の名前、バージョン、アーキテクチャ、インストール日などを取得します。 |
実行中のプロセスのリスト | SELECT ProcessId, Name, ExecutablePath, CommandLine FROM Win32_Process |
プロセス ID、プロセス名、実行ファイルのパス、コマンドライン引数を取得します。特定のプロセスを探す場合、WHERE Name = 'cmd.exe' のように条件を追加できます。 |
サービスのリストと状態 | SELECT Name, DisplayName, State, StartMode FROM Win32_Service |
サービス名、表示名、現在の状態(Running, Stopped など)、スタートアップの種類を取得します。 |
ローカルユーザーアカウントのリスト | SELECT Name, SID, Disabled, Lockout FROM Win32_UserAccount WHERE LocalAccount = True |
ローカルユーザーアカウントの名前、SID、無効状態、ロックアウト状態を取得します。 |
ローカルグループのリスト | SELECT Name, SID FROM Win32_Group WHERE LocalAccount = True |
ローカルグループの名前と SID を取得します。 |
特定のグループのメンバー | ASSOCIATORS OF {Win32_Group.Domain='コンピュータ名',Name='Administrators'} WHERE AssocClass = Win32_GroupUser ResultRole = PartComponent |
指定したグループ(この例ではローカルの Administrators グループ)のメンバーを取得します。コンピュータ名 はターゲットマシンの NetBIOS 名に置き換えてください。 |
インストールされているソフトウェア | SELECT Name, Version, Vendor, InstallDate FROM Win32_Product |
MSI インストーラーでインストールされたソフトウェアの情報を取得します。(注: このクエリはリソース消費が大きく、システムによっては整合性チェックが走る可能性があるため注意が必要です) |
ネットワークアダプタの情報 | SELECT Description, MACAddress, IPAddress, IPSubnet, DefaultIPGateway FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True |
有効なネットワークアダプタの MAC アドレス、IP アドレス、サブネットマスク、デフォルトゲートウェイなどを取得します。 |
共有フォルダのリスト | SELECT Name, Path, Description FROM Win32_Share |
共有フォルダ名、ローカルパス、説明を取得します。 |
最近適用されたパッチ | SELECT HotFixID, Description, InstalledOn FROM Win32_QuickFixEngineering |
インストールされている Windows Update の HotFix ID やインストール日を取得します。 |
アンチウイルス製品の情報 | SELECT displayName FROM AntiVirusProduct (root\SecurityCenter2 名前空間) |
インストールされているアンチウイルス製品の表示名を取得します。このクエリは -namespace root\SecurityCenter2 オプションをつけて実行する必要があります。 |
イベントログのエントリ (例: 失敗したログオン) | SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND EventCode = 4625 |
セキュリティログから特定のイベントコード(この例では 4625: ログオン失敗)を持つエントリを取得します。大量のデータを返す可能性があるので注意が必要です。 |
応用的な使い方とシナリオ 🚀
WMI イベントの利用 (wmipersist.py)
wmiquery.py
は主に情報の「取得」に使われますが、Impacket には WMI イベントを利用して永続化やトリガー実行を行う wmipersist.py
というツールも含まれています。これは、特定のイベント(例: ログオン、時間)が発生したときに VBScript や PowerShell スクリプトを実行させる WMI イベントフィルターとコンシューマーを作成・削除するものです。
例えば、「特定の時間になったら指定のコマンドを実行する」といった永続化メカニズムを WMI を使って設定できます。これは攻撃者によって悪用される手法の一つでもあります。
コマンド実行 (wmiexec.py)
WMI を介してリモートでコマンドを実行したい場合は、wmiquery.py
ではなく wmiexec.py
を使用します。wmiexec.py
は WMI を利用してターゲットシステム上でコマンドを実行し、 شبهインタラクティブなシェルを提供します。
python wmiexec.py MYDOMAIN/Administrator:Password123@192.168.1.100 "whoami /all"
wmiexec.py
は、サービスを作成する psexec.py
や smbexec.py
と比較して、イベントログへのノイズが少なく、実行がユーザーコンテキスト(ただし通常は管理者権限が必要)で行われるため、よりステルス性が高いとされることがあります。2022 年頃から、ランサムウェア攻撃グループなどによる wmiexec.py
の利用増加が報告されています。
ペネトレーションテストでの活用シナリオ
- 初期偵察: 侵害したホストから、
wmiquery.py
を使ってドメイン内の他のホストの OS バージョン、インストール済みソフトウェア、稼働中のサービス、ログイン中のユーザーなどを調査し、次の攻撃ターゲットや脆弱な箇所を探します。 - 権限昇格後の情報収集: ローカル管理者権限を取得した後、
wmiquery.py
を使ってシステムの詳細設定、セキュリティ設定(監査ポリシーなど)、インストールされているセキュリティ製品(AV など)、保存されている認証情報に関連するプロセスなどを調査します。 - 横展開のための情報収集:
wmiquery.py
でネットワーク共有、ログインセッション情報、特定サービスの稼働状況などを調査し、wmiexec.py
や他のツールで横展開を行うための足がかりを探します。
システム管理での活用シナリオ
- インベントリ収集: 複数のマシンに対してスクリプトと
-file
オプションを使い、ハードウェア情報(CPU, メモリ, ディスク)、ソフトウェア情報、OS パッチレベルなどを一括で収集します。 - 設定確認: 特定のサービスが実行中か、特定のレジストリキーが存在するか(WMI を介してレジストリにアクセス可能)、セキュリティ設定が適切かなどをリモートから確認します。
- トラブルシューティング: リモートマシンのプロセスリスト、リソース使用状況(
Win32_PerfFormattedData_PerfOS_Processor
など)、イベントログなどをwmiquery.py
で調査し、問題の原因究明に役立てます。
セキュリティ上の考慮事項と検出 🛡️
impacket-wmiquery
や関連する WMI ツール (wmiexec.py
, wmipersist.py
) は非常に強力ですが、悪用されるリスクも伴います。
- 悪用リスク: 攻撃者は認証情報を窃取した後、これらのツールを使ってネットワーク内で横展開し、機密情報を収集したり、マルウェアを実行したりする可能性があります。特に
wmiexec.py
は、ランサムウェア攻撃などで活発に利用されています。 - 検出: WMI を介した不審なアクティビティは、以下の点を監視することで検出できる可能性があります。
- ネットワークトラフィック: DCOM/RPC (TCP 135 および動的ポート) や SMB (TCP 445) での予期しない通信、特に通常 WMI を多用しないホストからの通信。
- プロセス生成:
WmiPrvSE.exe
(WMI Provider Host) プロセスが親となって予期しない子プロセス(cmd.exe
,powershell.exe
など)を生成していないか。EDR 製品などは、WMI クエリによるプロセス生成 (ProcessCreatedUsingWmiQuery
のようなイベント) を記録することがあります。 - WMI イベントログ: WMI 自体の操作ログ (
Microsoft-Windows-WMI-Activity/Operational
イベントログ) を有効化し、不審なクエリやイベントサブスクリプション (wmipersist.py
によるもの) がないか監視します。 - 認証ログ: WMI 接続に使用されたアカウントのログオンイベント (成功・失敗) を監視します。短時間に多数のホストへ同じアカウントで WMI 接続を試みる動きは不審です。
- 対策:
- 強力なパスワードポリシーと多要素認証を導入し、認証情報の窃取を防ぎます。
- 不要なアカウント、特に管理者権限を持つアカウントを無効化または削除します。
- ホストベースのファイアウォールで、不要な WMI (DCOM/RPC) 通信を制限します。
- EDR (Endpoint Detection and Response) ソリューションを導入し、不審なプロセス生成や WMI 操作を検知・ブロックします。
- WMI 関連のログを収集・分析し、脅威ハンティングを実施します。
- 倫理的な使用: これらのツールは、必ず許可されたシステムに対して、正当な目的(ペネトレーションテスト、システム管理、セキュリティ調査など)のためにのみ使用してください。許可なく他者のシステムにアクセスすることは法律で禁じられています。
まとめ 🎉
impacket-wmiquery
は、Impacket スイートの一部として提供される、Windows 環境における強力な情報収集ツールです。WMI と WQL を利用して、リモートシステムの詳細な情報を効率的に取得できます。
この記事では、基本的な使い方、認証オプション、一般的な WQL クエリ例、応用シナリオ、そしてセキュリティ上の注意点について解説しました。
- ✅ 基本的な接続と WQL クエリの実行方法を学びました。
- 🔑 パスワード、NTLM ハッシュ、Kerberos など、様々な認証方法を理解しました。
- 📊 OS情報、プロセス、サービス、ユーザー、ソフトウェアなど、多岐にわたる情報を取得する WQL クエリ例を確認しました。
- 🚀 ペネトレーションテストやシステム管理における具体的な活用シナリオを探りました。
- 🛡️ 悪用リスクと、ネットワーク、プロセス、ログ監視による検出・対策の重要性を認識しました。
impacket-wmiquery
を適切に活用することで、Windows 環境の可視性を高め、セキュリティ評価やシステム管理業務をより効果的に行うことができます。ただし、その強力さゆえに、常に倫理的な側面に配慮し、許可された範囲内で責任を持って使用することが不可欠です。 💪
コメント