gpt4 book ai didi

c - 利用c-linux setuid和系统命令

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:39 24 4
gpt4 key购买 nike

我有以下代码作为可执行文件,我想在类(class)中利用它来生成具有提升权限的 shell。我是 levelX 的用户,可执行文件的 setgid 为 levelX+1。我不允许更改任何代码。由于我没有 root 权限,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 的符号链接(symbolic link),指向您想要附加到的任何文件,该组对其具有写入权限。此外,该文件需要具有这样的格式,即日志行格式不会使文件损坏。请记住,您可以将换行符等放入命令行参数中!

关于c - 利用c-linux setuid和系统命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53430763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com