我正在尝试使用 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;
}