特權升級是一段旅程。沒有靈丹妙藥,很大程度上取決於目標系統的具體設定。核心版本、已安裝的應用程式、支援的程式語言、其他使用者的密碼是影響您通往 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
將顯示以下內容:
「ps」命令提供了一些有用的選項。
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
如下:
建議使用:
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 編寫的工具,您將無法執行它。這就是為什麼最好熟悉一些工具而不是擁有一個單一的首選工具