一覧OP-07-2 · アラートのトリアージ

ファイルと通信先を手掛かりにした調査

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・固定の調査記録

1
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
2
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
3
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
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')
id | host | id | dst | bytes
e2 | ws7 | n1 | 203.0.113.7 | 800
e3 | ws8 | n2 | 203.0.113.7 | 900
5
show(db, 'SELECT * FROM coverage ORDER BY host')
host | process | network
ws7 | 1 | 1
ws8 | 1 | 1
ws9 | 1 | 0
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')
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

演習完了