濫用 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),兩個是不同的
為了利用此功能錯誤配置,我們可以檢查GTFOBins 網站 https://gtfobins.github.io/
到該網站搜尋上述指令 perl



點進去後如下教我們如何利用




接著執行指令 perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'

執行後就拿到 root shell 了





留言

這個網誌中的熱門文章

Challenge 0 - Secura(2)

Challenge 0 - Secura(1)

Challenge 8 - Poseidon(0)