一覧OP-08-1 · 横断相関と攻撃経路の再構成

複数端末のログとファイル履歴の照合

ws7とws8のファイル記録を調べ、同名アカウントのws9を分けます。ハッシュの一致だけの段階から、コピーの証拠まで照合する流れを学びます。

説明

端末をまたぐ調査では、同じ利用者名やファイル名が別の実体を指すことがあります。所属を含む主体IDやファイルのハッシュを使い、転送元と転送先を直接結ぶ資料があるか確認します。

ws7とws8のファイル記録を調べ、同名アカウントのws9を分けます。ハッシュの一致だけの段階から、コピーの証拠まで照合する流れを学びます。

1名前と主体IDの対応を見る

localは画面上の名前、principalは所属を含む識別子です。

from oplab import * db=connect(8) show(db, 'SELECT名前と主体IDの対応を見る * FROM identity ORDER BY host')

ws7とws8は同じCORPの主体ですが、ws9は別のLOCAL主体です。表示名aliceだけでは同一と判断できません。

2同じ主体の活動を集める

主体IDを条件に検索します。

show(db, 'SELECT同じ主体の活動を集める id,host,kind,path,hash FROM records WHERE principal="CORP/S-1-5-21-7" ORDER BY t')

3件が対象で、ws9のe4は含まれません。同じ主体の活動でも、各端末で実行された内容は別に確認します。

3同じハッシュの保存先を探す

h7は教材内の短縮ハッシュ識別子です。

show(db, 'SELECT同じハッシュの保存先を探す id,host,path FROM records WHERE hash="h7" ORDER BY t')

二つの端末に同じ内容のファイルがあります。これだけではどちらからどちらへ運ばれたかは決まりません。

4転送の証拠を結合する

コピー記録が参照する元イベントと先イベントを確認します。

show(db, 'SELECT転送の証拠を結合する x.id,s.host AS source,d.host AS destination,s.hash,d.hash FROM transfer x JOIN records s ON x.source_event=s.id JOIN records d ON x.destination_event=d.id')

x1はws7からws8へのコピーを対応付けています。単に時刻が近いという推測より強い来歴の根拠になります。

5実行ファイルと転送ファイルを分ける

転送後のプロセスが何を実行したか確認します。

show(db, 'SELECT実行ファイルと転送ファイルを分ける id,kind,path,hash FROM records WHERE host="ws8" ORDER BY t')

転送物はreport.txt、起動した実行ファイルはviewer.exeです。転送した文書がそのまま実行ファイルだったと読み替えてはいけません。

6主張を支える直接の関係を見る

関係を裏付ける証拠IDを一覧に残します。

show(db, 'SELECT主張を支える直接の関係を見る * FROM edges ORDER BY source')

コピーはx1、ファイルを開いた関係はo1です。主体、内容の一致、直接の操作記録を組み合わせて来歴を説明します。

まとめ

コピーはx1、ファイルを開いた関係はo1です。主体、内容の一致、直接の操作記録を組み合わせて来歴を説明します。

表示された証拠IDと検索条件を残すと、調査結果を元の記録までたどれます。

操作履歴と解説を振り返れます。

Python 3.15 / SQLite・固定の調査記録

1
from oplab import * db=connect(8) show(db, 'SELECT * FROM identity ORDER BY host')
host | local | principal
ws7 | alice | CORP/S-1-5-21-7
ws8 | alice | CORP/S-1-5-21-7
ws9 | alice | LOCAL/S-1-5-21-9
2
show(db, 'SELECT id,host,kind,path,hash FROM records WHERE principal="CORP/S-1-5-21-7" ORDER BY t')
id | host | kind | path | hash
e1 | ws7 | file_write | C:/Data/report.txt | h7
e2 | ws8 | file_write | C:/Share/report.txt | h7
e3 | ws8 | process | C:/Tools/viewer.exe | h8
3
show(db, 'SELECT id,host,path FROM records WHERE hash="h7" ORDER BY t')
id | host | path
e1 | ws7 | C:/Data/report.txt
e2 | ws8 | C:/Share/report.txt
4
show(db, 'SELECT x.id,s.host AS source,d.host AS destination,s.hash,d.hash FROM transfer x JOIN records s ON x.source_event=s.id JOIN records d ON x.destination_event=d.id')
id | source | destination | hash | hash
x1 | ws7 | ws8 | h7 | h7
5
show(db, 'SELECT id,kind,path,hash FROM records WHERE host="ws8" ORDER BY t')
id | kind | path | hash
e2 | file_write | C:/Share/report.txt | h7
e3 | process | C:/Tools/viewer.exe | h8
6
show(db, 'SELECT * FROM edges ORDER BY source')
source | target | evidence
e1 | e2 | x1
e2 | e3 | file-open record o1

演習完了