利用c-linux setuid和系统命令

利用c-linux setuid和系统命令,c,linux,security,buffer-overflow,C,Linux,Security,Buffer Overflow,我有以下代码作为一个可执行文件,我想利用它作为一个课程,以便生成一个具有提升权限的shell。我是levelX的用户,可执行文件的setgid为levelX+1。我不允许修改任何代码。 由于我没有根权限,setguid(0)失败。我无法更改函数或主函数的返回地址。有人能指出正确的方向吗 int main (int argc, char** argv) { if (exec(argv[1]) != 0) { fprintf(stderr, "Cannot execute y

我有以下代码作为一个可执行文件,我想利用它作为一个课程,以便生成一个具有提升权限的shell。我是levelX的用户,可执行文件的setgid为levelX+1。我不允许修改任何代码。 由于我没有根权限,setguid(0)失败。我无法更改函数或主函数的返回地址。有人能指出正确的方向吗

int main (int argc, char** argv)
{
  if (exec(argv[1]) != 0)
    {
      fprintf(stderr, "Cannot execute your command\n");
      return -1;
    }
  return 0;
}

int exec(char *command)
{
  FILE *f = NULL;
  char entry[64];
  char line[256];

  f = fopen("log", "a");
  if (f == NULL)
    {
      fprintf(stderr, "Can't open file\n");
      return -1;
    }
  snprintf(entry, 64, "%d: %s\n", getuid(), command);

  fprintf(f, entry, NULL);
  fclose(f);

  f = fopen("sudoers", "r");
  if (f == NULL)
    {
      fprintf(stderr, "Can't open\n");
      return -1;
    }

  while(fgets(line, 256, f) != NULL)
    {
      if (atoi(line) == getuid())
        {
          if (setuid(0) == 0) {
            system(command);
          } else {
            fprintf(stderr, "check permissions\n");
          }

          fclose(f);
          return 0;
        }
    }
  fprintf(stderr, "Error\n");
  fclose(f);
  return -1;
}

从您发布的代码来看,似乎您应该将自己的
sudoers
文件写入您有写入权限的任何目录,然后在该目录中运行此程序,以便它读取您的文件

因此,只需将您自己的UID写入这个伪
sudoers
文件,然后给出一个命令参数,例如
bash
,以获得一个shell。不需要进行任何缓冲区溢出攻击

可能真正可利用的程序在文件权限中设置了suid位,因此它可以执行
setuid(0)
调用。我猜这个练习的目的是演示在处理suid程序时,如何对所有输入进行消毒,包括相对路径(有效地将当前工作目录作为输入)之类的内容,如任何用户提供的路径和其他输入



但是,由于程序只有setgid位(如注释中所述),因此您需要找到仅使用组id执行的操作。这可能是日志文件写入。您可以使用文件名
log
创建一个符号链接,指向您想要附加到的任何文件,该组对该文件具有写入权限。此外,该文件的格式必须确保日志行格式不会使文件损坏。记住,您可以将换行符等放入命令行参数中

毕竟,这是对
fprintf(f,entry,NULL)的格式字符串攻击
int exec(char*命令)
中,您可以用%n格式覆盖回信地址。

用适当的标题发布完整的代码。这看起来像是您对代码进行了部分清理/匿名化,还是尝试?请提供一个工作代码,您可以自己构建。例如,什么是
log\u条目
?两者都正确!编辑代码。它编译并运行LevelX和LevelX+1的确切含义是什么。在你的解释中,级别的作用是什么?在普通UNIX中,只有两个级别,用户和根级别,第一个级别受权限的约束,后者不受权限的约束。抱歉,不是n个级别。我指的是没有任何级别为root的不同级别。我确实使用guid创建了一个文件,并跳过了此检查。可利用的程序具有sgid:-rwxr-sr-x,但该文件的组不是rootAh,那么您需要一种方法在调用
setuid
之前使某些事情发生。。。提示:您的程序使用二进制组写入日志。。。那可能就是你应该利用的。太好了!谢谢如果您在查找可能被利用的文件时遇到困难,请签出
find
命令,它可以选择搜索具有特定组的文件。@不适用:因为程序不能按预期为任何人工作(除非可执行组是root),我猜想,人们寻求的解决方案比您想象的要简单得多:它可能只是
ln-s sudoers log&&/path/to/that/executable bash
,根据您自己控制的sudoers文件为您提供特权shell;即使它在默认情况下是特权的,将日志输出定向到sudoers也可以确保当前uid将列在那里。您可以询问讲师,可执行文件的组所有权是按设计的,还是只是疏忽。