外部からの侵入と実行の証拠
固定の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・固定の調査記録
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
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
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
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
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
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
演習完了