一覧OP-11-3 · 永続化・権限利用・横展開の痕跡

リモート認証と横展開の追跡

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

1
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
2
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
3
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
4
show(db, 'SELECT id,logon,account,detail FROM remote WHERE kind="process"')
id | logon | account | detail
r5 | 0x92 | SYSTEM | services.exe -> report.exe
5
show(db, 'SELECT id,kind FROM remote WHERE account="CORP/alice" ORDER BY t')
id | kind
r1 | ticket
r2 | logon
r3 | share
r4 | service
6
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

演習完了