3

在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成为一个有点“特殊”的目录有关?

感谢您对这个冗长的问题感兴趣!

4

1 回答 1

3

如果使用该nosuid选项挂载文件系统,则在执行位于该处的文件时将忽略 suid 位。据我了解,/tmp通常是一个单独的文件系统(通常tmpfs)与该nosuid选项一起安装。/tmp此配置的动机是防止受感染的帐户除了(例如)之外没有可写存储空间nobody,无法生成 suid 二进制文件,这些二进制文件可用于某些精心设计的多步攻击以提升权限。

于 2014-07-16T21:15:16.417 回答