前言
在滲透測試與內網攻防中,提權(Privilege Escalation)是至關重要的一環。尤其在 Linux 環境中,權限的嚴格劃分雖然提升了系統安全性,但一旦攻擊者獲得了初始訪問權限,他們往往會試圖通過各種方式實現權限提升,從而控制整個系統、維持持久化訪問,甚至橫向移動至更多目標。因此,熟悉并掌握 Linux 提權技術,不僅有助于安全研究人員發現并修復潛在風險,也有助于紅隊在攻防演練中高效突破系統防線。
本篇文章將從實際出發,系統地介紹 Linux 中常見的提權方式,涵蓋信息收集、文件權限分析、內核漏洞利用、配置錯誤利用、SUID 和 sudo 權限濫用、定時任務劫持、Docker 環境逃逸等關鍵手段。文章不僅強調技術原理,還輔以典型示例和操作命令,幫助讀者建立完整的提權知識體系,提升在真實環境中的滲透測試能力與安全防護意識。
Linux提權原理
Linux 提權主要分為內核提權和其他類型提權。內核提權的優點是針對存在漏洞的內核版本通常可通用利用,但缺點是穩定性差,易導致 shell 丟失或系統崩潰。常見的提權思路包括:先上傳信息收集腳本,枚舉系統內核和配置;再結合系統開啟的服務,進行有針對性的提權操作。
權限劃分
用戶和組
用戶組在 linux 系統上起著重要作用,它們為選定的用戶提供了一種彼此共享文件的簡便方法。它們還使系統管理員可以更有效地管理用戶權限,因為他們可以將權限分配給組而不是單個用戶。
Linux 用戶分為管理員和普通用戶,普通用戶又分為系統用戶和自定義用戶。
1系統管理員:即 root 帳戶,UID 號為 0,擁有所有系統權限,它類似于 Windows 系統中的 administrator 帳戶,是整個系統的所有者。
2系統用戶:Linux 為滿足自身系統管理所內建的賬號,通常在安裝過程中自動創建,不能用于登錄操作系統。UID 在 1-499 之間(Centos 7 為 1-999 之間)。像上面的 sshd、 pulse 等等用戶即是此類用戶。它類似于 Windows 中的 system 帳戶,當然權限遠沒有 system 帳戶高。
3自定義用戶:由 root 管理員創建供用戶登錄系統進行操作使用的賬號,UID 在 500 以上(CentOS7 為 1000 以上)。它類似于 Windows 系統中 users 用戶組中的帳戶。
在 Linux 中的每個用戶必須屬于一個組,不能獨立于組外在 Linux 中每個文件有所有者、所在組、其它組的概念同樣,用戶組的信息我們可以在 /etc/group 中查看
/etc/passwd 文件
在 Linux 的 /etc/passwd 文件中每個用戶都有一個對應的記錄行,它記錄了這個用戶的一些基本屬性。系統管理員經常會接觸到這個文件的修改以完成對用戶的管理工作。
用戶名:密碼:用戶ID:組ID:用戶說明:家目錄:登陸之后shell
?
/etc/shadow 文件
/etc/shadow 文件是 Linux 系統中用于 存儲用戶加密密碼及相關賬號安全信息 的配置文件,它是 /etc/passwd 的安全擴展。
用戶名:加密密碼:密碼最后一次修改日期:兩次密碼的修改時間間隔:密碼有效期:密碼修改到期到的警告天數:密碼過期之后的寬限天數:賬號失效時間:保留
?
加密的密碼具有固定格式: $id$salt$encrypted
●id 表示加密算法,1 代表 MD5,5 代表 SHA-256,6 代表 SHA-512
●salt 為鹽值,系統隨機生成
●encrypted 表示密碼的 hash 值
文件權限
在 Linux 系統中,一切皆文件,包括普通文件、目錄、設備文件、套接字等。文件權限通過 rwx(讀、寫、執行)三種標志進行控制,對于目錄來說,r 表示可以查看該目錄下的文件列表(如使用 ls 命令),w 表示可以在該目錄下添加、刪除、重命名等操作,而 x 則表示是否可以進入該目錄成為當前工作目錄。如果缺少 x 權限,即使擁有 w 權限,也無法向目錄內寫入文件。
使用ls -l命令可以查看當前目錄文件的權限,ls -la可以查看當前目錄全部文件權限(包括隱藏文件)。
?
以-rw-r--r-- 1 root root 為例,分析每個符號代表的意思。
1第一個位置可以有以下符號- : 代表普通文件 d:代表目錄 l:代表軟鏈接 b:代表塊文件 c:代表字符設備
2剩下的表示的是文件所屬的權限 rw- 表示文件所擁有者的權限。 r-- 表示文件所在組的用戶的權限。 r-- 表示其他組的用戶的權限。
3后面的數據1代表 如果文件類型為目錄,表示目錄下的子目錄個數。如果文件類型是普通文件,這個數據就表示這個文件的硬鏈接個數。
4后面兩個root的分別含義是第一個為該文件所有者為root 用戶,第二個表示該文件所在組為root組。
特殊權限
在 Linux 系統中,除了常規的 rwx 權限外,還存在三種特殊權限:SUID、SGID 和 SBIT,常用于程序或目錄的特殊操作控制。
● SUID(Set User ID):應用于可執行文件,當該文件被執行時,臨時賦予執行者“文件所有者”的權限,而不是執行者本人的權限,常用于如 passwd 等系統命令。
● SGID(Set Group ID):作用類似于 SUID,不過是切換到“文件所屬組”的權限;若用于目錄,則新創建的文件會自動繼承該目錄的所屬組。
● SBIT(Sticky Bit):主要用于目錄,表示只有文件的所有者或管理員才有權限刪除或修改該目錄下的文件,常見于 /tmp 目錄,用于保護用戶的臨時文件不被其他用戶刪除。
信息收集
自動化工具
手動輸入命令還是很復雜的,一般還是直接上工具。
github地址
?
這里只是簡單介紹基本的信息,詳細的信息搜集會結合具體的提權方式。
手動收集
查看系統信息
用戶和群組
查找明文密碼
ssh 私鑰
Linux提權具體方法
這一部分將重點介紹幾種常見且實用的提權方式,包括內核漏洞提權、/etc/passwd 提權、Docker 提權、定時任務提權、SUID 提權以及Sudo 提權等。每種方法都將配合實際示例進行講解,幫助讀者更清晰地理解其利用思路與操作流程。
內核提權
概述
內核漏洞提權是利用 Linux 系統內核中存在的已知安全漏洞,獲取 root 權限的一種高效提權方式。由于 Linux 是開源系統,長期以來被廣泛研究,暴露出大量內核漏洞。提權過程通常包括三步:收集目標系統的內核版本信息,查找與之對應的可利用漏洞及 EXP,最后執行 EXP 實現權限提升。該方法適用于權限受限的普通用戶,提權成功率高,但也可能導致系統不穩定或崩潰,因此在實際操作中需謹慎使用。
EXP項目地址
1https://github.com/belane/linux-soft-exploit-suggester
2https://github.com/jondonas/linux-exploit-suggester-2
3https://github.com/PenturaLabs/Linux_Exploit_Suggester
4https://github.com/mzet-/linux-exploit-suggester
在本次演示中,我們將采用 第四個項目 。該工具能夠根據目標系統的內核版本,快速分析并推薦可用的本地提權漏洞,幫助滲透測試人員識別潛在的提權機會。它是一個高效的漏洞建議工具,適用于漏洞評估和漏洞利用的準備工作。
利用過程
運行腳本會獲得系統信息,然后提供可以利用的腳本地址。
?
Highly probable: 評估的內核很可能受到影響,并且 PoC 漏洞利用很可能可以直接使用,無需重大修改。
Probable: 利用可能有效,但很可能需要定制 PoC 漏洞利用以適應你的目標。
Less probable: 需要額外的手動分析來驗證內核是否受到影響。
Unprobable: 內核受到影響的可能性極低(該漏洞在工具的輸出中未顯示)。
下載命令
然后根據漏洞情況編譯運行就可以了。
/etc/passwd提權
概述
當系統錯誤地將 /etc/passwd 設置為可寫時,攻擊者可以向其中添加一個偽造的 root 用戶(UID 為 0)。通過這個賬號登錄后,就能直接獲取系統最高權限。該方法簡單有效,常見于配置不當的系統或靶機環境中。
利用特征
運行信息收集工具后,發現系統給出了明確的提權提示(工具詳情在前言提到的文章里面有)。
普通用戶檢查 /etc/passwd 文件權限時,發現該文件對當前用戶具有寫權限,為后續的提權操作提供了可行入口。具體各個字段代表的信息同樣可以參考前言部分的文章。
下面這張圖是沒有寫權限的
利用過程
生成偽造 root 賬號密碼串
使用 openssl 或 python 生成一個加密密碼,例如密碼為 123456
?
多種方式生成加密密碼。
構造賬號條目
例如添加一個名為 hacker 的 root 用戶
追加到 /etc/passwd 文件中
使用普通用戶直接寫入
切換到新賬號
Docker提權
概述
Docker 提權是指通過容器配置漏洞或不當設置,突破容器的隔離限制,從而獲得宿主機的 root 權限。常見的提權方式包括利用 --privileged 標志、掛載宿主機目錄、以及內核漏洞等。攻擊者可以通過這些漏洞突破容器的安全限制,實現從容器內提權至宿主機。
由于 Docker 提權方式繁多,這里主要關注兩種常見的風險:特權容器和掛載宿主機目錄的容器。后續將發布更詳細的 Docker 提權文章,進一步探討更多的提權方法。
利用特征
使用docker ps -a可以查看container_id
?
特權容器
容器如果以 --privileged 標志運行,將獲得宿主機的幾乎所有權限,可能導致提權風險。可以通過以下命令檢查容器是否以特權模式運行:
掛載宿主機目錄的容器
如果容器掛載了宿主機的敏感目錄(如 /etc、/root 等),容器中的惡意用戶可以直接訪問這些目錄,從而提升權限。可以通過以下命令查看容器的掛載信息:
利用過程
特權容器
如果容器以特權模式運行,容器內的用戶將獲得幾乎與宿主機相同的權限。這意味著容器內的用戶能夠執行與宿主機相關的操作,甚至修改宿主機的文件系統,帶來較高的提權風險。
掛載宿主機目錄的容器
當容器掛載了宿主機的敏感目錄(如 /etc、/root 等),容器內的惡意用戶可以修改這些目錄中的關鍵文件。特別地,容器中的用戶可以通過修改 /etc/passwd 等文件實現提權操作,具體方法可以參考**/etc/passwd提權**部分。
SUID提權
概述
SUID(Set User ID)是文件權限的一種設置,當一個文件具有 SUID 權限時,執行該文件的用戶將臨時獲得該文件擁有者的權限,通常是 root 權限。這種權限主要用于允許普通用戶執行某些高權限的操作,例如訪問或修改系統資源。然而,若某些二進制文件或實用程序錯誤地設置了 SUID 權限,攻擊者便可以利用這些文件提升權限,從而獲得 root 權限,造成安全風險。因此,正確管理和審查 SUID 權限的文件對于系統安全至關重要。
查找root權限的SUID文件
使用信息收集工具的提示。
查找是否有以 root 身份執行的二進制程序(即擁有 SUID 且屬主為 root),攻擊者可以借助這些程序嘗試“越權”執行某些操作,從而提升自身權限
高危 SUID 程序
以下是一些具有 SUID 權限時常被用于提權的高危可執行文件,這些程序多數收錄在 GTFOBins 中,通常可以直接利用提權:
/usr/bin/find:利用 -exec 參數執行任意命令,例如 find . -exec /bin/sh ; 即可提權/usr/bin/vim 或 vi:通過命令模式 :!sh 拿到 root shell/usr/bin/python 或 python3:使用 os.system("/bin/sh") 或 subprocess 模塊執行命令/usr/bin/perl:使用 system("/bin/sh") 拿 shell/usr/bin/env:可用 env /bin/sh 方式執行 shell/usr/bin/bash:如果帶有 SUID,可直接提權執行 /bin/bash -p
利用方式
如果通過上面的方法發現了系統中的敏感 SUID 程序,可以查閱相關命令或腳本實現提權操作。除此之外,還可以直接使用一些自動化工具來簡化流程。
AutoSUID 是一個開源項目,其主要目標是自動化地收集系統中的 SUID 可執行文件,并嘗試查找可用的提權方式。該工具實現了全流程的 100% 自動化,有效提高了提權的效率與成功率。
Sudo提權
概述
在 Linux 系統中,sudo 命令用于讓普通用戶以其他用戶(通常是 root)的身份執行命令。正常情況下,執行 sudo 需要輸入用戶自己的密碼,但為了運維方便,管理員可能會在 sudoers 文件中配置某些用戶或命令為無需密碼(NOPASSWD)即可執行。如果這些配置不當,攻擊者可能利用它們執行高權限命令,從而實現本地提權,因此 sudo 配置錯誤常常是提權的關鍵入口之一。
利用特征
通過信息收集工具可以快速掃描系統中存在的 SUID 程序和 sudo 權限配置。一旦發現存在已知的提權方式,工具通常會直接給出利用建議,例如:
手工測試結果
在正常環境中,系統可能存在多種語言設置,直接手工測試有助于我們理解提權原理和驗證工具提示的準確性。不過在實際滲透過程中,面對復雜多變的系統配置,還是建議優先使用信息收集工具,它們可以快速、全面地識別潛在的提權點,大大提升效率和成功率。
提權命令
具體使用哪個命令進行提權,需要參考信息收集工具的掃描結果。根據掃描結果,若發現用戶可以通過 sudo 執行 Python,通常可以使用以下命令:
其他命令
定時任務提權
概述
定時任務(cron job)是 Linux 系統中用于定期執行任務的工具,允許系統在指定時間間隔內自動運行命令或腳本。由于 cron 通常以 root 權限執行,如果攻擊者能夠修改 cron 配置文件或其執行的腳本或二進制文件,就可以利用 root 權限執行任意代碼,從而實現提權。攻擊者通過獲取對定時任務的控制,能夠在系統中以 root 權限運行惡意代碼,造成嚴重的安全威脅。因此,定時任務的安全配置和監控在系統管理中至關重要。
利用特征
前期信息搜集工具發現定時任務里面有test.py的文件
手工查看定時任務的命令vim /etc/crontab
查看test.py文件權限,發現任何用戶都可寫(具體判斷方法可以參考前言提到的文章)。
提權命令
#!/bin/bash# 使用 Shell 腳本啟動一個新的 bash shell 提權/bin/bash#!/usr/bin/python# 使用 Python 的 os.system 方法執行命令,啟動 bash 提權import os# 執行 /bin/bash 提權命令os.system("/bin/bash")#!/usr/bin/perl# 使用 Perl 的 exec 方法執行 bash 提權exec("/bin/bash");#!/usr/bin/ruby# 使用 Ruby 的 exec 方法執行 bash 提權exec("/bin/bash")#!/usr/bin/lua-- 使用 Lua 的 os.execute 方法執行 bash 提權os.execute("/bin/bash")