如何让 shell 以 suid 方式执行

如何让 shell 以 suid 方式执行

我正在尝试使用 shell,但它不起作用。我需要帮助来了解原因以及如何修复它...

我正在按照以下步骤操作(以 root 身份)

cp /usr/bin/bash /usr/bin/bash-emergency
chmod 4755 /usr/bin/bash-emergency

bash-emergency 归 root 所有:root

我希望这应该以 root 身份执行 bash-emergence,从而产生一个 root shell

我知道不这样做的所有原因。这是在实验室中。为了进行此测试,su 和 sudo 不是一个选项。我需要用户能够获得 root shell,而无需在首次登录后进行身份验证或接受其他质询。

我希望能够使用简单的 suid 可执行文件来完成此操作,而不是将非 root 用户的 UID 更改为 0。

我究竟做错了什么?

答案1

您做错的是,您直接违反了旨在保护系统安全的安全措施。Bash、dash 和其他 shell 检测到它们正在以 setuid root 身份运行,并在启动时立即放弃特权。这是因为将它们设置为 suid root 是一种非常常见的特权提升策略。

幸运的是,有一个非常简单的解决方法。以 身份启动 suid shell /usr/bin/bash-emergency -p

来自文档的相关引用:

如果 shell 启动时的有效用户(组)id 不等于实际用户(组)id,并且未提供 -p 选项,则不会读取任何启动文件,不会从环境中继承 shell 函数,如果 SHELLOPTS、BASHOPTS、CDPATH 和 GLOBIGNORE 变量出现在环境中,则它们将被忽略,并且有效用户 id 设置为实际用户 id。如果在调用时提供了 -p 选项,则启动行为相同,但不会重置有效用户 id。

答案2

虽然 shell 程序故意不做你想做的事情,但你可以创建自己的程序来做。这是一个示例程序,它将检查你是否拥有 euid root,如果是,则以 uid root 身份运行特定命令。

用法类似于/usr/bin/emergency-backdoor /usr/bin/bash/usr/bin/emergency-backdoor "/usr/bin/vim /etc/passwd"等等。

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

int main(int argc, char **argv) { 
    if (argc != 2) { 
        puts("Usage: <this> \"command and args\"");
        return 1;
    } else if (geteuid() == 0) { 
        setuid(0);
        setgid(0);
        puts("Executing the following as root");
        puts(argv[1]);
        system(argv[1]);
    } else {
        puts("You do not have privs");
    }
    return 0;
}

相关内容