濫用 Linux SetUID 二進位檔案
濫用 Linux SetUID 二進位檔案
當使用者或系統自動腳本啟動時,會繼承其啟動腳本的 UID/GID:這稱為真實 UID/GID
試想一個問題,Linux 上所有的東西都可以視為物件 object,那使用者密碼以雜湊值形式儲存在 /etc/shadow 中的密碼,該檔案僅由 root (uid=0) 擁有和寫入。那當使用者修改密碼時,非特權使用者帳號是如何存取該檔案來更改自己的密碼呢?
為了解決這個問題,Linux 引入了有效 UID/GID,它代表執行敏感操作時檢查的實際值
首先透過一般使用者 joe 登入系統然後執行 passwd,這是修改密碼的指令
但我們執行後不要做任何動作與修改密碼就這樣放著他
開啟另外一個 Shell 輸入 ps u -C passwd 查看當下的近程如下圖,可以看到該進程是由 root 的權限執行的而不是 joe,另外可以看到 PID 是 1497
讓我們用 grep Uid /proc/1497/status 來查看分配給該進程的真實 UID 和有效 UID
四個 UID 分別表示真實、有效、保存集和檔案系統 UID 相對應的四個參數
由於是由 joe 所執行 passwd 所以真實 UID 為 1000 表示該帳號的 UID 沒有問題
但可以注意到有效、保存集和檔案系統 UID 都是 0,這表示是 root 的 UID
我們目前開了兩個 tty,查看 joe 的 bash Process 與確認 UID 如下
可以看到當查看 PID 1559 第二個 tty 的狀態時四個 UID 都是 1000 表示 joe
那為什麼 passwd 會出現 1000 0 0 0 呢,讓我看一下該檔案的權限
ls -asl /usr/bin/passwd,可以看到有一個 s,這表示 SetUID (Set-User-ID) 的意思
SUID 標誌在上面的輸出中以 s 標誌表示。可以使用 chmod u+s <filename> 指令來設定此標誌
並將正在執行的程序的有效 UID 設定為執行檔擁有者的使用者 ID
在上述的 /etc/passwd 中即為 root 使用者 ID
使用此技術會導致合法且受限的權限升級,因此(我們很快就會了解到),SUID 二進位檔案必須沒有錯誤,以避免應用程式的任何誤用與遭到濫用。 作為一個實際的例子,一旦我們完成手動或自動枚舉,我們會透過 find 程式尋找設定了 SUID 標誌且權限配置錯誤的檔案。
了解了上述的原理與說明,下面就是直接開始使用 find 來查找錯誤配置權限的物件了
我們可以透過執行 find 程式來搜尋任何已知檔案(例如 joe 的桌面資料夾)來快速利用此漏洞。一旦找到文件,就可以透過 -exec 參數指示 find 執行任何操作。在本例中,我們希望執行 bash shell 以及Setbuiltin -p 參數,以防止有效使用者被重設。
指令 find /home/joe/Desktop -exec "/usr/bin/bash" -p \;
可以參考此網站 https://gtfobins.github.io/gtfobins/find/
find -exec 執行 "/usr/bin/bash",參數 -p 是特權模式
執行後即獲得了 root shell,uid 仍是 joe 但是 euid 已經是 root
接著學習指令 /usr/sbin/getcap -r / 2>/dev/null 來查找 "使用能力 CAP" 與使用參數 -r
列出相關的 CAP
這兩個 perl 二進位檔案啟用了setuid 功能,以及指定這些功能有效且允許的 +ep 標誌
/usr/bin/perl = cap_setuid+ep
/usr/bin/perl5.28.1 = cap_setuid+ep
setuid 和 setuid+ep (+ep 是一種 flag),兩個是不同的
留言
張貼留言