2017-11-25 265 views
-1

我想用C编写程序,它将以root用户身份打开bash,但对于任何用户都没有密码。以root用户身份运行C程序,无密码

#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索尼娅,和我设置把这两个命令

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

但仍当我尝试执行此,它要求的密码。如果还有其他选项,我不想编辑/ etc/sudoers。

+3

允许以root用户身份运行程序,而不必指定root的密码(并且没有通过sudoers或其他方式给出明确的许可),听起来就像是一个安全漏洞,你不觉得吗? –

+0

在某些特定情况下,它不是。我们可以判断,直到我们知道整个数字? OP *必须*警告风险,或者解释整个情况。请注意,许多程序(尤其是守护进程)都有一个setuid位,并以root用户身份运行,通常用于执行一些初始化,然后以普通用户的身份执行setuid()。 –

+0

@DanielKamilKozar OP有能力将所有者设置为root并设置“SETUID”。 – iBug

回答

0

这是一个巨大的安全漏洞,你正在创建。只要你意识到这一点。事实上,我无法理解你为什么不想编辑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要求输入密码。

这样说,没有理由只运行shell作为有效的根,这是上面的代码。

这个代码的一个缺点是,它不设置实际UID为root,并在不执行日志如果这是你的一个问题,保留原来的计划,但在其开始添加:

setresuid(0, 0, 0); 
setresgid(0, 0, 0); 
相关问题