特權升級是一段旅程。沒有靈丹妙藥,很大程度上取決於目標系統的具體配置。核心版本、已安裝的應用程式、支援的程式語言、其他使用者的密碼是影響您通往 root shell 之路的幾個關鍵因素
什麼是特權升級?
其核心是,特權升級通常涉及從許可權較低的帳戶到許可權較高的帳戶。從技術上講,它是利用作業系統或應用程式中的漏洞、設計缺陷或配置疏忽來獲得對通常限制使用者訪問的資源的未授權訪問。
它為什麼如此重要?
在執行真實世界的滲透測試時,很少能夠獲得立足點(初始訪問許可權),從而為您提供直接的管理訪問許可權。特權升級至關重要,因為它可以讓您獲得系統管理員級別的訪問許可權,從而允許您執行以下操作:
- 重置密碼
- 繞過訪問控制以破壞受保護的資料
- 編輯軟體配置
- 啟用永續性
- 更改現有(或新)使用者的許可權
- 執行任何管理命令
列舉
一旦您獲得對任何系統的訪問許可權,列舉是您必須採取的第一步。您可能已經透過利用導致根級別訪問的嚴重漏洞訪問了系統,或者只是找到了一種使用低特權帳戶傳送命令的方法。與 CTF 機器不同,滲透測試活動不會在您獲得對特定系統或使用者許可權級別的訪問許可權後結束。正如您將看到的,列舉在妥協後階段和之前一樣重要
hostname
該hostname
命令將返回目標機器的主機名。儘管此值可以很容易地更改或具有相對無意義的字串(例如 Ubuntu-3487340239),但在某些情況下,它可以提供有關目標系統在公司網路中的角色的資訊(例如用於生產 SQL 伺服器的 SQL-PROD-01)
uname -a
將列印系統資訊,為我們提供有關係統使用的核心的更多詳細資訊。這在搜尋任何可能導致特權升級的潛在核心漏洞時非常有用
/proc/version
proc 檔案系統(procfs)
提供有關目標系統程式的資訊。您會在許多不同的 Linux 風格上找到 proc
,這使它成為您武器庫中必不可少的工具。
檢視/proc/version
可能會為您提供有關核心版本和其他資料的資訊,例如是否安裝了編譯器(例如 GCC)
/etc/issue
也可以透過檢視/etc/issue檔案來識別系統。該檔案通常包含有關作業系統的一些資訊,但可以很容易地進行自定義或更改。在主題上,可以自定義或更改任何包含系統資訊的檔案。為了更清楚地瞭解系統,檢視所有這些總是好的
ps
ps
命令是檢視 Linux 系統上正在執行的程式的有效方法。在您的終端上鍵入ps 將顯示當前 shell 的程式
(程式狀態)的輸出ps
將顯示以下內容:
- PID:程式ID(程式唯一)
- TTY:使用者使用的終端型別
- TIME:程式使用的 CPU 時間量(這不是該程式執行的時間)
- CMD:正在執行的命令或可執行檔案(不會顯示任何命令列引數)
“ps”命令提供了一些有用的選項。
- ps -A: 檢視所有正在執行的程式
- ps axjf:檢視程式樹(見下面的樹形成直到ps axjf執行)
- ps aux:該aux 選項將顯示所有使用者的程式 (a),顯示啟動程式的使用者 (u),並顯示未附加到終端的程式 (x)。檢視 ps aux 命令輸出,我們可以更好地瞭解系統和潛在漏洞
env 和 export
該env
命令將顯示環境變數
PATH
變數可能具有編譯器或指令碼語言(例如 Python
),可用於在目標系統上執行程式碼或用於特權升級
sudo -l
目標系統可以配置為允許使用者以 root 許可權執行一些(或所有)命令。該sudo -l
命令可用於列出您的使用者可以使用執行的所有命令sudo
ls
Linux 中使用的常用命令之一可能是ls
在尋找潛在的特權升級向量時,請記住始終使用ls
帶有引數的命令-la
。下面使用ls -l
遺漏了隱藏檔案“secret.txt”
id
該id 命令將提供使用者許可權級別和組成員身份的總體概覽。
值得記住的是,該id 命令也可以獲取其他使用者的資訊:
/etc/passwd
讀取/etc/passwd
檔案是發現系統使用者的一種簡單方法
雖然輸出可能很長而且有點嚇人,但它可以很容易地被剪下並轉換成一個有用的列表以用於暴力攻擊
cat /etc/passwd | cut -d ":" -f 1
請記住,這將返回所有使用者,其中一些是不是很有用的系統或服務使用者。另一種方法可能是 grep
查詢“home”
,因為真實使用者很可能將他們的資料夾放在“home”
目錄下
cat /etc/passwd | grep home
history
使用命令檢視較早的命令 history 可以讓我們對目標系統有一些瞭解,儘管很少見,但可能存在密碼或使用者名稱等資訊
ifconfig
目標系統可能是另一個網路的樞軸點。該ifconfig
命令將為我們提供有關係統網路介面的資訊。下面的示例顯示目標系統具有三個介面(eth0、tun0 和 tun1)。我們的攻擊機器可以到達 eth0 介面,但不能直接訪問其他兩個網
可以使用ip route 命令檢視存在哪些網路路由來確認這一點
netstat
在對現有介面和網路路由進行初步檢查後,值得研究現有通訊。該netstat
命令可以與幾個不同的選項一起使用,以收集有關現有連線的資訊
netstat -a
:顯示所有偵聽埠和已建立的連線。netstat -at
或者netstat -au
也可用於分別列出 TCP 或 UDP 協議。netstat -l
:列出處於“偵聽”模式的埠。這些埠已開啟並準備好接受傳入連線。這可以與“t”選項一起使用,以僅列出使用 TCP 協議偵聽的埠(如下)netstat -s -t
: 按協議列出網路使用統計資訊(如下) 這也可以與或選項一起使用,-u
以將輸出限制為特定協議netstat -tp
:列出帶有服務名稱和PID
資訊的連線
-l
這也可以與列出監聽埠的選項 一起使用(如下)
我們可以看到“PID/Program name”
列是空的,因為這個程式屬於另一個使用者。
下面是使用 root
許可權執行的相同命令,並將此資訊顯示為 2641/nc (netcat)
netstat -i
:顯示介面統計資訊。我們在下面看到“eth0”和“tun0”比“tun1”更活躍
netstat 您可能會在部落格文章、文章和課程中最常看到的用法可以 細分netstat -ano
如下:
- -a: 顯示所有
- -n: 不解析名稱
- -o:顯示定時器
建議使用:
netstat -anpt
netstat -anpte
netstat -tunple
find
在目標系統中搜尋重要資訊和潛在的特權升級向量可能會很有成效。內建的“find”
命令很有用,值得保留在您的武器庫中
以下是“查詢”命令的一些有用示例
查詢檔案:
find . -name flag1.txt
: 在當前目錄下找到名為“flag1.txt”的檔案find /home -name flag1.txt
: 在/home目錄下找到檔名“flag1.txt”find / -type d -name config
: 在“/”下找到名為config的目錄find / -type f -perm 0777
: 查詢777許可權的檔案(所有使用者可讀、可寫、可執行的檔案)find / -perm a=x
: 查詢可執行檔案find /home -user frank
: 在“/home”下查詢使用者“frank”的所有檔案find / -mtime 10
:查詢最近 10 天內修改過的檔案find / -atime 10
:查詢最近 10 天內訪問過的檔案find / -cmin -60
:查詢最近一小時(60 分鐘)內更改的檔案find / -amin -60
:查詢最近一小時(60 分鐘)內的檔案訪問find / -size 50M
:查詢大小為 50 MB 的檔案
此命令還可以與 (+)
和 (-)
符號一起使用,以指定大於或小於給定大小的檔案
上面的示例返回大於 100 MB 的檔案。重要的是要注意“find”命令往往會產生錯誤,有時會使輸出難以閱讀。這就是為什麼明智的做法是使用帶有“-type f 2>/dev/null”
的“find”命令將錯誤重定向到“/dev/null”
並獲得更清晰的輸出(如下)
可以寫入或執行的資料夾和檔案:
find / -writable -type d 2>/dev/null
:查詢可寫資料夾find / -perm -222 -type d 2>/dev/null
:查詢可寫資料夾find / -perm -o=w -type d 2>/dev/null
:查詢可寫資料夾find / -perm -o=x -type d 2>/dev/null
:查詢可執行資料夾
查詢開發工具和支援的語言:
find / -name perl*
find / -name python*
find / -name gcc*
查詢特定檔案許可權:
下面是一個簡短的示例,用於查詢設定了 SUID 位的檔案。SUID 位允許檔案以擁有它的帳戶的特權級別執行,而不是執行它的帳戶。這允許一個有趣的許可權升級路徑:
find / -perm -u=s -type f 2>/dev/null
:查詢帶有SUID位的檔案,這樣我們就可以執行比當前使用者更高許可權級別的檔案find / -perm -04000 -print 2>/dev/null
: 也是查詢SUID檔案find / -perm -04000 -print 2>/dev/null
:也是查詢SUID檔案
通用 Linux 命令
由於我們在 Linux 領域,熟悉 Linux 命令通常會非常有用。請花一些時間熟悉find
, locate
, grep
, cut
,sort
等命令
自動列舉工具
有幾種工具可以幫助您在列舉過程中節省時間。這些工具應該只用於節省時間,因為它們可能會錯過一些特權升級向量。下面是一個流行的 Linux 列舉工具列表,帶有指向它們各自 Github 儲存庫的連結
目標系統的環境將影響您將能夠使用的工具。例如,如果目標系統上沒有安裝用 Python 編寫的工具,您將無法執行它。這就是為什麼最好熟悉一些工具而不是擁有一個單一的首選工具
- 林豌豆:https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
- LinEnum: https://github.com/rebootuser/LinEnum
- LES(Linux 漏洞利用建議器):https://github.com/mzet-/linux-exploit-suggester
- Linux 智慧列舉:https://github.com/diego-treitos/linux-smart-enumeration
- Linux 隱私檢查器: https: //github.com/linted/linuxprivchecker
核心漏洞利用
理想情況下,許可權升級會導致 root 許可權。這有時可以簡單地透過利用現有漏洞來實現,或者在某些情況下透過訪問另一個具有更多許可權、資訊或訪問許可權的使用者帳戶來實現。
除非單個漏洞導致 root shell
,否則許可權升級過程將依賴於錯誤配置和鬆散的許可權。
Linux 系統上的核心管理元件之間的通訊,例如系統上的記憶體和應用程式。這個關鍵功能需要核心有特定的許可權;因此,成功的利用可能會導致 root 特權。
核心利用方法很簡單;
識別核心版本
搜尋並找到目標系統核心版本的漏洞利用程式碼
執行漏洞
雖然看起來很簡單,但請記住,核心漏洞利用失敗可能會導致系統崩潰。在嘗試核心利用之前,請確保這種潛在結果在您的滲透測試範圍內是可以接受的。
研究來源:
- 根據您的發現,您可以使用 Google 搜尋現有的漏洞利用程式碼。
- https://www.linuxkernelcves.com/cves等來源也很有用。
- 另一種選擇是使用像 LES (Linux Exploit Suggester) 這樣的指令碼,但請記住,這些工具可能會產生誤報(報告不影響目標系統的核心漏洞)或漏報(不報告任何核心漏洞,儘管核心是易受傷害的)。
提示/注意事項:
- 在 Google、Exploit-db 或 searchsploit 上搜尋漏洞時,對核心版本過於具體
- 在啟動之前,請務必瞭解漏洞利用程式碼的工作原理。一些漏洞利用程式碼可以對作業系統進行更改,使它們在進一步使用時不安全,或者對系統進行不可逆的更改,從而在以後產生問題。當然,在實驗室或 CTF 環境中,這些可能不是什麼大問題,但在真正的滲透測試過程中,這些絕對不能。
- 一些漏洞利用在執行後可能需要進一步的互動。閱讀漏洞利用程式碼提供的所有註釋和說明。
SimpleHTTPServer
您可以分別使用Python
模組和將漏洞利用程式碼從您的機器傳輸到目標系統wget
SUDO
預設情況下,sudo 命令允許您以 root 許可權執行程式。在某些情況下,系統管理員可能需要為普通使用者提供一些靈活的許可權。例如,初級 SOC 分析師可能需要定期使用 Nmap,但不會獲得完全根訪問許可權。在這種情況下,系統管理員可以允許該使用者僅以 root 許可權執行 Nmap,同時在系統的其餘部分保持其常規許可權級別
任何使用者都可以使用該sudo -l
命令檢視其當前與root許可權相關的情況
https://gtfobins.github.io/ 是一個有價值的資源,它提供了有關如何使用您可能擁有 sudo 許可權的任何程式的資訊
利用應用程式功能
一些應用程式在此上下文中不會有已知的漏洞利用。您可能會看到這樣的應用程式是 Apache2 伺服器
在這種情況下,我們可以使用“hack”來利用應用程式的功能來洩露資訊。如下所示,Apache2 有一個選項支援載入備用配置檔案(-f:指定備用 ServerConfigFile)
使用此選項載入/etc/shadow檔案將導致包含檔案第一行的錯誤訊息/etc/shadow
SUID
許多 Linux 許可權控制依賴於控制使用者和檔案互動。這是透過許可權完成的。到目前為止,您知道檔案可以具有讀取、寫入和執行許可權。這些是在其許可權級別內提供給使用者的。這隨著 SUID(設定使用者標識)和 SGID(設定組標識)而改變。這些允許檔案分別以檔案所有者或組所有者的許可權級別執行
您會注意到這些檔案設定了一個“s”
位來顯示它們的特殊許可權級別
find / -type f -perm -04000 -ls 2>/dev/null
將列出設定了 SUID 或 SGID 位的檔案。
一個好的做法是將此列表中的可執行檔案與 GTFOBins ( https://gtfobins.github.io ) 進行比較。單擊 SUID 按鈕將在設定 SUID 位時過濾已知可利用的二進位制檔案(您也可以使用此連結獲取預過濾列表 https://gtfobins.github.io/#+suid)
上面的列表顯示nano
設定了SUID位。不幸的是,GTFObins並沒有為我們帶來輕鬆的勝利。對於現實生活中的特權升級場景,我們需要找到中間步驟,以幫助我們利用我們所獲得的任何微小發現
為 nano 文字編輯器設定的 SUID 位允許我們使用檔案所有者的許可權建立、編輯和讀取檔案。Nano 由 root
擁有,這可能意味著我們可以以比當前使用者更高的許可權級別讀取和編輯檔案。在這個階段,我們有兩個基本的許可權提升選項:讀取檔案/etc/shadow
或將我們的使用者新增到/etc/passwd
以下是使用這兩種載體的簡單步驟。
讀取/etc/shadow
檔案
我們透過執行find / -type f -perm -04000 -ls 2>/dev/null
命令看到 nano 文字編輯器設定了 SUID
位
nano /etc/shadow
將列印檔案的內容/etc/shadow
。我們現在可以使用 unshadow
工具建立一個可被 John the Ripper
破解的檔案。為此,unshadow
需要/etc/shadow
和/etc/passwd
檔案
unshadow 工具的用法如下所示;
unshadow passwd.txt shadow.txt > passwords.txt
有了正確的單詞表和一點運氣,開膛手約翰(john)可以爆破並返回明文形式一個或多個密碼
另一種選擇是新增一個具有 root 許可權的新使用者。這將幫助我們規避繁瑣的密碼破解過程。下面是一個簡單的方法來做到這一點:
我們將需要我們希望新使用者擁有的密碼的雜湊值。這可以使用 Kali Linux 上的 openssl 工具快速完成。
openssl passwd -1 -salt 使用者名稱 密碼
然後,我們會將此密碼和使用者名稱新增到/etc/passwd
檔案中
一旦我們的使用者被新增(請注意我們root:/bin/bash
是如何提供一個 root shell
的)我們將需要切換到這個使用者並且希望應該有 root 許可權
然後切換到該使用者,我們就擁有了root
許可權
Capabilities(Capabilities)
系統管理員可以用來提高程式或二進位制檔案特權級別的另一種方法是“Capabilities”。功能有助於在更精細的級別管理許可權。例如,如果 SOC 分析師需要使用需要發起套接字連線的工具,普通使用者將無法做到這一點。如果系統管理員不想給這個使用者更高的許可權,他們可以更改二進位制檔案的功能。因此,二進位制檔案無需更高許可權的使用者即可完成任務。
功能手冊頁提供了有關其用法和選項的詳細資訊
我們可以使用該getcap
工具列出啟用的功能
當以非特權使用者身份執行時,getcap -r /
會產生大量錯誤,因此最好將錯誤訊息重定向到 /dev/null
請注意,vim
及其副本都沒有設定 SUID
位。因此,在列舉查詢 SUID
的檔案時,無法發現此特權升級向量
GTFObins 有一個很好的二進位制檔案列表,如果我們發現任何設定的功能,可以利用這些二進位制檔案進行特權升級
我們注意到 vim 可以與以下命令和有效負載一起使用:
這將啟動一個 root shell,如下所示:
Cron 作業
Cron 作業用於在特定時間執行指令碼或二進位制檔案。預設情況下,它們以其所有者而非當前使用者的許可權執行。雖然正確配置的 cron 作業本身並不容易受到攻擊,但它們可以在某些情況下提供特權升級向量。
這個想法很簡單;如果有一個以 root 許可權執行的計劃任務,並且我們可以更改將要執行的指令碼,那麼我們的指令碼將以 root 許可權執行
Cron 作業配置儲存為 crontab(cron 表)以檢視任務將執行的下一個時間和日期。
系統上的每個使用者都有他們的 crontab 檔案,並且無論他們是否登入都可以執行特定的任務。如您所料,我們的目標是找到一個由 root 設定的 cron 作業並讓它執行我們的指令碼,最好是一個 shell
任何使用者都可以閱讀儲存系統範圍 cron 作業的檔案/etc/crontab
雖然 CTF 機器可以讓 cron 作業每分鐘或每 5 分鐘執行一次,但在滲透測試活動中,您會更經常看到每天、每週或每月執行的任務
您可以看到backup.sh
指令碼被配置為每分鐘執行一次。該檔案的內容顯示了一個建立 prices.xls
檔案備份的簡單指令碼
由於我們當前的使用者可以訪問這個指令碼,我們可以很容易地修改它來建立一個反向 shell,希望具有 root 許可權
該指令碼將使用目標系統上可用的工具來啟動反向 shell。
需要注意兩點:
- 命令語法會因可用工具而異。(例如
nc
,可能不支援-e
您在其他情況下使用過的選項) - 我們應該總是更喜歡啟動反向 shell,因為我們不想在真正的滲透測試過程中損害系統的完整性。
該檔案應如下所示;
我們現在將在我們的攻擊機器上執行一個監聽器來接收傳入的連線。
Crontab 始終值得檢查,因為它有時會導致簡單的特權升級向量。以下場景在不具備一定網路安全成熟度級別的公司中並不少見:
- 系統管理員需要定期執行指令碼。
- 他們建立了一個 cron 作業來執行此操作
- 一段時間後,指令碼變得無用,他們將其刪除
- 他們不清理相關的 cron 作業
此變更管理問題導致利用 cron 作業的潛在漏洞
上面的示例顯示了類似的情況,其中刪除了 antivirus.sh
指令碼,但 cron
作業仍然存在。
如果未定義指令碼的完整路徑(如對 backup.sh
指令碼所做的那樣),cron
將引用 /etc/crontab
檔案中 PATH
變數下列出的路徑。在這種情況下,我們應該能夠在使用者的主資料夾下建立一個名為“antivirus.sh”
的指令碼,它應該由 cron 作業執行
目標系統上的檔案應該看起來很熟悉:
傳入的反向 shell 連線具有 root 許可權:
在奇怪的情況下,您會發現一個現有的指令碼或任務附加到 cron 作業,花時間瞭解指令碼的功能以及如何在上下文中使用任何工具總是值得的。例如,tar、7z、rsync
等,可以使用它們的萬用字元功能進行利用
PATH
如果您的使用者具有寫入許可權的資料夾位於路徑中,您可能會劫持應用程式來執行指令碼。Linux 中的 PATH 是一個環境變數,它告訴作業系統在哪裡搜尋可執行檔案。對於任何未內建於 shell 中或未使用絕對路徑定義的命令,Linux 將開始在 PATH 下定義的資料夾中搜尋。(這裡說的PATH是環境變數,path是檔案所在的位置)
通常 PATH 看起來像這樣:
如果我們在命令列中鍵入“thm”,Linux 將在這些位置查詢名為 thm 的可執行檔案。下面的場景將使您更好地瞭解如何利用它來提高我們的特權級別。正如您將看到的,這完全取決於目標系統的現有配置,因此請確保您在嘗試之前能夠回答以下問題:
$PATH
下有哪些資料夾- 您當前的使用者是否對這些資料夾中的任何一個具有寫入許可權?
- 你能修改$PATH嗎?
- 是否有您可以啟動的指令碼/應用程式會受此漏洞影響?
出於演示目的,我們將使用以下指令碼:
該指令碼嘗試啟動一個名為“thm”的系統二進位制檔案,但該示例可以很容易地用任何二進位制檔案複製
我們將其編譯成可執行檔案並設定 SUID 位
我們的使用者現在可以訪問設定了 SUID 位的“路徑”
指令碼。
如果 PATH 下列出了任何可寫資料夾,我們可以在該目錄下建立一個名為 thm 的二進位制檔案,並讓我們的“路徑”指令碼執行它。由於設定了 SUID 位,此二進位制檔案將以 root 許可權執行
使用“find”
命令可以完成對可寫資料夾的簡單搜尋find / -writable 2>/dev/null
。可以使用簡單的剪下和排序序列清理此命令的輸出
一些 CTF 場景可以呈現不同的資料夾,但常規系統會輸出如上所示的內容。
將其與 PATH 進行比較將幫助我們找到可以使用的資料夾
我們在 /usr
下看到許多資料夾,因此再次執行我們的可寫資料夾搜尋以覆蓋子資料夾可能更容易
另一種方法是下面的命令。
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
我們新增了“grep -v proc”以消除與執行程式相關的許多結果
不幸的是,/usr
下的子資料夾不可寫
更容易寫入的資料夾可能是 /tmp
。此時因為 /tmp
不存在於PATH
中,所以我們需要新增它。正如我們在下面看到的,“ export PATH=/tmp:$PATH”
命令完成了這一點
此時,路徑指令碼還將在 /tmp
資料夾下查詢名為“thm”的可執行檔案。
透過將 /bin/bash
複製為 /tmp
資料夾下的“thm”
,建立此命令相當容易。
我們已經為我們的 /bin/bash
副本授予了可執行許可權,請注意,此時它將以我們使用者的許可權執行。在此上下文中使許可權升級成為可能的原因是路徑指令碼以 root 許可權執行
NFS
特權升級向量並不侷限於內部訪問。共享資料夾和遠端管理介面(例如 SSH 和 Telnet)也可以幫助您獲得目標系統的根訪問許可權。某些情況下還需要同時使用這兩種方式,例如,在目標系統上找到根 SSH 私鑰並使用根許可權透過 SSH 連線,而不是嘗試提高當前使用者的許可權級別
另一個與 CTF 和考試更相關的向量是錯誤配置的網路外殼。當存在網路備份系統時,有時可以在滲透測試過程中看到此向量
NFS(網路檔案共享)配置儲存在 /etc/exports
檔案中。該檔案是在 NFS 伺服器安裝期間建立的,通常可供使用者讀取
此許可權升級向量的關鍵元素是您在上面看到的“no_root_squash”
選項。預設情況下,NFS 會將 root 使用者更改為 nfsnobody
並剝奪任何檔案以 root
許可權操作。如果可寫共享上存在“no_root_squash”
選項,我們可以建立一個設定了 SUID
位的可執行檔案並在目標系統上執行它
我們將從列舉攻擊機器的可掛載共享開始。
我們將把其中一個“no_root_squash”
共享掛載到我們的攻擊機器上並開始構建我們的可執行檔案
由於我們可以設定 SUID 位,因此將在目標系統上執行 /bin/bash
的簡單可執行檔案將完成這項工作
編譯程式碼後,我們將設定 SUID 位
您將在下面看到這兩個檔案(nfs.c
和 nfs
存在於目標系統上。我們已經處理了掛載的共享,因此無需傳輸它們)