如何更改可执行文件访问 /etc/shadow 文件的权限?
到目前为止,我有以下 bash 脚本:
#!/bin/bash
gcc print.c -o print
chmod +s print
./print
exit 0
以及以下 c 代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *open = fopen("/etc/shadow", "r");
int tmp;
do {
tmp = fgetc (open);
printf("%c", tmp);
} while (tmp != EOF);
fclose(open);
return 0;
}
我可以轻松打印该/etc/passwd
文件,但一旦尝试访问该/etc/shadow
文件,就会得到转储的核心。
答案1
要授予二进制文件以 root 身份运行的权限,您需要在二进制文件上设置“粘滞位”。
通常编译后你可能会看到:
# ls -l print
-rwxr-xr-x 1 mark mark 111 24 Oct 17:32 print
设置 set-uid(粘性)位可以使用八进制模式或象征性地完成(请注意,您将需要“root”权限才能更改文件的所有权):
# chown root print
# chmod o-x print
# chmod u+s print
# ls -l print
-rwsr-xr-- 1 root mark 111 24 Oct 17:32 print
在第一个版本中,s
正如您已经弄清楚的那样,权限中的 表示这既是可执行的又是“set-uid”。但是您还必须更改文件的所有权,以便“set-uid”设置根而不是您自己的用户。此时,“组”的值尚未改变,但这在本例中并不重要。 (尽管这可能是安全因素。)
上面的最后一行显示的权限也可以表示为八进制数,因此如果这是您想要的结果,那么您可以将chmod
上面的两行替换为一行:
# chmod 4754 print
请查看手册页以chmod
获取更多详细信息。
如果这不是您想要的,请在问题中澄清您的要求。
重要的提示:该/etc/shadow
文件出于某种原因而保密。如果您将其公开给其他用户可以运行的东西,则可能会危及系统的安全性。删除世界可执行权限是对安全性的“认可”,但如果您觉得需要以/etc/shadow
这种方式公开,你可能解决了错误的问题。
答案2
无需 root 也可以,但您应该为您的程序设置 SUID。有两种方法可以做到这一点,无论如何都是完全相同的。
chmod u+s [program]
chmod 4755 [program]
您可能想看看设置用户ID
另外,如果你想在 C 中处理这个问题:
你应该检查一下setuid函数
如果你想在 bash 中执行此操作:
你应该检查一下shell 脚本上的 setuid