investigating-windows-endpoints について
単一の Windows エンドポイントを調べるインシデント対応者向けのフォレンジック技能です。ライブホストや取得済みイメージのイベントログ、レジストリ、実行記録、ファイルシステムの痕跡を照合し、活動や永続化、アンチフォレンジックを調査します。
主な機能
- 01トリアージ収集と証拠保全の計画
- 02実行痕跡の相互照合
- 03Windows イベントログの分析
- 04永続化と横展開の調査
- 05NTFS とユーザー痕跡の確認
活用シーン
- 01疑わしい Windows ホストのトリアージ
- 02プロセス実行と攻撃活動の再構成
- 03永続化と横展開の痕跡の特定
- 04ログ消去やタイムスタンプ改ざんの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trilwu/ secskills --skill investigating-windows-endpointsインストール後、Claude Code で/investigating-windows-endpointsを入力して読み込まれたか確認します。
詳細
Windows エンドポイントの調査
Windows では、実行、永続化、アクセスの記録が数十種類のアーティファクトに残ります。攻撃者がそれらを完全に消去することはほとんどありません。イベントログは表層にすぎません。レジストリ、プリフェッチ、Amcache、ファイルシステムジャーナルが、その記録を裏付けたり、矛盾を示したりします。調査では、相互に独立したアーティファクトを相互参照して、単一のログを消去されても覆されないタイムラインを作成します。
使用する場面
- 侵害された、または不審な Windows ホストを、稼働中またはイメージからトリアージする場合
- KAPE、Velociraptor、EDR のトリアージコレクションを分析する場合
- Windows マシンで何がどの順序で実行されたかを再構築する場合
- EVTX/Sysmon/PowerShell のログを解析して攻撃者の活動を再構築する場合
- エンドポイント全体から永続化やラテラルムーブメントの痕跡を探す場合
- タイムスタンプの偽装、ログの消去、その他ホスト上でのアンチフォレンジックを検出する場合
使用しない場面
- ホストが Linux の場合 --
analyzing-linux-persistenceを使用してください - IR プロセス全体と複数ホスト間の調整が必要な場合 --
responding-to-incidentsを使用してください。Windows ホストが1台に絞られたら、こちらを使用してください - RAM キャプチャを分析する場合 --
analyzing-memory-imagesを使用してください。ディスク上のアーティファクトについては、こちらを使用してください - 侵害されたのがエンドポイントではなくクラウド ID の場合 --
investigating-m365-entraを使用してください - 特定のホストがない状態で、フリート全体をプロアクティブにハンティングする場合 --
hunting-threatsを使用してください - 対応者ではなく、ホスト上の攻撃者である場合 --
escalating-windows-privilegesを使用してください
まずトリアージコレクションを作成する
ライブディスクをその場で分析しないでください。トリアージセットを収集し、ハッシュを取得してから、そのコピーを使って作業してください。ほとんどのインシデントでは、対象を絞ったトリアージコレクションのほうがフルイメージより速く疑問に答えられます。重要なホストだけをイメージ化してください。
停止状態と稼働状態での取得。 電源オフのホストまたはマウント済みのディスクイメージからの取得は停止状態での取得です。状態の一貫性は保たれますが、実行中のプロセス、ネットワーク状態、ディスクに書き込まれていないログは失われます。稼働中のホストなら揮発性状態(メモリ、netstat -anob、Get-NetTCPConnection、tasklist /svc)をキャプチャできますが、あらゆる操作によってディスクが変更されるため、何に触れたかを記録してください。ホストが稼働中で「まだ侵入者がいるか」という疑問が残っている場合は、まずメモリをキャプチャしてから、analyzing-memory-images に引き継いでください。
:: KAPE targeted triage -- the fastest way to a defensible artifact set
kape.exe --tsource C: --target !SANS_Triage --tdest E:\out\host01 --vhdx host01
:: Broader coverage: registry hives, event logs, $MFT/$J, browser, prefetch
kape.exe --tsource C: --target KapeTriage,RegistryHives,EventLogs,FileSystem ^
--tdest E:\out\host01
:: Then run the parsers (Modules) over what you collected
kape.exe --msource E:\out\host01 --mdest E:\out\host01\parsed ^
--module !EZParser
Velociraptor(Windows.KapeFiles.Targets)を使うと、エージェントを介して同じセットをフリート規模で収集できます。どのツールを使う場合でも、コピーの前後にハッシュを検証してください。
主要なアーティファクトディレクトリとして、コレクションに次のものが含まれていることを確認してください。
C:\Windows\System32\winevt\Logs\ Event logs (.evtx)
C:\Windows\System32\config\ Registry hives: SYSTEM, SOFTWARE, SAM, SECURITY
C:\Users\<u>\NTUSER.DAT Per-user registry hive
C:\Users\<u>\AppData\Local\Microsoft\Windows\UsrClass.dat Shellbags, COM
C:\Windows\Prefetch\ *.pf execution evidence
C:\Windows\appcompat\Programs\Amcache.hve Amcache
C:\Windows\System32\sru\SRUDB.dat SRUM
C:\Windows\System32\Tasks\ Scheduled task XML
C:\$MFT C:\$Extend\$UsnJrnl C:\$LogFile Filesystem journals
C:\$Recycle.Bin\ Deleted-file $I records
実行の証拠
バイナリが実行された記録は、複数の独立したアーティファクトに残ります。それらを相互参照してください。記録が一致すれば確信度が高まり、一致しないこと自体も発見事項になります。
:: Prefetch -- run count, first/last run, files/dirs the binary touched.
:: Absent on most Servers; disabled on SSD-only systems -- note that, don't assume.
PECmd.exe -d C:\Windows\Prefetch --csv E:\out\parsed -q
:: Amcache -- SHA-1 of executed/present binaries, compile times, driver load
AmcacheParser.exe -f C:\Windows\appcompat\Programs\Amcache.hve ^
--csv E:\out\parsed -i
:: Shimcache / AppCompatCache (SYSTEM hive) -- path + last-modified; presence
:: means the file was seen, NOT necessarily executed. Order is roughly LRU.
AppCompatCacheParser.exe -f C:\Windows\System32\config\SYSTEM --csv E:\out\parsed
:: SRUM -- per-process bytes sent/received and CPU over 30-60 days.
:: Ties an executable to network volume even when netflow is gone.
SrumECmd.exe -f C:\Windows\System32\sru\SRUDB.dat ^
-r C:\Windows\System32\config\SOFTWARE --csv E:\out\parsed
ユーザーのハイブ(NTUSER.DAT/UsrClass.dat)から、RECmd を使って GUI での実行やファイルアクセスの証拠を解析してください。
:: UserAssist (GUI program launches, run count, focus time),
:: BAM/DAM (background/desktop activity moderator: last-run per exe per SID),
:: RecentDocs, and RunMRU in one pass with the bundled batch file
RECmd.exe -d C:\Users --bn BatchExamples\UserActivity.reb --csv E:\out\parsed
- ジャンプリスト(
...\Recent\AutomaticDestinations\*.automaticDestinations-ms)と LNK ファイル(...\Recent\*.lnk)には、対象パス、ボリュームシリアル番号、MAC 時刻とともに、開かれたファイルやアプリが記録されます。JLECmdとLECmdで解析してください。 - RecentDocs とシェルバッグ(下記参照)から、開かれたフォルダーやファイルが分かります。
イベントログの要となるログ
まずトリアージエンジン(下記のChainsaw / Hayabusa)でEVTXを解析し、その後、特定のチャネルを掘り下げます。特に重要なイベントIDは次のとおりです。
Security(Security.evtx):
- 4624 ログオン成功 -- ログオンの種類を確認します。2 は対話型、3 はネットワーク(SMB、共有、PtH)、10 はRemoteInteractive(RDP)、9 はNewCredentials(runas /netonly。Overpass-the-Hashでよく使われます)です。LogonIdをキーに、セッションのアクティビティを関連付けます。
- 4625 ログオン失敗 -- 送信元IPを基に、パスワードスプレー攻撃やブルートフォース攻撃を調査します。
- 4672 特別な権限が割り当てられた -- 管理者相当のログオンです。4624 と組み合わせて、特権セッションを特定します。
- 4648 明示的な資格情報によるログオン -- runasやラテラルムーブメントを示します。
- 4688 プロセス作成 -- コマンドライン監査が有効な場合、完全なコマンドラインと親プロセスを確認できます。Securityイベントの中で最も価値の高いイベントです。
- 4720/4722/4738 アカウントの作成/有効化/変更、4728/4732/4756 グローバル/ローカル/ユニバーサルの特権グループ(Domain Admins、ローカルのAdministrators)へのメンバー追加 -- 攻撃者によるアカウントやグループの操作を示します。
- 4698/4699/4702 スケジュールされたタスクの作成/削除/更新。
- 7045(Systemログ)新しいサービスのインストール、7036 サービスの状態変更 -- PsExecやラテラルツールの使用を示す特徴です。
- 1102 監査ログが消去された -- アンチフォレンジック行為であり、それ自体が侵害の兆候です。ログに残された空白も関連付けて調査します。
Sysmon(Microsoft-Windows-Sysmon/Operational)が導入されている場合は、最も情報量の多いデータソースです。
- 1 プロセス作成(ハッシュ、コマンドライン、親プロセスを含む) -- 3 ネットワーク接続 -- 7 イメージ/DLLの読み込み(署名のないDLL、サイドローディング) -- 8 CreateRemoteThread(インジェクション) -- 10 プロセスアクセス(LSASSハンドル=資格情報のダンプ) -- 11 ファイル作成 -- 12/13/14 レジストリの作成/設定/名前変更(自動実行) -- 15 ファイルストリームの作成(Zone.Identifier、ADS) -- 22 DNSクエリ -- 23/26 ファイル削除。
PowerShell:
- 4104 スクリプトブロックのログ記録(
Microsoft-Windows-PowerShell/Operational)-- 難読化解除されたスクリプトの内容を確認できます。-enc、FromBase64String、DownloadString、IEX、AMSIバイパス文字列を探します。4103 モジュール/パイプラインのログ記録。Windows PowerShell.evtxの 400/800(エンジンの起動、バージョン -- v2へのダウングレードは回避手法です)。
RDP / TerminalServices:
- Securityの 4778/4779 はセッションの再接続/切断を示します(RDPまたは高速ユーザー切り替えであり、新規ログオンではありません。新規ログオンは4624です)。
TerminalServices-RemoteConnectionManagerの 1149 は認証成功を示します(ユーザー+送信元IP)。TerminalServices-LocalSessionManagerの 21/22/25 はログオン、シェルの開始、再接続を示します。
WMI(Microsoft-Windows-WMI-Activity/Operational):5857 プロバイダーの読み込み、5858 操作エラー、5859-5861 永続的なイベントサブスクリプションの登録 -- WMIによる永続化を示します。
Task Scheduler(Microsoft-Windows-TaskScheduler/Operational):106
タスクの登録、140 更新、141 削除、200/201 アクションの実行/完了 -- Securityの4698を裏付けます。
永続化の痕跡調査
ツールがデフォルトでチェックする一部だけでなく、すべての自動起動箇所を調査してください。これは establishing-persistence の防御側の対応です。各メカニズムがどのように仕込まれるかについては、そのスキルを読んでから、ここに挙げた痕跡を調査してください。
- Run キー --
...\Software\Microsoft\Windows\CurrentVersion\RunとRunOnce。SOFTWARE および各 NTUSER.DAT 内にあるものを調べ、さらに...\Policies\Explorer\Runも確認します。 - サービス -- SYSTEM ハイブの
...\Servicesを調べ、インストール記録を 7045 と照合します。 - スケジュールされたタスク --
C:\Windows\System32\Tasks\内の XML を確認します(Actions と Triggers を解析)。4698/TaskScheduler 106 と照合します。 - WMI イベントサブスクリプション -- OBJECTS.DATA リポジトリ内の
__EventFilter、__EventConsumer、__FilterToConsumerBindingを確認します。Get-WMIObject -Namespace root\subscription -Class __EventConsumerを実行します。 - スタートアップフォルダー --
...\Start Menu\Programs\Startup\(ユーザーごと、およびすべてのユーザー)を確認します。 - Winlogon --
...\Winlogon配下のShell、Userinit、Notifyを確認します。explorer.exe/userinit.exeの後ろに追加されたものはすべて調査します。 - IFEO --
Image File Execution Options\<exe>\Debugger(およびGlobalFlagと Silent Process Exit)を使って、正規のバイナリが乗っ取られていないか確認します。 - COM ハイジャック -- ユーザーハイブの
Software\Classes\CLSID\...\InprocServer32が HKLM の CLSID をシャドーイングしていないか確認します。 - LSA/SSP --
...\Lsa\Security PackagesとNotification Packages、 および...\Lsa\OSConfigを確認します。 - BITS ジョブ --
bitsadmin /list /allusers /verboseを実行するか、...\Microsoft\Network\Downloader\qmgr*.datを解析して、ダウンロード後に実行するジョブを調べます。
:: Autoruns from Sysinternals, offline against a mounted image, VirusTotal + verify
autorunsc.exe -accepteula -a * -h -s -c -o autoruns.csv "\\?\E:\mount"
:: RECmd has batch files that dump every autostart location from the hives
RECmd.exe -d E:\out\host01 --bn BatchExamples\RegistryASEPs.reb --csv E:\out\parsed
ラテラルムーブメントの痕跡
移動すると、送信元と宛先の両方に対応する痕跡が残ります。時刻、アカウント、送信元 IP で相関付けてください。
- ネットワークログオン -- 宛先の Security 4624 Type 3(SMB/管理共有、PtH)および Type 10(RDP)、送信元の 4648 を確認します。Kerberos が想定されるドメイン参加ホストへの Type 3 が NTLM であれば、Pass-the-Hash の痕跡です。Type 9(NewCredentials)は Overpass-the-Hash/
runas /netonlyを示唆します。 - PsExec/サービスベースの実行 -- 宛先で 7045 のサービスインストール(ランダムな名前、または
PSEXESVC形式の名前)と 7036 の起動を確認します。詳細なファイル共有監査が有効であれば、\ADMIN$\<svc>.exeの書き込みに関する 5145 も確認します。RemCom や同様のクローンも、同じ 7045+7036 のパターンを示します。 - WMI/WinRM による実行 -- WMI-Activity 5857-5861、Sysmon 1 で
wmiprvse.exeが子プロセスを起動している記録を確認します。WinRM の 5985/5986(HTTP/HTTPS)と、Microsoft-Windows-WinRM/Operationalおよび 4624 Type 3 も確認します。 - 管理共有へのアクセス -- 5140/5145 にある
C$、ADMIN$、IPC$を確認し、ADMIN$に書き込まれたツールと相関付けます。 - SMB/ファイルのステージング -- 5140/5145 と、宛先にドロップされたツールの
$MFTエントリーを確認します。
ファイルシステムのフォレンジック
NTFS のメタデータファイルは、攻撃者が消去する可能性が最も低い確かな証拠であり、ログを消去しても回避できないタイムスタンプ改ざんの確認手段です。
:: $MFT -- every file's four SI + four FN timestamps, parent, size, resident data
MFTECmd.exe -f "E:\out\host01\$MFT" --csv E:\out\parsed
:: USN change journal -- creates/deletes/renames even after the file is gone
MFTECmd.exe -f "E:\out\host01\$Extend\$J" --csv E:\out\parsed
:: $LogFile -- transactional, can recover changes the USN rolled past
- タイムスタンプ改ざんの検出。
$STANDARD_INFORMATIONの時刻はユーザーランドから設定できます(SetFileTime、timestomp)。一方、$FILE_NAMEの時刻は、名前変更/移動の際にカーネルのみが設定します。SI が FN より前の時刻である、SI の秒未満部分がゼロである、または SI が USN エントリーと一致しない場合は、改ざんが疑われます。MFTECmd で両方を解析して差分を確認します。 - USN ジャーナル(
$Extend\$UsnJrnl:$J)には、変更時のファイル名、理由(FileCreate、RenameNew、FileDelete)、USN が記録されます。削除後でも、ツールのドロップ、名前変更、クリーンアップの過程を再構成できます。 - ごみ箱 --
C:\$Recycle.Bin\<SID>\内の$Iファイルには、各$Rファイルの元のパス、サイズ、削除時刻が記録されています(RBCmd.exe)。 - Shellbags(UsrClass.dat/NTUSER.DAT)は、削除済み、外部、ネットワーク上のパスも含め、ユーザーが特定のフォルダーを参照した証拠になります。
SBECmd.exe -d E:\out\host01 --csv E:\out\parsedを使用します。 - 代替データストリーム --
dir /r、Get-Item -Stream *を使用します。Zone.Identifierはダウンロードしたファイル(Web マーク)を示し、名前付きストリームにはペイロードが隠されていることがあります。
ブラウザーとアカウントのアーティファクト
- ブラウザーの履歴/ダウンロード -- Chrome/Edge の
History(SQLite、...\User Data\Default\History)、Firefox のplaces.sqlite。downloadsテーブルとZone.IdentifierADS により、ホストに何がダウンロードされたかを特定できます。 - ローカルアカウント -- 作成/有効化されたアカウント、RID、最終ログオン時刻は SAM ハイブで確認し、Security の 4720/4722/4732 と照合します。
- RDP キャッシュ/ビットマップ(
...\Terminal Server Client\Cache\*.bmc)から、対話型の侵入者が見た画面を再構成できます。
アンチフォレンジックの検出
クリーンアップは痕跡を消すのではなく、手掛かりを残します。その痕跡を探してください。
- ログの消去 -- Security の 1102(Security ログが消去された)と System の 104 (いずれかのログが消去された)には、アカウントと時刻が記録されます。対応するシャットダウンがないイベントログの空白期間も、それ自体が発見事項です。
- タイムスタンプの偽装 -- SI と FN の不一致(上記参照)。
- Prefetch の無効化 --
...\Memory Management\PrefetchParameters\EnablePrefetcher = 0。 - USN ジャーナルの削除 --
fsutil usn deletejournalを実行するとジャーナルが切り詰められます。履歴の欠落を空白期間として記録してください。 - Sysmon/EDR の改ざん -- サービスの停止(ドライバーの場合は 7036/7045)、設定変更、またはスクリプトブロックのログ記録を回避するための v2 PowerShell へのダウングレード。
こうした空白期間はすべて、制約事項としてタイムラインに明記してください。ログが消去されているからといって、「何も起きなかった」と暗黙に判断してはいけません。
スーパータイムラインの構築
まず迅速なトリアージを行い、その後、完全なタイムラインを作成します。すべてを UTC に統一し、各行にソースアーティファクトを記載して、観測事実と推定を分けてください。
:: Chainsaw -- fast EVTX triage with built-in + Sigma rules, minutes not hours
chainsaw hunt E:\out\host01\...\winevt\Logs -s sigma\ ^
--mapping mappings\sigma-event-logs-all.yml -r rules\ --csv -o chainsaw_out
:: Hayabusa -- EVTX -> single timeline scored by severity, Sigma-backed
hayabusa.exe csv-timeline -d E:\out\host01\...\winevt\Logs -o hayabusa.csv -p verbose
# Plaso -- ingest the whole triage set (or image) into one storage file...
log2timeline.py --storage-file plaso.db E:\out\host01
# ...then filter and export the super-timeline
psort.py -o l2tcsv -w super.csv plaso.db "date > '2026-07-01 00:00:00'"
解析済みの CSV(EZ Tools の出力、Chainsaw、psort)を Timeline
Explorer に読み込み、ひとつのグリッドでアーティファクトをまたいでピボット、タグ付け、色分けします。Eric
Zimmerman スイート -- PECmd、AmcacheParser、AppCompatCacheParser、SrumECmd、
MFTECmd、RECmd、SBECmd、JLECmd、LECmd、RBCmd -- に、EVTX 用の Chainsaw/Hayabusa と、統合タイムライン用の Plaso を加えたものが中核となるツールチェーンです。見つかった内容に基づいて writing-sigma-rules で検出ルールを作成し、ナラティブを reporting-security-findings に渡します。
退けるべき合理化
- 「Security ログが消去されたので、もう調査できない。」 Sysmon、Prefetch、Amcache、 SRUM、USN ジャーナルは、それぞれ独立して実行を記録します。1102 自体がインジケーターであり、消去したアカウントも記録されます。
- 「Prefetch エントリーがないので、実行されていない。」 多くのサーバーでは Prefetch がオフになっており、一部の SSD システムでも無効化されています。Amcache、Shimcache、SRUM、4688、Sysmon 1 がそれぞれ独立して実行を裏付けます。
- 「Shimcache に記録があるので、実行された。」 Shimcache/AppCompatCache は、ファイルが shim エンジンに認識されたことを記録するものであり、実行されたことを示すものではありません。Prefetch、Amcache、またはプロセス作成イベントで確認してください。
- 「ファイルのタイムスタンプが古いので、元からあったものだ。」
$STANDARD_INFORMATIONは簡単に偽装できます。$FILE_NAMEと USN ジャーナルを確認してください。不一致があれば、それが発見事項です。 - 「EDR がないので、分析するものがない。」 EDR の有無にかかわらず、レジストリ、イベントログ、Prefetch、Amcache、SRUM、$MFT はすべての Windows ホストに存在します。こうした調査の大半は、EDR が登場するより前から行われています。
- 「1 台のホストでアラートが出たので、侵入先も 1 台だ。」 4624 Type 3/10、4648、7045 を外部に向けて相関分析してください。認証ログで否定されるまでは、横展開を前提とします。
- 「PowerShell が難読化されているので、内容を読めない。」 スクリプトブロックのログ記録(4104)には、Windows が実際に実行した難読化解除後の内容が記録されます。4104 が欠落している場合、その空白は v2 へのダウングレードを示しており、それ自体が発見事項です。
参考資料
analyzing-linux-persistence-- Linux 向けの同じホストフォレンジック調査responding-to-incidents-- この調査の基盤となるインシデント対応プロセスと複数ホスト間の連携analyzing-memory-images-- ホストの揮発性データを分析する RAM 解析investigating-m365-entra-- クラウド ID が侵害された場合hunting-threats-- 特定のホストを対象としない、フリート全体を対象としたプロアクティブなハンティングestablishing-persistence-- ここでハンティングする自動起動項目の攻撃者側の視点writing-sigma-rules-- 発見したイベントログのパターンに対する検知reporting-security-findings-- タイムラインを成果物にまとめる方法- Eric Zimmerman ツール (https://ericzimmerman.github.io) -- PECmd、 AmcacheParser、MFTECmd、RECmd、SBECmd、Timeline Explorer
- KAPE (Kroll Artifact Parser and Extractor) -- トリアージ用の収集と解析
- Chainsaw と Hayabusa -- Sigma に対応した高速な EVTX トリアージ
- Plaso / log2timeline -- スーパータイムラインの生成
- Autoruns (Sysinternals) -- 自動起動項目の列挙
- Velociraptor -- 大規模なエンドポイントのトリアージ収集