抱歉,我不知道这是不是正确的地方。我很着急,时间紧迫。我在 Linux 机器上有一个具有以下属性的文件。(内核 2.6.26)
-rwxrwxrwx 1 root root 25 2015-06-01 08:08 /usr/bin/runme
我没有机器的 root 权限,也不知道 root 密码。是否可以以所有者身份运行此脚本。我在另一个文件中编写并编译了一些 c 代码,但没有成功。我使用的代码;
#include <unistd.h>
#include <errno.h>
int main(void) {
setuid(0);
system("/bin/bash /usr/bin/runme");
}
然后有人说用execve,但是结果没有改变。这是我使用execve时的代码;
#include <unistd.h>
#include <errno.h>
int main(void) {
extern char * const environ[];
char * const command[] = {"runme", NULL, NULL, NULL, NULL,NULL, NULL};
execve("/usr/bin/runme", command, environ);
}
答案1
这是有可能的,但你必须非常小心——你的脚本具有全局读写权限,这意味着任何人可以改变它,因此可以做到任何事物以 root 身份运行。
这是一个令人毛骨悚然的安全漏洞。如果你想获得一个普通的要以用户身份运行二进制文件,您需要使用setuid
向二进制文件添加标志chmod g+s
。您必须以 root 身份执行此操作,因为如果您不这样做,也会造成巨大的安全漏洞。
如果你想用脚本来做……这取决于脚本语言。有些(实际上 - 很多)脚本语言会因为其实现方式而无法工作 - 再次,存在安全风险。
我建议 root (原文如此) 去这里看看sudo
- 这是一个“超级用户操作”,并允许非特权用户以特权(或 root)帐户运行命令。然后 - 配置完成后 - 您可以:
sudo /path/to/script
尽管如此,我仍然不会让该脚本世界处于可写状态。这仍然是一个安全风险。
如果您没有 root 权限,没有 root 密码,也没有管理员访问权限...那么我建议您不要再尝试这样做,因为这可能是计算机滥用,并且根据您所在的地方可能是一种犯罪行为。
答案2
没有任何办法(不使用漏洞)可以以其他用户的身份运行脚本(或任何可执行文件),除非该用户在某个时候授予您该权限。
对于“真正的”可执行文件,可以使用 setuid 位来完成此操作,该文件所有者可以设置该位。对于脚本,现代环境通常会忽略 setuid 位,因此您需要某种包装器(自定义包装器或 sudo)。请参阅https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts了解更多详情。
您的具体案例很好地说明了 setuid 位的危险性。如果某个文件是所有人均可写入和执行的,则设置 setuid 位将允许您以文件所有者的身份执行任何命令。由于文件所有者实际上是 root,因此将此类文件的内容替换为 bash 的内容等将授予您 root shell。