gpt4 book ai didi

c++ - 如何在带有密码身份验证的 linux 中以 root 身份使用 C 或 C++ 运行没有 pam 的命令

转载 作者:行者123 更新时间:2023-12-05 04:38:23 29 4
gpt4 key购买 nike

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 权限,并赋予所有权归根

$ 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 超时它仍然可以在没有密码的情况下工作身份验证。

提前感谢您的回答

最佳答案

首先,基础知识:每个进程都有一个 userid 和一个 groupid(我将忽略其他 groupid 等补充属性)。

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

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

一个进程如何获得它的 userid 0 是无关紧要的。如果进程的 userid 为 0,则它是根进程,仅此而已。

当您完成设置 setuid 进程的 Action 时,setuid(0) 本身就完成了。你是一个根进程。而已。没什么可说的了。

setsuid() and getuid() documentation and it doesn't seem like there isanything about password authentication.

正确。他们所做的只是调整/更新用户标识。而已。仅此而已。

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 的情况,或 sudo 的配置中可接受的匹配项)。如果您不这样做,他们就会终止,不会采取进一步的行动。

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

关于c++ - 如何在带有密码身份验证的 linux 中以 root 身份使用 C 或 C++ 运行没有 pam 的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70615937/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com