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

資格情報へのアクセスと実行権限

lsass.exeへの固定アクセス記録とプロセス生成時のトークン情報を照合します。別プロセスの権限を同一プロセスの昇格と誤解しないよう、プロセスIDの対応を確認します。

説明

資格情報を扱うプロセスへのアクセスは、要求、許可、読取り、保存などの段階を分けて評価します。アクセスが許可された記録だけで、資格情報が取得されたことまで確定するわけではありません。

lsass.exeへの固定アクセス記録とプロセス生成時のトークン情報を照合します。別プロセスの権限を同一プロセスの昇格と誤解しないよう、プロセスIDの対応を確認します。

1アクセス要求と結果を読む

requestedは要求した権限、resultは取得結果を要約した列です。

from oplab import * db=connect(11) show(db, 'SELECTアクセス要求と結果を読む * FROM access ORDER BY t')

a1は拒否、a2は許可です。対象プロセス名が同じというだけで、両方を読取り成功と扱ってはいけません。

2実行時のトークンを確認する

userとintegrityはプロセス生成時に観測した情報です。

show(db, 'SELECT実行時のトークンを確認する * FROM tokens ORDER BY t')

p7はaliceのmedium、p8はSYSTEMです。異なるプロセスなので、これをそのままp7の昇格前後とは読めません。

3アクセス元の実体へ結び付ける

端末とプロセス識別子を合わせます。processはこの固定資料で一意なプロセス識別子です。

show(db, 'SELECTアクセス元の実体へ結び付ける a.id,a.process,t.user,t.integrity,a.result FROM access a JOIN tokens t ON a.host=t.host AND a.process=t.process ORDER BY a.id')

拒否されたp7と許可されたp8の実行主体が分かります。権限の違いと結果の違いは観測できますが、因果の全条件までは記録されていません。

4許可されたアクセスを絞る

追加調査対象を、アクセス許可のあった記録に絞ります。

show(db, 'SELECT許可されたアクセスを絞る id,process,target,requested FROM access WHERE result="granted"')

a2はVM_READの許可です。実際に何バイト読み、どこへ保存したかの記録は、この表にはありません。

5同一プロセスの権限変化があるか検索する

同じプロセスの複数トークン記録があるか集計します。

show(db, 'SELECT同一プロセスの権限変化があるか検索する host,process,COUNT(DISTINCT user) AS users,COUNT(DISTINCT integrity) AS levels FROM tokens GROUP BY host,process')

どちらも1種類です。この資料から確認できるのは別々の権限で始まったプロセスであり、昇格手順そのものではありません。

6証拠の範囲をまとめる

許可記録と、その時点以前のプロセス生成証拠を並べます。

show(db, 'SELECT証拠の範囲をまとめる a.id,t.id,t.evidence,a.requested,a.result FROM access a JOIN tokens t ON a.host=t.host AND a.process=t.process AND t.t<=a.t WHERE a.result="granted"')

a2とt2が根拠です。資格情報取得を調べるには読取り、出力ファイル、後続の認証利用など別の証拠が必要です。

まとめ

a2とt2が根拠です。資格情報取得を調べるには読取り、出力ファイル、後続の認証利用など別の証拠が必要です。

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

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

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

1
from oplab import * db=connect(11) show(db, 'SELECT * FROM access ORDER BY t')
id | t | host | process | target | requested | result
a1 | 10 | ws7 | p7 | lsass.exe | VM_READ | denied
a2 | 12 | ws7 | p8 | lsass.exe | VM_READ | granted
2
show(db, 'SELECT * FROM tokens ORDER BY t')
id | t | host | process | user | integrity | evidence
t1 | 9 | ws7 | p7 | alice | medium | process creation
t2 | 11 | ws7 | p8 | SYSTEM | system | process creation
3
show(db, 'SELECT a.id,a.process,t.user,t.integrity,a.result FROM access a JOIN tokens t ON a.host=t.host AND a.process=t.process ORDER BY a.id')
id | process | user | integrity | result
a1 | p7 | alice | medium | denied
a2 | p8 | SYSTEM | system | granted
4
show(db, 'SELECT id,process,target,requested FROM access WHERE result="granted"')
id | process | target | requested
a2 | p8 | lsass.exe | VM_READ
5
show(db, 'SELECT host,process,COUNT(DISTINCT user) AS users,COUNT(DISTINCT integrity) AS levels FROM tokens GROUP BY host,process')
host | process | users | levels
ws7 | p7 | 1 | 1
ws7 | p8 | 1 | 1
6
show(db, 'SELECT a.id,t.id,t.evidence,a.requested,a.result FROM access a JOIN tokens t ON a.host=t.host AND a.process=t.process AND t.t<=a.t WHERE a.result="granted"')
id | id | evidence | requested | result
a2 | t2 | process creation | VM_READ | granted

演習完了