ファイルと通信先を手掛かりにした調査
ws7のreport.exeからハッシュの一致する端末を探し、関連する通信を照合します。観測できるログの違いも確認して、引継ぎ先が追加調査できる証拠一覧を作ります。
説明
一つの端末のアラートから調査を広げるときは、共通する証拠と未確認の点を記録します。同名ファイルや同名アカウントだけでは、端末間の関係は確定しません。
ws7のreport.exeからハッシュの一致する端末を探し、関連する通信を照合します。観測できるログの違いも確認して、引継ぎ先が追加調査できる証拠一覧を作ります。
1起点となる原イベントを読む
まずe2の識別子とファイルの実体を確認します。
from oplab import *
db=connect(7)
show(db, 'SELECT起点となる原イベントを読む * FROM events WHERE id="e2"')起点はws7のh2です。sha256列は表示を簡潔にした固定ラベルで、この演習では同一ラベルを同一ハッシュとして扱います。
2同名ファイルを広く検索する
名前だけで検索した候補を確認します。
show(db, 'SELECT同名ファイルを広く検索する id,host,actor,sha256 FROM events WHERE image="report.exe" ORDER BY id')ws9にも同じ名前がありますが、ハッシュはh9です。ファイル名の一致とバイト列の一致を分けて扱います。
3同一ハッシュの端末を抽出する
起点イベントのハッシュを副問い合わせで参照します。
show(db, 'SELECT同一ハッシュの端末を抽出する id,host,t FROM events WHERE sha256=(SELECT sha256 FROM events WHERE id="e2") ORDER BY t')ws7とws8が対象です。同じファイルでも正規配布の可能性があり、共通するというだけで横展開とは断定しません。
4それぞれの通信先を照合する
通信表は、取得時にプロセスイベントへ対応付けた固定記録です。
show(db, 'SELECTそれぞれの通信先を照合する e.id,e.host,n.id,n.dst,n.bytes FROM events e JOIN network n ON e.id=n.event_id WHERE e.sha256="h2" ORDER BY e.id')両端末から同じ宛先への送信があります。関連性は強まりますが、転送内容や目的は追加の資料で確認します。
5収集できるログの差を確認する
通信記録がない端末について、収集対象かを確認します。
show(db, 'SELECT収集できるログの差を確認する * FROM coverage ORDER BY host')ws9の通信ログは対象外です。結果がないことを、通信していない根拠として使えません。
6引継ぎ用の対応表を出す
起点、端末、ファイル、通信証拠を一行でたどれる形にします。
show(db, 'SELECT引継ぎ用の対応表を出す e.id AS process_evidence,e.host,e.sha256,n.id AS network_evidence,n.dst FROM events e LEFT JOIN network n ON e.id=n.event_id WHERE e.image="report.exe" ORDER BY e.id')e2/n1とe3/n2は対応が取れ、e4の通信は未確認です。次の担当者には一致した根拠と未観測の範囲を一緒に渡します。
まとめ
e2/n1とe3/n2は対応が取れ、e4の通信は未確認です。次の担当者には一致した根拠と未観測の範囲を一緒に渡します。
表示された証拠IDと検索条件を残すと、調査結果を元の記録までたどれます。
操作履歴と解説を振り返れます。
Python 3.15 / SQLite・固定の調査記録
from oplab import *
db=connect(7)
show(db, 'SELECT * FROM events WHERE id="e2"')id | t | host | actor | image | sha256 e2 | 11 | ws7 | alice | report.exe | h2
show(db, 'SELECT id,host,actor,sha256 FROM events WHERE image="report.exe" ORDER BY id')id | host | actor | sha256 e2 | ws7 | alice | h2 e3 | ws8 | alice | h2 e4 | ws9 | LOCAL/alice | h9
show(db, 'SELECT id,host,t FROM events WHERE sha256=(SELECT sha256 FROM events WHERE id="e2") ORDER BY t')id | host | t e2 | ws7 | 11 e3 | ws8 | 12
show(db, 'SELECT e.id,e.host,n.id,n.dst,n.bytes FROM events e JOIN network n ON e.id=n.event_id WHERE e.sha256="h2" ORDER BY e.id')id | host | id | dst | bytes e2 | ws7 | n1 | 203.0.113.7 | 800 e3 | ws8 | n2 | 203.0.113.7 | 900
show(db, 'SELECT * FROM coverage ORDER BY host')host | process | network ws7 | 1 | 1 ws8 | 1 | 1 ws9 | 1 | 0
show(db, 'SELECT e.id AS process_evidence,e.host,e.sha256,n.id AS network_evidence,n.dst FROM events e LEFT JOIN network n ON e.id=n.event_id WHERE e.image="report.exe" ORDER BY e.id')process_evidence | host | sha256 | network_evidence | dst e2 | ws7 | h2 | n1 | 203.0.113.7 e3 | ws8 | h2 | n2 | 203.0.113.7 e4 | ws9 | h9 | NULL | NULL
演習完了