拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何使用C或C 以root身份运行命令,而在linux中没有pam并使用密码身份验证

如何使用C或C 以root身份运行命令,而在linux中没有pam并使用密码身份验证

白鹭 - 2022-01-23 2088 0 0

TL;DR 例如 su 或 sudo 如何在没有 PAM 的情况下作业?

你好,

我想玩 suid 之类的东西,我已经得到了 SUID 部分和 SUID 位之类的东西,但问题是它没有要求我输入密码,因为我希望它询问密码并找到 su 和 sudo源代码混乱我很困惑。

我查看了 setsuid() 和 getuid() 档案,似乎没有关于密码身份验证的任何内容。

如何在没有 PAM 的情况下实作密码身份验证,我使用没有 PAM 的 sudo,它作业正常,su 和 pam,两者都作业正常,我很困惑如何让它作业

这个 C 代码就是我现在所拥有的:

// a.cc //

#include <iostream>
#include <unistd.h>
#include <cerrno>
#include <cstring>

int main(int argc, char *argv[]) {
    uid_t user = getuid();
    if (setuid(0) == -1) {
        std::cerr << strerror(errno) << '\n';
        return 1;
    }

    system(argv[1]);

    if (setuid(user) == -1) {
        std::cerr << errno << '\n';
        return 1;
    }
    return 0;
}

并在使用例如 GCC 和名为 a.cc 的档案进行编译后:

$ g   a.cc -o a

并赋予它执行和SUID权限并将所有权授予root

$ sudo chown root:root ./a
$ sudo chmod 4555 ./a

它只是作业,但没有密码验证

$ ./a id

uid=0(root) gid=1000(ari) groups=1000(ari),5(tty),10(wheel),27(video),78(kvm),250(portage)

(ari 是我的用户)

即使在注销或运行sudo -k以结束 sudo 超时后,它仍然可以在没有密码身份验证的情况下作业。

  • 苏源:https : //github.com/shadow-maint/shadow/blob/master/src/su.c
  • 须藤源:https : //github.com/sudo-project/sudo/blob/main/src/sudo.c

感谢您提前回答

uj5u.com热心网友回复:

首先,基础知识:每个行程都有一个用户标识和一个组标识(我将忽略附加属性,如附加组标识)。

用户 ID 0 是根用户。就这样,故事结束。

当您有一个用户 ID 为 0 的行程时,它是一个根行程。故事结局。

行程如何获取其用户 ID 0 无关紧要。如果一个行程的用户 ID 为 0,那么它就是一个根行程,仅此而已。

当您完成设定 setuid 行程的动作时,这setuid(0)就是它本身,您就完成了。你是一个根行程。而已。没有什么可说的了。

setsuid() 和 getuid() 档案,似乎没有关于密码身份验证的任何内容。

正确的。他们所做的只是调整/更新用户 ID。而已。没有什么了。

susudo流程执行以下操作:

  1. 它们是 setuid 可执行档案。
$ ls -al /bin/su /bin/sudo
-rwsr-xr-x. 1 root root  57504 Aug 17 04:59 /bin/su
---s--x--x. 1 root root 185440 Aug  7 13:17 /bin/sudo

你觉得这很熟悉吗?您手工制作的 setuid 程序的权限看起来与此相同,不是吗?

  1. 但在他们走得更远之前,他们会要求您提供可接受的密码(或以某种形式或方式满足某些其他标准,可接受的身份验证标准的确切细节是什么并不重要,在su's case 中是密码,还是sudo的配置中可接受的匹配)。如果你不这样做,他们将终止,不会采取进一步的行动。

所有涉及 PAM 或其他身份验证框架的密码验证逻辑都是由susudo行程自己实作的。除非您提供可接受的身份验证凭据(无论对su意味着什么sudo否则它们将终止,不会发生进一步的操作。成功的身份验证会产生一个 shell 或一个执行的命令,但这是因为susudo程序本身使用 setuid(权限位和系统呼叫)来获取 root 权限,这是首要任务。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *