题目:下列代码存在任意程序执行漏洞,用户level01需要提权到flag01
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
gid_t gid;
uid_t uid;
gid = getegid();
uid = geteuid();
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
system("/usr/bin/env echo and now what?");
首先看一下flag01这个程序的权限:find / --name flag01 2>dev/null
拥有者是flag01,并且设置了suid位,也就是说level01在执行时可以具有flag01的权限,但这个是暂时的,程序结束之后还会返回level01
程序使用了system函数执行指定的shell命令,system执行的/usr/bin/env命令,但是system的参数是固定的,也就是我们无法控制system的参数。但这里它执行了env,通过env找到echo程序,”and now what”是传递给echo的参数,所以只要控制echo函数的位置的内容和位置便可以永久获取一个shell,达到提权的目的。
/tmp目录对任何用户都是有完整的权限,即所有的用户都是rwx权限,查看:ls -al /tmp
所以,利用思路是:先把 /tmp 路径加入 $PATH 环境变量中,然后在 /tmp 目录下写入包含 system("/bin/bash"); 指令的文件,进行编译并将可执行文件命名为 echo,最后再执行 flag01 程序,该程序会先在 /tmp 目录下查找可用的 echo ,并且执行,即可得到flag01权限。
修改 $PATH :
![](https://i-blog.csdnimg.cn/blog_migrate/5131b6593389bb6cb62cb841b163c872.png)
getshell.c:
执行命令: gcc -o echo getshell.c,再执行 ./flag01 文件就可以得到shell