リモート認証と横展開の追跡
ws7からws8へのチケット、ログオン、共有書込み、サービス登録、プロセス開始を追います。Kerberosの利用そのものを悪用の証拠とせず、経路ごとの観測を対応付けます。
説明
遠隔のサービス起動を調べるときは、認証したアカウントと、起動したサービスの実行アカウントが異なる場合があります。ログオンIDもそのまま引き継がれるとは限りません。
ws7からws8へのチケット、ログオン、共有書込み、サービス登録、プロセス開始を追います。Kerberosの利用そのものを悪用の証拠とせず、経路ごとの観測を対応付けます。
1端末間の活動を並べる
kindで記録の種類を確認します。
from oplab import *
db=connect(11)
show(db, 'SELECT端末間の活動を並べる * FROM remote ORDER BY t')チケット、ログオン、共有、登録、実行が順に現れます。順序だけでなく識別子がつながる箇所を調べます。
2認証先と方式を確認する
チケット発行と接続先の成功記録を別に読みます。
show(db, 'SELECT認証先と方式を確認する id,kind,account,detail FROM remote WHERE kind IN ("ticket","logon") ORDER BY t')チケットのサービスはcifs/ws8、ログオンはKerberosの種別3です。記録された方式だけでチケットの不正取得を証明することはできません。
3同じログオン内の共有と登録を探す
接続先とログオンIDを合わせます。
show(db, 'SELECT同じログオン内の共有と登録を探す id,kind,detail FROM remote WHERE dst="ws8" AND logon="0x91" ORDER BY t')r2、r3、r4が同じログオンに対応します。共有への書込みとサービス登録が同じ認証セッション内で観測されています。
4起動したプロセスの主体を見る
サービス実行は別のログオンIDになっている点に注目します。
show(db, 'SELECT起動したプロセスの主体を見る id,logon,account,detail FROM remote WHERE kind="process"')r5はSYSTEMの0x92です。認証したCORP/aliceと、サービスの実行主体を混同しないようにします。
5認証主体で絞ると落ちる記録を確認する
調査条件をアカウントだけにすると何が残るか調べます。
show(db, 'SELECT認証主体で絞ると落ちる記録を確認する id,kind FROM remote WHERE account="CORP/alice" ORDER BY t')r5が消えます。実行経路の調査では、主体だけでなくサービス名、パス、親プロセスなどへ検索を広げる必要があります。
6登録と実行を別の根拠として残す
r4とr5は候補となる連続した記録です。サービス設定の実行パスが未収集である点を残します。
show(db, 'SELECT登録と実行を別の根拠として残す id,t,kind,detail FROM remote WHERE kind IN ("service","process") ORDER BY t')登録と実行は観測していますが、ReportSvcの実行パスとの直接照合は未完了です。時刻の近さだけで一意に結ばず、設定情報を追加取得します。
まとめ
登録と実行は観測していますが、ReportSvcの実行パスとの直接照合は未完了です。時刻の近さだけで一意に結ばず、設定情報を追加取得します。
表示された証拠IDと検索条件を残すと、調査結果を元の記録までたどれます。
操作履歴と解説を振り返れます。
Python 3.15 / SQLite・固定の調査記録
from oplab import *
db=connect(11)
show(db, 'SELECT * FROM remote ORDER BY t')id | t | src | dst | kind | logon | account | detail r1 | 20 | ws7 | ws8 | ticket | NULL | CORP/alice | cifs/ws8 r2 | 22 | ws7 | ws8 | logon | 0x91 | CORP/alice | Kerberos type=3 r3 | 23 | ws7 | ws8 | share | 0x91 | CORP/alice | ADMIN$/report.exe write r4 | 25 | ws7 | ws8 | service | 0x91 | CORP/alice | ReportSvc created r5 | 26 | ws8 | ws8 | process | 0x92 | SYSTEM | services.exe -> report.exe
show(db, 'SELECT id,kind,account,detail FROM remote WHERE kind IN ("ticket","logon") ORDER BY t')id | kind | account | detail r1 | ticket | CORP/alice | cifs/ws8
show(db, 'SELECT id,kind,detail FROM remote WHERE dst="ws8" AND logon="0x91" ORDER BY t')id | kind | detail r2 | logon | Kerberos type=3 r3 | share | ADMIN$/report.exe write r4 | service | ReportSvc created
show(db, 'SELECT id,logon,account,detail FROM remote WHERE kind="process"')id | logon | account | detail r5 | 0x92 | SYSTEM | services.exe -> report.exe
show(db, 'SELECT id,kind FROM remote WHERE account="CORP/alice" ORDER BY t')id | kind r1 | ticket r2 | logon r3 | share r4 | service
show(db, 'SELECT id,t,kind,detail FROM remote WHERE kind IN ("service","process") ORDER BY t')id | t | kind | detail r4 | 25 | service | ReportSvc created r5 | 26 | process | services.exe -> report.exe
演習完了