如何 运行 使用 C 或 C++ 以 root 身份执行命令,在 linux 中使用密码身份验证不使用 pam
How to run a command as root with C or C++ with no pam in linux with password authentication
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
- Sudo 来源:https://github.com/sudo-project/sudo/blob/main/src/sudo.c
提前感谢您的回答
首先,基础知识:每个进程都有一个 userid 和一个 groupid(我将忽略其他 groupid 等补充属性)。
用户 ID 0 是 root。到此为止,故事结束。
当您有一个用户标识为 0 的进程时,它就是根进程。故事结束。
进程如何获取其用户 ID 0 并不重要。如果一个进程的userid为0,那么它就是一个root进程,就是这样。
当您完成设置 setuid 进程的动作时,setuid(0)
s 本身就完成了。你是一个根进程。而已。没什么好说的了。
setsuid() and getuid() documentation and it doesn't seem like there is
anything about password authentication.
正确。他们所做的只是 adjust/update 用户 ID。而已。仅此而已。
su
和 sudo
进程执行以下操作:
- 它们是 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 程序的权限看起来与此相同,不是吗?
- 但在他们采取进一步行动之前,他们要求您提供可接受的密码(或以某种形式或方式满足其他一些标准,可接受的身份验证标准的具体细节是什么并不重要,密码在
su
的情况,或 sudo
的配置中可接受的匹配)。如果你不这样做,他们就会终止,不会发生进一步的行动。
所有涉及 PAM 或其他身份验证框架的密码验证逻辑均由 su
和 sudo
进程本身实现。除非您提供可接受的身份验证凭据(无论它对 su
或 sudo
意味着什么)它们都会终止,不会发生进一步的操作。成功的身份验证会导致 shell 或执行的命令,但这是因为 su
和 sudo
程序本身使用 setuid(权限位和系统call) 获取 root 权限,作为首要任务。
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
- Sudo 来源:https://github.com/sudo-project/sudo/blob/main/src/sudo.c
提前感谢您的回答
首先,基础知识:每个进程都有一个 userid 和一个 groupid(我将忽略其他 groupid 等补充属性)。
用户 ID 0 是 root。到此为止,故事结束。
当您有一个用户标识为 0 的进程时,它就是根进程。故事结束。
进程如何获取其用户 ID 0 并不重要。如果一个进程的userid为0,那么它就是一个root进程,就是这样。
当您完成设置 setuid 进程的动作时,setuid(0)
s 本身就完成了。你是一个根进程。而已。没什么好说的了。
setsuid() and getuid() documentation and it doesn't seem like there is anything about password authentication.
正确。他们所做的只是 adjust/update 用户 ID。而已。仅此而已。
su
和 sudo
进程执行以下操作:
- 它们是 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 程序的权限看起来与此相同,不是吗?
- 但在他们采取进一步行动之前,他们要求您提供可接受的密码(或以某种形式或方式满足其他一些标准,可接受的身份验证标准的具体细节是什么并不重要,密码在
su
的情况,或sudo
的配置中可接受的匹配)。如果你不这样做,他们就会终止,不会发生进一步的行动。
所有涉及 PAM 或其他身份验证框架的密码验证逻辑均由 su
和 sudo
进程本身实现。除非您提供可接受的身份验证凭据(无论它对 su
或 sudo
意味着什么)它们都会终止,不会发生进一步的操作。成功的身份验证会导致 shell 或执行的命令,但这是因为 su
和 sudo
程序本身使用 setuid(权限位和系统call) 获取 root 权限,作为首要任务。