[英]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 超時后,它仍然可以在沒有密碼身份驗證的情況下工作。
感謝您提前回答
首先,基礎知識:每個進程都有一個用戶標識和一個組標識(我將忽略附加屬性,如附加組標識)。
用戶 ID 0 是根用戶。 就這樣,故事結束。
當您有一個用戶 ID 為 0 的進程時,它是一個根進程。 故事結局。
進程如何獲取其用戶 ID 0 無關緊要。 如果一個進程的用戶 ID 為 0,那么它就是一個根進程,僅此而已。
當您通過設置 setuid 進程的動作 go 時,即setuid(0)
本身,您就完成了。 你是一個根進程。 而已。 沒有什么可說的了。
setsuid() 和 getuid() 文檔,似乎沒有關於密碼身份驗證的任何內容。
正確的。 他們所做的只是調整/更新用戶 ID。 而已。 沒有什么了。
su
和sudo
進程執行以下操作:
$ 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
進程自己實現的。 除非您提供可接受的流程,否則它們將終止且不會采取進一步行動。 成功的身份驗證導致 shell 或執行的命令,但這是非常簡單的基本原因, su
和sudo
程序本身使用 setuid(權限位和系統調用)來獲取 root 權限,作為第一個命令商業。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.