
はじめに
端末の侵害が確認された場合、セキュリティチームと企業全体は、何が起きたのか、攻撃の範囲はどこまでか、攻撃者がどのようなアクセス権を取得し、何を保持しているのかを把握する必要があります。侵害された端末をクリーンアップする間に、攻撃者が環境内で別のアクセス手段を確保している可能性があり、その証拠が端末にしか残っていないこともあるからです。
エンドポイントから生のフォレンジックアーティファクトを取り出すこと自体がボトルネックです。答えにつながる証拠は、レジストリハイブ、複数チャネルのイベントログ、ブラウザー履歴データベース、Prefetch、Shimcache、Amcache、スケジュールタスク、WMIサブスクリプションなど、数多くの場所に分散しています。従来はディスクイメージを取得するか、アナリストが端末にリモート接続して複数のツールを手作業で実行していました。端末がすでにネットワークから切り離されている場合もあります。いずれも時間と希少な専門人材を要し、手作業のたびに収集対象の証拠に影響を与えるリスクがあります。
このような状況では、フォレンジックチームを起用し、システムや環境の一部、あるいは全体を分析して、攻撃と現状に関する報告書を作成することがあります。しかし、多くの場合は24時間以上かかり、インシデント対応中の貴重な時間が失われます。そこでExaforceは、AIエージェントを使い、アラートから数分以内にエンドポイントのフォレンジックデータを収集・分析して侵害の範囲と影響を把握し、対応時間を短縮する方法を検討しました。
エンドポイントのフォレンジックを迅速に行うのが難しい理由
難しいのは分析だけではありません。分析ももちろん困難ですが、それ以前に、証拠が失われる前に確保しなければなりません。複数の問題が同時に立ちはだかります。
証拠は分散し、人がそのまま読めない形式で保存されています。端末で何が起きたかを示す情報は、レジストリハイブ、複数チャネルのイベントログ、PowerShellトランスクリプト、Prefetch、Shimcache、Amcache、BAM/DAM、UserAssist、ジャンプリスト、ブラウザー履歴データベース、スケジュールタスク、WMIサブスクリプションなどに散在します。それぞれ保存場所もバイナリやデータベースの形式も異なり、多くは専用のパーサーが必要です。攻撃に関する問いに答える前に、すべての情報源を把握し、正しく収集し、解析する必要があります。
多くの証拠は揮発性があり、時間との勝負はすぐに始まります。アクティブなネットワーク接続、実行中のプロセス、DNS・ARPキャッシュ、ログオンセッションは現在の状態を示しますが、まもなく消失または上書きされます。イベントログはローテーションし、キャッシュも削除されます。侵害の疑いからデータ取得までの間隔が長いほど、攻撃者の活動記録が失われます。進行中のインシデントでは、まさに避けたい状況です。
エンドポイントに到達すること自体も障害です。端末が遠隔地や社外にあったり、すでに封じ込めで隔離されていたり、単にスリープ中のノートPCだったりする可能性があります。従来の収集方法は、物理的にディスクイメージを取得するか、リモートセッションで対話的に操作できることを前提にしています。しかし、インシデント対応中は、そのアクセス確保に最も時間がかかることがあります。封じ込めと調査の要件も相反します。被害を止める最速の方法は端末をネットワークから切り離すことですが、その端末にこそ攻撃の唯一の証拠が残っている場合があります。
手作業は調査対象に影響を与えます。ログイン、ドライブのマウント、ツールの実行、ファイルを開く操作でさえ、タイムスタンプを変更し、新しいイベントを生成し、調査対象のリソースを消費します。アナリストの操作は、後から攻撃者の活動と区別すべきノイズを増やします。不用意な収集では、取得しようとしていたアーティファクト自体を上書きしかねません。
手作業では規模に対応できず、専門知識も不足しています。実際の侵入が1台だけで完結することはまれですが、詳細なフォレンジック収集・分析は時間がかかる専門的な手作業です。人材は高額かつ不足しており、外部企業への依頼では範囲の調整と着手だけで数日かかることもあります。答えがまだ役立つ時間内に、10台や50台を手作業で調べることは現実的ではありません。
データを確保した後も、読み解くのに数時間かかります。1台のエンドポイントから膨大な文脈情報を含む記録が生成されます。人間のアナリストはそれらを読み、情報源を横断して関連付け、タイムラインを手作業で再構築しなければなりません。その時間は、収集から対応チームが行動できる答えを得るまでの遅延になります。
従来の方法で証拠を収集・解析・確認する数時間から数日の間に、攻撃者は別の場所に目立たない第2の足場を築いているかもしれません。その唯一の証拠が、初期化された端末とともに失われることもあります。Exaforceが埋めたいのは、このギャップです。
ExaforceのAI搭載リモート自動フォレンジックエージェント
AIを活用したリモート自動フォレンジックエージェントを構築する際には、次の4点を考慮する必要があります。
- スクリプトが収集するデータ。
- スクリプトのリモート実行とデータ収集の方法。
- スクリプトが生成するイベントと、処理がシステムの状態に与える影響。
- スクリプトと収集データのサイズ。収集データは分析のためにエージェントへ送信されます。
各スクリプトが収集するデータと実行時に生成するイベントについては、後述の収集スクリプトで説明します。リモート実行と収集データの取得には、EDR製品のリモート実行機能を活用することにしました。
ワークフローではCrowdStrike、SentinelOne、Microsoft Defender EDRを使用しています。これらはカスタムコマンドやスクリプトのリモート実行に加え、ファイルのアップロード・ダウンロードなどをAPI経由で行えます。そのため、Exaforceと各EDRを連携しやすくなります。
ダウンロードしたファイルはExaforce Automation Agentのワークフローに送られ、各ファイルがそれぞれのExabotに渡されます。Exabotは、端末にアクセスするID、端末のイベント、脅威の検出結果やインシデント、ポスチャー管理などの既存情報を持っています。それらと端末から収集した情報を組み合わせることで、攻撃をより明確に分析できます。
大量のデータによるハルシネーションの可能性を抑えるため、各ファイルにはデータの種類に合わせた専用プロンプトを使います。これにより、その種類のトリアージで想定される攻撃や生成イベントに焦点を当てた出力を得ます。
最後に、別のエージェントが各エージェントの情報を集め、既存の文脈と再度照合し、攻撃のタイムライン、起きた可能性のある攻撃の評価、攻撃の再構築、主な発見事項と指標を含む報告書を生成します。
顧客側の対応チームは、侵害された端末で起きた攻撃の全体像を把握できます。人による追加確認が必要な場合に備え、エージェントはダウンロードしたファイルのコピーも保持します。端末に再度触れることなく、収集・分析したデータを確認できます。
フォレンジックデータ収集スクリプト
侵害された端末のフォレンジックを自動化する際は、重要な情報を見極め、何を収集するかを把握する必要があります。
エンドポイント攻撃には、最初の侵入経路があります。その後は攻撃者の目的に応じて、情報の列挙、端末内のプロセスやID間の水平方向の移動、権限昇格、永続化が行われる可能性があります。ただし、攻撃者の目的やセキュリティシステムによる阻止によって、これらすべてが実行されるとは限りません。
フォレンジックアナリストにとって重要なのは、攻撃者がどのようにアクセスを得たかを把握することです。CMDやPowerShellのコマンド、サービスの作成、アプリケーションの実行などの実行イベントを収集するとともに、ブラウザーやネットワークの情報から、悪意あるペイロードの侵入経路を調べます。
水平・垂直方向のラテラルムーブメントや権限昇格を調べる際も、実行されたプロセス、サービス、アプリケーション、コマンドと、端末内外のサービスへのネットワーク接続を把握する必要があります。イベントログは、ユーザーの作成・変更、プロセスの作成、スケジュールタスクの作成・変更、サービスの改変などの確認に役立ちます。実行や権限昇格の手法の多くは永続化にも使われるため、同じ情報が必要です。永続化では、低権限のIDによる実行だけでなく、端末やカーネルレベルを含む高権限での実行にも注目します。
Windows
Windowsでは、PowerShellの履歴・ログとログ設定、CMDの履歴、ネットワーク接続、SSH設定、実行関連データ、システム・プロセス情報、重要なイベントログ、ブラウザーのダウンロード・拡張機能・履歴を収集します。
$Global:ModuleResults = New-Object System.Collections.Generic.List[Object]
$Global:JsonData = [ordered]@{
CaseInfo = [ordered]@{}
PowerShell = [ordered]@{}
CommandHistory = [ordered]@{}
SSH = [ordered]@{}
IR = [ordered]@{}
Persistence = [ordered]@{}
Network = [ordered]@{}
System = [ordered]@{}
Processes = [ordered]@{}
EventLogs = [ordered]@{}
Browser = [ordered]@{}
ModuleResults = @()
}ブラウザーデータ。Chrome、Edge、Firefox、Braveについて、すべてのユーザーとプロファイルからHistoryデータベース(ダウンロード記録を含む)と、インストール済み拡張機能のmanifest.jsonをコピーします。生ファイルは変更せず保持します。最後に、コピーしたHistoryデータベースをURLの行データに、マニフェストを構造化JSONに解析し、別のツールを開かずに拡張機能の権限やアクセス先URLを確認できるようにします。
# Browser modules
Invoke-Module -Name 'Browser.History.Chrome' -FunctionName 'Collect-BrowserHistoryChrome' -DestDir (Join-Path $WorkDir 'Browser\History\Chrome')
Invoke-Module -Name 'Browser.History.Edge' -FunctionName 'Collect-BrowserHistoryEdge' -DestDir (Join-Path $WorkDir 'Browser\History\Edge')
Invoke-Module -Name 'Browser.History.Firefox' -FunctionName 'Collect-BrowserHistoryFirefox' -DestDir (Join-Path $WorkDir 'Browser\History\Firefox')
Invoke-Module -Name 'Browser.History.Brave' -FunctionName 'Collect-BrowserHistoryBrave' -DestDir (Join-Path $WorkDir 'Browser\History\Brave')
Invoke-Module -Name 'Browser.Downloads.Chrome' -FunctionName 'Collect-BrowserDownloadsChrome' -DestDir (Join-Path $WorkDir 'Browser\Downloads\Chrome')
Invoke-Module -Name 'Browser.Downloads.Edge' -FunctionName 'Collect-BrowserDownloadsEdge' -DestDir (Join-Path $WorkDir 'Browser\Downloads\Edge')
Invoke-Module -Name 'Browser.Downloads.Firefox' -FunctionName 'Collect-BrowserDownloadsFirefox' -DestDir (Join-Path $WorkDir 'Browser\Downloads\Firefox')
Invoke-Module -Name 'Browser.Downloads.Brave' -FunctionName 'Collect-BrowserDownloadsBrave' -DestDir (Join-Path $WorkDir 'Browser\Downloads\Brave')
Invoke-Module -Name 'Browser.Extensions.Chrome' -FunctionName 'Collect-BrowserExtensionsChrome' -DestDir (Join-Path $WorkDir 'Browser\Extensions\Chrome')
Invoke-Module -Name 'Browser.Extensions.Edge' -FunctionName 'Collect-BrowserExtensionsEdge' -DestDir (Join-Path $WorkDir 'Browser\Extensions\Edge')
Invoke-Module -Name 'Browser.Extensions.Firefox' -FunctionName 'Collect-BrowserExtensionsFirefox' -DestDir (Join-Path $WorkDir 'Browser\Extensions\Firefox')
Invoke-Module -Name 'Browser.Extensions.Brave' -FunctionName 'Collect-BrowserExtensionsBrave' -DestDir (Join-Path $WorkDir 'Browser\Extensions\Brave')実行の証拠。端末上で何がいつ実行されたかを明らかにします。スクリプトは、UserAssist(バイナリレジストリデータから実行回数と最終実行時刻を復号したGUIプログラムの起動情報)、BAMとDAM(ユーザーSIDごとの各実行ファイルの最終実行時刻)、Amcache(Amcache.hveのコピーをオフラインのレジストリハイブとして読み込むアプリケーション一覧)を取得します。Shimcache、Prefetch、SRUMも一部取得します。Shimcacheからはキャッシュ内の実行ファイルパス、Prefetchからはファイル名・サイズ・タイムスタンプ、SRUMからはデータベースファイルのメタデータのみを取得します。この3つは、オフラインで完全に解析できます。
ユーザーの操作。端末内のすべてのプロファイルから、最近使ったファイルのショートカット、ジャンプリスト、各ユーザーのデスクトップとスタートメニューにある.lnkファイルを収集します。リンク先のパスを抽出することで、すでに存在しないリムーバブルストレージやネットワークストレージ上のファイルも含め、ユーザーが何を開いたかを確認できます。
# Execution evidence
Invoke-DataModule -Name 'IR.RecentFiles' -FunctionName 'Get-RecentFilesData' -TargetPath 'IR.RecentFiles'
Invoke-DataModule -Name 'IR.JumpLists' -FunctionName 'Get-JumpListsData' -TargetPath 'IR.JumpLists' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'IR.LNK' -FunctionName 'Get-LnkFilesData' -TargetPath 'IR.LNK' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'IR.UserAssist' -FunctionName 'Get-UserAssistData' -TargetPath 'IR.UserAssist' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'IR.BAM' -FunctionName 'Get-BAMData' -TargetPath 'IR.BAM'
Invoke-DataModule -Name 'IR.DAM' -FunctionName 'Get-DAMData' -TargetPath 'IR.DAM'
Invoke-DataModule -Name 'IR.Prefetch' -FunctionName 'Get-PrefetchData' -TargetPath 'IR.Prefetch'
Invoke-DataModule -Name 'IR.Amcache' -FunctionName 'Get-AmcacheData' -TargetPath 'IR.Amcache' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'IR.Shimcache' -FunctionName 'Get-ShimcacheData' -TargetPath 'IR.Shimcache'
Invoke-DataModule -Name 'IR.SRUM' -FunctionName 'Get-SRUMData' -TargetPath 'IR.SRUM' -TimeoutSec $LongTimeoutSecコマンドとシェルの履歴。PowerShellでは、各ユーザーのPSReadLine履歴(最大で直近1,000行)、ログポリシー設定(スクリプトブロックログ、モジュールログ、トランスクリプション)、トランスクリプトファイルの場所とサイズを収集します。cmd.exeについては、永続化によく使われるAutoRunレジストリエントリを収集し、ディスクに履歴を保存しないことを記録します。SSHではサーバー・クライアント設定、authorized_keys、known_hosts、公開鍵のみを収集します。秘密鍵は収集しません。
# Powershell related data
Invoke-DataModule -Name 'PowerShell.History' -FunctionName 'Get-PowerShellHistoryData' -TargetPath 'PowerShell.History'
Invoke-DataModule -Name 'PowerShell.Transcripts' -FunctionName 'Get-PowerShellTranscriptsData' -TargetPath 'PowerShell.Transcripts'
Invoke-DataModule -Name 'PowerShell.LoggingConfig' -FunctionName 'Get-PowerShellLoggingConfigData' -TargetPath 'PowerShell.LoggingConfig'
# Console Terminal data
Invoke-DataModule -Name 'CommandHistory' -FunctionName 'Get-CmdHistoryData' -TargetPath 'CommandHistory'
# SSH data
Invoke-DataModule -Name 'SSH' -FunctionName 'Get-SSHConfigData' -TargetPath 'SSH'永続化。再起動後もアクセスを維持するために攻撃者が利用する場所を調べます。すべてのスケジュールタスク、Run・RunOnceキー(端末全体とユーザー別)、スタートアップフォルダー、サービス(パス、起動モード、アカウント)、ドライバーを収集します。Winlogon、Image File Execution Options(デバッガーのハイジャックに利用)、Browser Helper Objects、Session Managerなど、選定したレジストリの自動起動箇所も取得します。ファイルレスの永続化によく使われるWMIイベントサブスクリプション(フィルター、コンシューマー、それらのバインド)も収集します。
# Persistence data
Invoke-DataModule -Name 'Persistence.ScheduledTasks' -FunctionName 'Get-ScheduledTasksData' -TargetPath 'Persistence.ScheduledTasks' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'Persistence.Startup' -FunctionName 'Get-StartupPersistenceData' -TargetPath 'Persistence.Startup'
Invoke-DataModule -Name 'Persistence.Services' -FunctionName 'Get-ServicesData' -TargetPath 'Persistence.Services'
Invoke-DataModule -Name 'Persistence.Drivers' -FunctionName 'Get-DriversData' -TargetPath 'Persistence.Drivers'
Invoke-DataModule -Name 'Persistence.Registry' -FunctionName 'Get-RegistryPersistenceData' -TargetPath 'Persistence.Registry'
Invoke-DataModule -Name 'Persistence.WMI' -FunctionName 'Get-WMIPersistenceData' -TargetPath 'Persistence.WMI' -TimeoutSec $LongTimeoutSecネットワークの状態。アクティブなTCP接続とUDPエンドポイントを、所有するプロセスIDとともに記録します。DNSキャッシュ、ARPテーブル、ルーティングテーブル、Windowsファイアウォールのルールも収集します。PowerShellのコマンドレットが使えない場合は、それぞれ従来のコマンドラインツール(netstat、ipconfig /displaydns、arp、route、netsh)にフォールバックします。
# Network data
Invoke-DataModule -Name 'Network.Firewall' -FunctionName 'Get-FirewallRulesData' -TargetPath 'Network.Firewall'
Invoke-DataModule -Name 'Network.DNS' -FunctionName 'Get-DNSCacheData' -TargetPath 'Network.DNS'
Invoke-DataModule -Name 'Network.ARP' -FunctionName 'Get-ARPCacheData' -TargetPath 'Network.ARP'
Invoke-DataModule -Name 'Network.Routes' -FunctionName 'Get-RouteTableData' -TargetPath 'Network.Routes'
Invoke-DataModule -Name 'Network.Netstat' -FunctionName 'Get-NetstatData' -TargetPath 'Network.Netstat'ホストの文脈情報。調査全体の背景となる、次の情報を収集します。
- 現在ログオンしているユーザー。
- ローカルAdministratorsグループのメンバー。
- レジストリのアンインストールキーから取得するインストール済みソフトウェア一覧。処理が遅く、システムへの影響が大きいWin32_Productクラスの使用を避けます。
- プロセス、端末、ユーザーの各スコープの環境変数。
- マウントされたボリューム。
- コメントを除いたhostsファイル。
- USBSTOR・USBレジストリツリー、MountedDevices、setupapi.dev.logの末尾から取得するUSBデバイスの履歴。
# System related data
Invoke-DataModule -Name 'System.LoggedOnUsers' -FunctionName 'Get-LoggedOnUsersData' -TargetPath 'System.LoggedOnUsers'
Invoke-DataModule -Name 'System.LocalAdmins' -FunctionName 'Get-LocalAdminsData' -TargetPath 'System.LocalAdmins'
Invoke-DataModule -Name 'System.InstalledSoftware' -FunctionName 'Get-InstalledSoftwareData' -TargetPath 'System.InstalledSoftware'
Invoke-DataModule -Name 'System.Environment' -FunctionName 'Get-EnvironmentVariablesData' -TargetPath 'System.Environment'
Invoke-DataModule -Name 'System.USB' -FunctionName 'Get-USBHistoryData' -TargetPath 'System.USB'
Invoke-DataModule -Name 'System.MountedVolumes' -FunctionName 'Get-MountedVolumesData' -TargetPath 'System.MountedVolumes'
Invoke-DataModule -Name 'System.HostsFile' -FunctionName 'Get-HostsFileData' -TargetPath 'System.HostsFile'プロセス。1つのモジュールで実行中プロセスのPID、親PID、名前、パス、開始時刻を記録します。別のモジュールで各プロセスの完全なコマンドラインを記録します。これにより、対応者はプロセスツリーを再構築し、各プログラムがどのように起動されたかを確認できます。
# Process information
Invoke-DataModule -Name 'Processes.List' -FunctionName 'Get-RunningProcessesData' -TargetPath 'Processes.List'
Invoke-DataModule -Name 'Processes.CommandLines' -FunctionName 'Get-ProcessCommandLinesData' -TargetPath 'Processes.CommandLines'イベントは全件エクスポートせず、絞り込んで取得します。スクリプトは少数のイベントIDを許可リストとして使い、各チャネルの過去7日間を新しい順に、チャネルごとの上限付きで照会します。
- Security:ログ消去(1102)、ログオンと失敗(4624、4625)、明示的な資格情報の使用(4648)、特別な権限(4672)、プロセス作成(4688)、サービスやスケジュールタスクの作成・変更(4697~4702)、アカウント・グループ管理(4720~4767)、RDP関連の活動(4778、4779)、ファイアウォール変更(4964)、ネットワーク共有へのアクセス(5140、5145)。
- System:新しいサービスのインストール(7045)、サービス状態の変更(7040)、ログ消去(104)、シャットダウンと再起動、予期しないシャットダウン(6008)。
- PowerShell:スクリプトブロックとパイプラインの実行(4103、4104)。
- Sysmon:プロセス作成、ネットワーク接続、イメージ読み込み、リモートスレッドなど(ID 1、3、6、8、15、17、18、22、23、25)。
- Defender:マルウェア検出、修復処理、構成やリアルタイム保護の変更。
- Application:一貫したセキュリティ用IDがないため、CriticalとErrorのイベントのみ。
# Events generated
Invoke-DataModule -Name 'EventLogs.Security' -FunctionName 'Get-EventLogSecurityData' -TargetPath 'EventLogs.Security' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'EventLogs.System' -FunctionName 'Get-EventLogSystemData' -TargetPath 'EventLogs.System' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'EventLogs.Application' -FunctionName 'Get-EventLogApplicationData' -TargetPath 'EventLogs.Application' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'EventLogs.PowerShell' -FunctionName 'Get-EventLogPowerShellData' -TargetPath 'EventLogs.PowerShell' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'EventLogs.Sysmon' -FunctionName 'Get-EventLogSysmonData' -TargetPath 'EventLogs.Sysmon' -TimeoutSec $LongTimeoutSec
Invoke-DataModule -Name 'EventLogs.Defender' -FunctionName 'Get-EventLogDefenderData' -TargetPath 'EventLogs.Defender' -TimeoutSec $LongTimeoutSec実行時にはメタデータJSONを作成し、システム、スクリプト、実行ユーザー、開始・終了時刻、所要時間を記録します。
# Forensics Case information data
$EndTime = Get-Date
$Global:JsonData.CaseInfo = [ordered]@{
CaseName = $CaseName
Hostname = $HostnameStr
RunAsUser = $UsernameStr
ScriptVersion = $ScriptVersion
StartTimeUtc = $StartTime.ToUniversalTime().ToString('o')
EndTimeUtc = $EndTime.ToUniversalTime().ToString('o')
DurationSeconds = [math]::Round(($EndTime - $StartTime).TotalSeconds, 1)
}
$Global:JsonData.ModuleResults = $Global:ModuleResults.ToArray()収集したデータのJSON出力全体を1つの大きなJSONに保存し、手動分析にも利用できるようにします。
$JsonOutPath = 'C:\Windows\Temp\IR_Data.json' #Join-Path $WorkDir 'IR_Data.json'
try {
($Global:JsonData | ConvertTo-Json -Depth 12 -ErrorAction Stop) | Out-File -FilePath $JsonOutPath -Encoding utf8
Write-Log 'INFO' "Wrote consolidated JSON: $JsonOutPath"
} catch {
Write-Log 'ERROR' "Failed to write consolidated JSON: $($_.Exception.Message)"
}エージェントがデータを分けて分析し、端末からダウンロードしやすくするため、この大きなJSONを10個に分割します。これらは端末のエージェントによってダウンロードされます。
$JsonOutputDir = "C:\Windows\Temp\IR_Data"
if (Test-Path -LiteralPath $JsonOutputDir) {
Remove-Item -LiteralPath $JsonOutputDir -Recurse -Force
}
mkdir $JsonOutputDir
Write-JsonFile -InputObject $Global:JsonData.Powershell -Depth 5 -Path (Join-Path $JsonOutputDir "Powershell.json")
Write-JsonFile -InputObject $Global:JsonData.CommandHistory -Depth 5 -Path (Join-Path $JsonOutputDir "CommandHistory.json")
Write-JsonFile -InputObject $Global:JsonData.SSH -Depth 5 -Path (Join-Path $JsonOutputDir "SSH.json")
Write-JsonFile -InputObject $Global:JsonData.IR -Depth 5 -Path (Join-Path $JsonOutputDir "IR.json")
Write-JsonFile -InputObject $Global:JsonData.Persistence -Depth 5 -Path (Join-Path $JsonOutputDir "Persistence.json")
Write-JsonFile -InputObject $Global:JsonData.Network -Depth 5 -Path (Join-Path $JsonOutputDir "Network.json")
Write-JsonFile -InputObject $Global:JsonData.System -Depth 5 -Path (Join-Path $JsonOutputDir "System.json")
Write-JsonFile -InputObject $Global:JsonData.Processes -Depth 5 -Path (Join-Path $JsonOutputDir "Processes.json")
Write-JsonFile -InputObject $Global:JsonData.EventLogs -Depth 5 -Path (Join-Path $JsonOutputDir "EventLogs.json")
Write-JsonFile -InputObject $Global:JsonData.Browser -Depth 5 -Path (Join-Path $JsonOutputDir "Browser.json")macOS
macOSでも同じ考え方で収集します。10種類のデータを10個のファイルにまとめ、メタデータファイルを1つ追加します。
main() {
--snip--
for m in "${MODULES[@]}"; do
case $m in
system) mod_system ;;
persistence) mod_persistence ;;
execution) mod_execution ;;
eventlogs) mod_eventlogs ;;
files) mod_files ;;
network) mod_network ;;
accounts) mod_accounts ;;
browser) mod_browser ;;
cloudsync) mod_cloudsync ;;
removable) mod_removable ;;
*) print -u2 "[!] unknown module: $m" ;;
esac
done
write_manifest
log "done. $(ls -1 "$OUTDIR"/*.json 2>/dev/null | wc -l | tr -d ' ') files in $OUTDIR"
print -- "$OUTDIR"
}
main "$@"Windowsと同様に、攻撃者の行動を理解するには、初期アクセス、情報の列挙、ラテラルムーブメント、権限昇格、永続化の過程で何が起きたかを把握する必要があります。
まとめ
端末の侵害は、その1台だけの問題ではありません。本当のリスクは、攻撃者がその端末から何を行い、環境内の別の場所で何を保持しているかです。端末をクリーンアップした瞬間から、時間との勝負が始まります。従来のフォレンジックはこの問いに答えられるものの、時間とコストがかかります。その間に、攻撃者が目立たない第2の足場を築き、初期化された端末とともに唯一の証拠が失われるおそれがあります。
このワークフローは、調査初期の負担が大きい部分を、厳密さを保ちながら自動化できることを示しています。WindowsとmacOSの実行、永続化、ラテラルムーブメント、権限昇格、ネットワーク、ブラウザー活動から、選定したアーティファクトを一貫した構造で収集します。これにより、人が読むだけで何時間もかかる大量の文脈情報を、AIが扱いやすい形で渡せます。データを用途別に分け、それぞれに適したプロンプトを使い、端末についてExabotがすでに持つ文脈に基づいて分析することで、ハルシネーションを抑えます。最後の相互参照で、10の個別の視点を、対応チームが活用できる1つのタイムラインと攻撃の再構築にまとめます。
実用性を支えるのは、端末への影響を抑えた収集、組織がすでに信頼するEDRを使ったリモート実行、そして報告書とともに保存される生ファイルです。人は端末に再び触れることなく、結論を検証できます。フォレンジックチームを置き換えるのではなく、その能力を拡張し、「侵害された疑いがある」から「何が起き、範囲はどこまでで、攻撃者が何を保持している可能性があるか」までの時間を短縮します。迅速で正確な答えが最も重要なのは、まさにその時間帯です。






