一覧OP-10-2 · 初期侵入・実行の痕跡

外部からの侵入と実行の証拠

固定のHTTP記録と遠隔ログオン記録を検索します。HTTP 500、成功した認証、プロセス開始の意味を分け、初期侵入についてどこまで根拠を持って説明できるか学びます。

説明

Web要求の到着やエラー応答は、侵入の成功をそのまま示しません。認証の成功も、端末上の任意の処理が実行されたこととは別です。後段のアプリ処理やセッション内の活動を確認します。

固定のHTTP記録と遠隔ログオン記録を検索します。HTTP 500、成功した認証、プロセス開始の意味を分け、初期侵入についてどこまで根拠を持って説明できるか学びます。

1外部要求の応答を確認する

要求IDを後段ログとの対応に使います。

from oplab import * db=connect(10) show(db, 'SELECT外部要求の応答を確認する * FROM web ORDER BY t')

401、500、200が現れます。500はサーバー側の異常応答で、コード実行の成功を意味する値ではありません。

2アプリ内部の処理へ照合する

request_idが同じ記録を結合します。

show(db, 'SELECTアプリ内部の処理へ照合する w.id,w.status,s.id,s.action,s.result FROM web w LEFT JOIN server s USING(request_id) ORDER BY w.t')

w2にはhandler errorが対応しています。w1にはこの資料で対応するサーバー記録がなく、認証失敗の原因も追加確認が必要です。

3遠隔認証の成否を調べる

Web要求とは別の観測系列として、端末ごとのログオンを読みます。

show(db, 'SELECT遠隔認証の成否を調べる id,host,session,action,result FROM remote WHERE action="login" ORDER BY id')

ws7は成功、ws8は失敗です。同じ送信元IPでも、二つの端末で結果が違います。

4成功セッション内の活動を探す

端末とセッションを合わせ、認証後の活動を抽出します。

show(db, 'SELECT成功セッション内の活動を探す l.id AS login_event,p.id AS process_event,p.action FROM remote l JOIN remote p ON l.host=p.host AND l.session=p.session AND p.t>=l.t WHERE l.action="login" AND l.result="success" AND p.action LIKE "process %"')

r1にr2のwhoami.exe開始が対応します。成功したログオンだけより、実行開始の裏付けが具体的になります。

5IPだけで結んだ候補の多さを見る

同じIPという理由だけでWeb要求と遠隔活動を結ぶ場合を確認します。

show(db, 'SELECTIPだけで結んだ候補の多さを見る w.id,r.id FROM web w JOIN remote r ON w.src=r.src WHERE r.action="login" ORDER BY w.id,r.id')

w1、w2が両端末の認証へ結び付きます。共有IPや複数の活動があるため、これだけでWeb要求から遠隔実行へ至った経路とは言えません。

6実行の直接証拠を抽出する

観測した行動の範囲に絞って結果を残します。

show(db, 'SELECT実行の直接証拠を抽出する id,host,session,action,result FROM remote WHERE action LIKE "process %"')

実行開始の証拠はws7のr2です。攻撃の入口を確定するには認証方式、資格情報の来歴、Web側との直接の対応が追加で必要です。

まとめ

実行開始の証拠はws7のr2です。攻撃の入口を確定するには認証方式、資格情報の来歴、Web側との直接の対応が追加で必要です。

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

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

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

1
from oplab import * db=connect(10) show(db, 'SELECT * FROM web ORDER BY t')
id | t | request_id | path | status | src
w1 | 10 | r1 | /login | 401 | 192.0.2.9
w2 | 11 | r2 | /export | 500 | 192.0.2.9
w3 | 12 | r3 | /health | 200 | 192.0.2.8
2
show(db, 'SELECT w.id,w.status,s.id,s.action,s.result FROM web w LEFT JOIN server s USING(request_id) ORDER BY w.t')
id | status | id | action | result
w1 | 401 | NULL | NULL | NULL
w2 | 500 | s1 | handler error | exception
w3 | 200 | s2 | health check | ok
3
show(db, 'SELECT id,host,session,action,result FROM remote WHERE action="login" ORDER BY id')
id | host | session | action | result
r1 | ws7 | s7 | login | success
r3 | ws8 | s8 | login | failed
4
show(db, 'SELECT l.id AS login_event,p.id AS process_event,p.action FROM remote l JOIN remote p ON l.host=p.host AND l.session=p.session AND p.t>=l.t WHERE l.action="login" AND l.result="success" AND p.action LIKE "process %"')
login_event | process_event | action
r1 | r2 | process whoami.exe
5
show(db, 'SELECT w.id,r.id FROM web w JOIN remote r ON w.src=r.src WHERE r.action="login" ORDER BY w.id,r.id')
id | id
w1 | r1
w1 | r3
w2 | r1
w2 | r3
6
show(db, 'SELECT id,host,session,action,result FROM remote WHERE action LIKE "process %"')
id | host | session | action | result
r2 | ws7 | s7 | process whoami.exe | started

演習完了