hunting-for-suspicious-scheduled-tasks について
Windowsのセキュリティ調査担当者向けに、タスクスケジューラの脅威ハンティングを支援するスキルです。タスクの棚卸し、実行内容やトリガーの分析、イベント相関、ベースライン比較を行います。
主な機能
- 01タスクの列挙とベースライン比較
- 02タスク作成・変更イベントの監視
- 03実行内容とトリガーの確認
- 04隠しタスクや偽装タスクの検出
- 05実行記録とプロセスログの相関
活用シーン
- 01タスクスケジューラを使った永続化の調査
- 02異常なイベントID 4698の作成記録の確認
- 03横展開やペイロード実行の予約の検出
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill hunting-for-suspicious-scheduled-tasksインストール後、Claude Code で/hunting-for-suspicious-scheduled-tasksを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
不審なスケジュールタスクの探索
使用する場面
- Windows 環境で永続化メカニズムを能動的に探索するとき
- プロセス作成ログで schtasks.exe や at.exe の使用を検出したあと
- 再起動やユーザーのログオフを生き延びるマルウェアを調査するとき
- インシデント対応中に、侵害されたシステム上のすべての永続化を列挙するとき
- Windows セキュリティイベント ID 4698(スケジュールタスクの作成)が通常とは異なるタスクで発生したとき
前提条件
- Windows セキュリティイベント ID 4698/4699/4702(タスクの作成/削除/更新)
- コマンドラインを含む schtasks.exe のプロセス作成を記録する Sysmon イベント ID 1
- Windows タスクスケジューラの運用ログ(Microsoft-Windows-TaskScheduler/Operational)
- Register-ScheduledTask コマンドレットの使用を記録する PowerShell ロギング
- エンドポイント上のタスクスケジューラ XML 定義へのアクセス
ワークフロー
- すべてのスケジュールタスクを列挙する:
schtasks /query /fo CSV /vまたはGet-ScheduledTaskPowerShell コマンドレットを使用して、対象システムから完全なタスクの一覧を収集します。 - タスク作成イベントを監視する: イベント ID 4698 を追跡して新しいタスクの作成を把握し、作成元のプロセスとユーザーアカウントのコンテキストと関連付けます。
- タスクのアクションを分析する: 各タスクが何を実行するかを調べます。スクリプト(PowerShell、cmd、wscript)を実行するタスク、ユーザーが書き込み可能なパス(TEMP、AppData、Downloads)のバイナリ、またはエンコード/難読化されたコマンドにフラグを立てます。
- タスクのトリガーを確認する: トリガー条件を確認します。システム起動、ユーザーログオン、または短い間隔(1~5 分)でトリガーされるタスクは調査が必要です。
- 隠れたタスクや偽装されたタスクを特定する: 正規の Windows タスクを模倣した名前のタスク、標準の列挙から隠すためにセキュリティ記述子が変更されたタスク、または標準的でないレジストリの場所に保存されたタスクを探します。
- プロセス実行と相関付ける: スケジュールタスクの実行イベントをプロセス作成ログと照合し、実際に何が実行されているかを確認します。
- ベースラインと差分を比較する: 現在のタスク一覧を既知の正常なベースラインと比較し、新規、変更済み、または想定外のタスクを特定します。
検出クエリ
Splunk -- スケジュールタスクの作成
index=wineventlog EventCode=4698
| spath output=TaskName path=EventData.TaskName
| spath output=TaskContent path=EventData.TaskContent
| where NOT match(TaskName, "(?i)(\\\\Microsoft\\\\|\\\\Windows\\\\)")
| table _time Computer SubjectUserName TaskName TaskContent
Splunk -- Schtasks.exe の不審な使用
index=sysmon EventCode=1 Image="*\\schtasks.exe"
| where match(CommandLine, "(?i)/create")
| where match(CommandLine, "(?i)(powershell|cmd|wscript|cscript|mshta|rundll32|regsvr32|http|https|\\\\temp\\\\|\\\\appdata\\\\)")
| table _time Computer User CommandLine ParentImage
KQL -- Microsoft Sentinel
SecurityEvent
| where EventID == 4698
| extend TaskName = tostring(EventData.TaskName)
| extend TaskContent = tostring(EventData.TaskContent)
| where TaskContent has_any ("powershell", "cmd.exe", "wscript", "http://", "https://", "\\Temp\\", "\\AppData\\")
| project TimeGenerated, Computer, Account, TaskName, TaskContent
一般的なシナリオ
- Cobalt Strike による永続化: schtasks.exe を介してスケジュールタスクを作成し、ユーザーログオンのタイミングで PowerShell のダウンロードクラドルを実行させます。
- ランサムウェアのステージング: 将来の時刻に暗号化ペイロードを実行するタスクを作成し、影響を最大化するために業務時間外に実行されることが多いです。
- セキュリティ記述子の変更による隠しタスク: 攻撃者がスケジュールタスクのセキュリティ記述子を変更し、実行を維持したまま通常の列挙から隠します。
- COM ハンドラーの悪用: タスクが実行ファイルの直接パスではなく COM ハンドラーを使用するため、アクションの検査がより複雑になります。
- タスクを利用した横展開:
schtasks /create /s REMOTE_HOSTを使用して、他のシステム上で実行するためにリモートからスケジュールタスクを作成します。
出力形式
Hunt ID: TH-SCHTASK-[DATE]-[SEQ]
Host: [Hostname]
Task Name: [Full task path]
Action: [Command/Script executed]
Trigger: [Startup/Logon/Timer/Event]
Created By: [User account]
Created From: [Local/Remote]
Creation Time: [Timestamp]
Run As: [Execution account]
Risk Level: [Critical/High/Medium/Low]
コメント
Markdown 対応