簡體   English   中英

如何使用 C 或 C++ 以 root 身份運行命令,linux 中沒有密碼驗證

[英]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。 而已。 沒有什么了。

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. 但是在他們進一步 go 之前,他們要求您提供可接受的密碼(或以某種形式或方式滿足某些其他標准,可接受的身份驗證標准的確切細節是什么並不重要,在su的情況下是密碼,或者sudo的配置中可接受的匹配)。 如果你不這樣做,他們將終止,不會采取進一步的行動。

所有涉及 PAM 或其他身份驗證框架的密碼驗證邏輯都是由susudo進程自己實現的。 除非您提供可接受的流程,否則它們將終止且不會采取進一步行動。 成功的身份驗證導致 shell 或執行的命令,但這是非常簡單的基本原因, susudo程序本身使用 setuid(權限位和系統調用)來獲取 root 權限,作為第一個命令商業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM