在控制台中打印 /etc/shadow 文件

在控制台中打印 /etc/shadow 文件

如何更改可执行文件访问 /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

相关内容