大学で「クラウドセキュリティ」の講義をしていて、現在仮想マシンのイントロスペクションのプロジェクトをやっています。
私の演習の目標は、あるプロセスの特権をroot特権に昇格させることでした。これは、volatilityおよび-を使用して、init
からstruct cred
へのポインターを「借用」することで達成しました。 libvmi。基本的には一部のルートキットと同じですが、あるVMから別のルートキットへ。保護されたメモリへの書き込みを繰り返し試行するプロセスの特権を昇格させることで、このメソッドの効果を証明できます。そのように:
#!/bin/bash
while true
do
echo 1 >> /etc/test
id
sleep 2
done
これにより、次の出力が生成されます(特権が変更されたとき)。
# last time permission is denied
./test.sh: line 3: /etc/test: Permission denied
uid=1000(tester) gid=1000(tester)groups=1000(tester),24(cdrom),
25(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev),
111(scanner),115(bluetooth)
# tada, magic
# now I'm root
uid=0(root) gid=0(root) groups=0(root)
したがって、いくつかのプロセス(上記の例ではbash
)にroot権限があることを証明できます。しかし、ps u
を使用して、または/proc/$PID
を介して直接プロセスを見ると、UID
とGID
は変更されていないようです。
ps -A u | grep 2368
の出力:
前:
# ...
tester 2368 0.0 0.9 23556 4552 pts/2 S+ 22:24 0:00 -bash
後:
# ...
tester 2368 0.0 0.9 23556 4552 pts/2 S+ 22:24 0:00 -bash
ここでは何も変わっていません。
また、/proc/$PID/status
は変更されていません:
~# cat /proc/2368/status | grep Uid
Uid: 1000 1000 1000 1000
~# cat /proc/2368/status | grep Gid
Gid: 1000 1000 1000 1000
それで、あなたは説明できますか、なぜそこでは変わらない、そしてどこでその情報はプロセスのstruct cred
から取得されていないのに、そこから来たのです。明らかに変更されました。
タスクには構造体の資格がありません。彼らはtwostruct cred'sを持っています:
* A task has two security pointers. task->real_cred points to the objective
* context that defines that task's actual details. The objective part of this
* context is used whenever that task is acted upon.
*
* task->cred points to the subjective context that defines the details of how
* that task is going to act upon another object. This may be overridden
* temporarily to point to another security context, but normally points to the
* same context as task->real_cred.
どれをチェックしましたか/proc
が表示されますが、おそらく推測できます:-P。
( https://elixir.bootlin.com を使用してfs/proc /を参照してください。procfsの「ステータス」ファイルはfs/proc/base.cで定義されています。)