很抱歉,我不知道這是正確的地方。我很著急,與時間賽跑。我在 Linux 機器上有一個具有以下屬性的檔案。 (內核2.6.26)
-rwxrwxrwx 1 root root 25 2015-06-01 08:08 /usr/bin/runme
我在機器上沒有 root 權限,也不知道 root 密碼。是否可以以所有者身分執行此腳本。我已經在不同的檔案中編寫並編譯了一些 C 程式碼,但它不起作用。我使用過的程式碼;
#include <unistd.h>
#include <errno.h>
int main(void) {
setuid(0);
system("/bin/bash /usr/bin/runme");
}
然後有人說使用execve,但結果沒有改變。這是我使用 execve 時的程式碼;
#include <unistd.h>
#include <errno.h>
int main(void) {
extern char * const environ[];
char * const command[] = {"runme", NULL, NULL, NULL, NULL,NULL, NULL};
execve("/usr/bin/runme", command, environ);
}
答案1
這是可能的,但你必須非常小心 - 你的腳本具有全域讀寫權限,這意味著任何人可以改變它,因此可以做任何事物作為根。
這是一個令人毛骨悚然的安全漏洞。如果你想獲得一個普通的若要以使用者身分執行二進位文件,您需要使用 將該setuid
標誌新增至二進位檔案chmod g+s
。您必須以 root 身分執行此操作,因為如果您不這樣做,也會開啟一個巨大的安全漏洞。
如果您想使用腳本...這取決於腳本語言。有些(實際上是很多)會因為它們的實施方式而拒絕工作,這又是安全風險。
我建議 root (原文如此)到這裡來看看sudo
- 這是一個“超級用戶做的事”,並允許非特權用戶作為特權(或 root)帳戶運行命令。然後 - 一旦配置 - 您可以:
sudo /path/to/script
儘管如此,我仍然不會讓腳本世界保持可寫狀態。這仍然是一個安全風險。
如果您沒有root,沒有root 密碼,也沒有管理員存取權限...那麼我建議這是因為它不是您的系統,並且您停止嘗試這樣做,因為這可能是電腦濫用,並且可能是犯罪行為,取決於在哪裡你住在。
答案2
除非該使用者在某個時刻授予您該權利,否則無法(不使用漏洞)以其他使用者身分執行腳本(或任何可執行檔)。
對於「真正的」可執行文件,可以使用 setuid 位元來完成,該位元可以由文件擁有者設定。對於腳本,現代環境通常會忽略 setuid 位,因此您需要某種包裝器(自訂包裝器或 sudo)。看https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts了解更多詳情。
您的具體案例是 setuid 位元如何危險的一個很好的例子。在全域可寫入且可執行的檔案上設定 setuid 位元將允許您以檔案擁有者的身分執行任何命令。由於文件所有者實際上是 root,因此將此類文件的內容替換為 bash 等內容將授予您 root shell。