こんにちは!SOC(セキュリティ・オペレーション・センター)で日夜インシデントの調査を行っているアナリストの私です。
セキュリティのニュースを見ていると、「WMIを使った高度な永続化」といった、なんだか呪文のような難しそうな言葉を目にすることがありますよね。「自分はプログラマーだからインフラのことは……」とか、「まだIT業界に入ったばかりでセキュリティはちょっと……」と身構えてしまう方も多いのではないでしょうか。
でも大丈夫です!一歩ずつ、身近な例えから紐解いていけば、誰でもしっかりと理解できるようになりますよ。今回は、攻撃者が好んで隠れ家にする「WMI」というWindowsの便利な仕組みと、それを暴き出すためのログ分析について、優しく丁寧にお話ししていきますね。
—
1. 泥棒が「合鍵」を作る手口:WMIの永続化ってなに?
まずは、攻撃者がやろうとしていることを、私たちの日常の防犯に置き換えて考えてみましょう。
皆さんの家には玄関の鍵がありますよね。泥棒が家に侵入しようとしたとき、もし鍵が閉まっていたら入れません。そこで賢い泥棒は、一度家の中に侵入したあと、こっそり「合鍵」を作ったり、「特定の時間が来たら勝手に玄関の鍵が開く仕組み」を仕掛けたりして、次にいつでも自由に出入りできるようにします。これがセキュリティの世界でいう「永続化(Persistence)」と呼ばれる手口です。
Windowsの世界において、この「合鍵」や「自動で動く仕掛け」として悪用されやすいのが、WMI(Windows Management Instrumentation)という機能です。
WMIとは? Windowsの「便利な自動お掃除ロボット」
WMIは、一言でいうと「Windowsの状態を監視したり、色々な設定を自動で変えたりするための管理システム」です。
例えば、「夜の12時になったらパソコンのハードディスクの空き容量をチェックして!」とか、「新しいUSBメモリが刺さったら自動で教えて!」といった管理者の面倒な仕事を裏で引き受けてくれる、いわば優秀な自動お掃除ロボットのような存在ですね。
しかし、この便利なロボット、もし悪意を持った人物に乗っ取られてしまったらどうなるでしょうか?
「パソコンが起動してから3分経ったら、裏でこっそり怪しいプログラムを動かして!」と、ロボットにこっそり命令を仕込んでおくことができてしまいます。これが、WMIイベントサブスクリプション(WMIを用いた永続化)の正体です。
厄介なことに、この仕組みは通常の「スタートアップフォルダ」や「レジストリ」といった、よく見つかる場所にはファイルとして姿を残しません。OSの奥深くにある「WMIリポジトリ」という専用のデータベースの中にこっそり隠れてしまうため、普通のアンチウイルスソフトでは見逃してしまうことも多いのです。
—
2. 犯行の痕跡を見つける:イベントID 5861とログの秘密
では、私たちSOCのアナリストやインフラ担当者は、どうやってこの「見えない合鍵」を見つけ出せばよいのでしょうか?
ここで頼りになるのが、Windowsが記録してくれる「防犯カメラの映像」こと、イベントログです。特に、WMIに関する重要な変更があったときには、特別なログが記録されるようになっています。
チェックすべき重要ポイント
Windowsのイベントビューアや、ログ収集ツール(SIEMなど)を使って、以下のイベントを探し出します。
- イベントID: 5861 (Microsoft-Windows-WMI-Activity/Operational)
- これは、「WMIの設定に何かしらの変更や新しいフィルター・消費者(コンシューマー)が登録されたよ」ということを教えてくれる、非常に重要なログです。
泥棒が合鍵を作った瞬間、あるいは自動でドアを開く仕掛けをセットした瞬間、Windowsはこの「5861」という番号をつけて、「ねえ、今WMIの設定が変わったけど知ってる?」と記録を残してくれます。このログを監視することが、WMI永続化を暴くための第一歩になります。
—
3. 実践!PowerShellでWMIの怪しい仕掛けを暴く
「じゃあ、実際に自分の管理しているサーバーやPCに、怪しい仕掛けが隠されていないか調べてみよう!」と思ったそこのあなた、素晴らしい着眼点です!
現場のエンジニアが調査の際によく使う、安全なPowerShellのスクリプトをご紹介しますね。このスクリプトは、現在システムに登録されているWMIの「イベントフィルター(きっかけ)」と「イベントコンシューマー(その結果何をするか)」のペアを確認するためのものです。
お手元のテスト環境や検証用の端末で、PowerShellを管理者として起動し、以下のコードを貼り付けて実行してみてください。
# ==========================================
# WMI永続化(イベントサブスクリプション)の検出スクリプト
# 目的: 怪しいイベントフィルターとコンシューマーの紐付けを確認する
# ==========================================
Write-Host "[-] WMIイベントサブスクリプションの調査を開始します..." -ForegroundColor Cyan
# 1. イベントフィルター(きっかけ)の一覧を取得
# 例: 「特定の時間になったら」「特定のイベントが起きたら」といった条件が格納されています
$Filters = Get-CimInstance -Namespace root\subscription -ClassName __EventFilter
Write-Host "[+] 登録されているイベントフィルター数: $($Filters.Count)" -ForegroundColor Green
foreach ($Filter in $Filters) {
Write-Host " ----------------------------------------"
Write-Host " 名前 (Name) : $($Filter.Name)" -ForegroundColor Yellow
Write-Host " クエリ (Query) : $($Filter.Query)" -ForegroundColor White
}
# 2. イベントコンシューマー(結果:何を実行するか)の一覧を取得
# 例: 「PowerShellを使って外部から怪しいプログラムをダウンロードして実行する」などのアクション
$Consumers = Get-CimInstance -Namespace root\subscription -ClassName __EventConsumer
Write-Host "[+] 登録されているイベントコンシューマー数: $($Consumers.Count)" -ForegroundColor Green
foreach ($Consumer in $Consumers) {
Write-Host " ----------------------------------------"
Write-Host " 名前 (Name) : $($Consumer.Name)" -ForegroundColor Yellow
# コンシューマーの種類によって表示プロパティを変える(CommandLineEventConsumerの場合は実行コマンドを表示)
if ($Consumer.CimClass.ClassName -eq "CommandLineEventConsumer") {
Write-Host " 実行コマンド : $($Consumer.CommandLineTemplate)" -ForegroundColor Red
} else {
Write-Host " コンシューマー型 : $($Consumer.CimClass.ClassName)" -ForegroundColor Gray
}
}
Write-Host "[-] 調査が完了しました。見慣れないコマンドや不審な名前がないか確認してください。" -ForegroundColor Cyan
このスクリプトの見方・ポイント
- 実行したときに、見覚えのない不自然な名前のフィルターや、
CommandLineTemplateの中にpowershell.exe -enc ...のような見慣れない難読化されたコマンドが含まれていないかを確認します。 - もし正規の業務アプリ(例えば、バックアップツールや監視エージェントなど)が登録したものではなく、身に覚えのないコマンドが動いていたら、それは「合鍵」の可能性大です。
—
4. 一歩ずつ対策を学んでいきましょう!
WMIを悪用した永続化は、一見するととても難しく、巧妙な手口に見えます。攻撃者はあの手この手でシステムに隠れようとしますが、「どこが変化したのか(イベントID 5861)」を知り、「中身を定期的に点検する(PowerShellでの確認)」という基本の習慣さえ持っていれば、決して恐ろしいものではありません。
セキュリティの仕事やインフラの管理は、パズルを解くような泥臭い作業の積み重ねです。でも、こうして仕組みを一つずつ紐解いていくことで、確実にシステムの守りを固めることができます。
日々の運用の中で、「あれ、このログはなんだろう?」という小さな違和感に気づけるアナリストやエンジニアを目指して、一緒に一歩ずつ学んでいきましょうね!
コメント