在Linux系统中,setuid程序所在目录的权限是否会影响内核启动进程的方式?我问的原因是,当我在两个不同的目录中编译相同的 setuid 程序时,它实际上只假定了一个目录中的用户权限。我在其中编译了它/tmp
,我试图访问的用户帐户在/home/flag03
哪里。flag03
从/tmp
它执行时并没有按预期提升权限,但它在/home
.
关于这个问题的一些背景:
我正在开发exploit-exercises.com/nebula的第03 级。该练习要求您获得对flag03
用户帐户的访问权限。设置该练习,以便flag03
用户定期运行 cronjob,这将允许您在特定目录中执行脚本。我的计划是编写一个简单的 bash 脚本,该脚本将编译一个 setuid 程序,该程序本身会启动一个 bash shell,然后将 setuid 位设置为chmod +s
. 这个想法是,当 setuid 程序被编译时,它是由用户flag03
通过 cronjob 编译的。一旦执行了这个新编译的程序,它将以 user 身份启动一个 shell flag03
,这就是目标。
这是简单的 setuid 程序(l3.c,基于级别 1 + 2):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char **argv, char **envp)
{
uid_t uid;
gid_t gid;
uid = geteuid();
gid = getegid();
setresuid(uid,uid,uid);
setresgid(gid,gid,gid);
printf("uid: %d\n", getuid());
printf("gid: %d\n", getgid());
system("/bin/bash");
return 0;
}
为了使其工作,bash 脚本以用户身份编译程序flag03
,然后对 setuid 位进行 chmods。
#!/bin/bash
#gcc -o /tmp/l3 /tmp/l3.c
#chmod +s,a+rwx /tmp/l3
gcc -o /home/flag03/l3 /tmp/l3.c
chmod +s,a+rwx /home/flag03/l3
生成的可执行文件/tmp
没有按预期提升权限,但生成的可执行文件按/home/flag03
预期工作。
注意/tmp
我刚刚创建了一个新的 bash 脚本来移动编译到的 setuid 程序的版本,/home/flag03
然后重置 setuid 位。从那里执行时,该版本也可以正常工作。因此,在我看来,setuid 程序所在目录的权限会对进程的启动方式产生某种影响。也许这与/tmp
成为一个有点“特殊”的目录有关?
感谢您对这个冗长的问题感兴趣!