利用c-linux setuid和系统命令
我有以下代码作为一个可执行文件,我想利用它作为一个课程,以便生成一个具有提升权限的shell。我是levelX的用户,可执行文件的setgid为levelX+1。我不允许修改任何代码。 由于我没有根权限,setguid(0)失败。我无法更改函数或主函数的返回地址。有人能指出正确的方向吗利用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
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将列在那里。您可以询问讲师,可执行文件的组所有权是按设计的,还是只是疏忽。