【问题标题】:Running C program as root without password [duplicate]在没有密码的情况下以root身份运行C程序[重复]
【发布时间】:2018-05-09 03:50:42
【问题描述】:

我想用 C 编写程序,它会以 root 身份打开 bash,但没有任何用户的密码。

#include <unistd.h>
#include <stdio.h>

int main(void)
{
    char *argv[] = { "/bin/bash","-c","sudo /bin/bash",0 };
    execve(argv[0], &argv[0],0);
    return 0;
}

我的系统是 Linux Mint 18.2 Sonya,我设置了这两个命令

chown root:root a.out
chmod u=srwx,go=xr a.out

但当我尝试执行此操作时,它仍然要求输入密码。如果有其他选项,我不想编辑 /etc/sudoers。

【问题讨论】:

  • 允许以 root 身份运行程序而无需指定 root 的密码(并且无需通过 sudoers 或其他方式给予明确许可)听起来像是一个安全漏洞,你不觉得吗?跨度>
  • 是的,在某些特定情况下不是。在我们知道整个数字之前,我们可以判断吗? OP 必须被警告风险,或者解释一下整体情况。请注意,许多程序(尤其是守护进程)都有一个 setuid 位并以 root 身份运行,通常执行一些初始化,然后以普通用户身份执行 setuid()。
  • @DanielKamilKozar OP 可以将所有者设置为 root 并设置 SETUID。
  • 我意识到风险。这是我学习任务的一部分,不会在其他任何地方使用。

标签: c linux bash root linux-mint


【解决方案1】:

这是您正在制造的巨大安全漏洞。只要你意识到这一点。事实上,我不明白你为什么不想编辑 sudoers,但是对于一个仅仅运行它会创建一个 root shell 的程序是可以的。

话虽如此,程序如下:

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[], char *envp[]) {
  char *args[] = { "/bin/bash", NULL };
  execve(args[0], args, envp);

  perror("Running bash failed");
  return 1;
}

现在您所要做的就是编译它,将可执行文件的文件所有者设置为 root 并设置SUID 权限。

您的代码失败的原因是因为 SUID 设置了 有效 UID。真正的 UID 仍然是你,所以sudo 要求输入密码。

话虽如此,没有理由只以有效的 root 身份运行 shell,这就是上面的代码所做的。

此代码的一个缺点是它没有将真正的 UID 设置为 root,并且不执行登录。如果这对您来说是个问题,请保留您的原始程序,但在其开头添加:

setresuid(0, 0, 0);
setresgid(0, 0, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多