2017-11-25 158 views
-1

我想用C編寫程序,它將以root用戶身份打開bash,但對於任何用戶都沒有密碼。以root用戶身份運行C程序,無密碼

#include <unistd.h> 
#include <stdio.h> 

int main(void) 
{ 
    char *argv[] = { "/bin/bash","-c","sudo /bin/bash",0 }; 
    execve(argv[0], &argv[0],0); 
    return 0; 
} 

我的系統是Linux Mint的18.2索尼婭,和我設置把這兩個命令

chown root:root a.out 
chmod u=srwx,go=xr a.out 

但仍當我嘗試執行此,它要求的密碼。如果還有其他選項,我不想編輯/ etc/sudoers。

+3

允許以root用戶身份運行程序,而不必指定root的密碼(並且沒有通過sudoers或其他方式給出明確的許可),聽起來就像是一個安全漏洞,你不覺得嗎? –

+0

在某些特定情況下,它不是。我們可以判斷,直到我們知道整個數字? OP *必須*警告風險,或者解釋整個情況。請注意,許多程序(尤其是守護進程)都有一個setuid位,並以root用戶身份運行,通常用於執行一些初始化,然後以普通用戶的身份執行setuid()。 –

+0

@DanielKamilKozar OP有能力將所有者設置爲root並設置「SETUID」。 – iBug

回答

0

這是一個巨大的安全漏洞,你正在創建。只要你意識到這一點。事實上,我無法理解你爲什麼不想編輯sudoers,但是如果只有一個運行它的程序創建一個root shell,那麼就沒問題。

隨着中說,這裏是程序:

#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char *argv[], char *envp[]) { 
    char *args[] = { "/bin/bash", NULL }; 
    execve(args[0], args, envp); 

    perror("Running bash failed"); 
    return 1; 
} 

現在,所有你需要做的就是編譯它,可執行文件的文件所有者設置爲root,並設置SUID權限。

代碼失敗的原因是因爲SUID設置了有效的 UID。真正的UID仍然是你,所以sudo要求輸入密碼。

這樣說,沒有理由只運行shell作爲有效的根,這是上面的代碼。

這個代碼的一個缺點是,它不設置實際UID爲root,並在不執行日誌如果這是你的一個問題,保留原來的計劃,但在其開始添加:

setresuid(0, 0, 0); 
setresgid(0, 0, 0); 
相關問題