其中一个比较特殊且常见的场景是当宿主机的 /var/run/docker.sock 被挂载容器内的时候,容器内就可以通过 docker.sock 在宿主机里创建任意配置的容器,此时可以理解为可以创建任意权限的进程;当然也可以控制任意正在运行的容器。

图片
这类的设计被称为: Docker in Docker。常见于需要对当前节点进行容器管理的编排逻辑容器里,历史上我遇到的场景举例:

a. 存在于 Serverless 的前置公共容器内

b. 存在于每个节点的日志容器内

如果你已经获取了此类容器的 full tty shell, 你可以用类似下述的命令创建一个通往母机的 shell。

./bin/docker -H unix:///tmp/rootfs/var/run/docker.sock run -d -it –rm –name rshell -v “/proc:/host/proc” -v “/sys:/host/sys” -v “/:/rootfs” –network=host –privileged=true –cap-add=ALL alpine:latest

如果想现在直接尝试此类逃逸利用的魅力,不妨可以试试 Google Cloud IDE 天然自带的容器逃逸场景,拥有 Google 账号可以直接点击下面的链接获取容器环境和利用代码,直接执行利用代码 try_google_cloud/host_root.sh 再 chroot 到 /rootfs 你就可以获取一个完整的宿主机 shell:

https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https://github.com/neargle/cloud_native_security_test_case.git

图片

当然容器内部不一定有条件安装或运行 docker client,一般获取的容器 shell 其容器镜像是受限且不完整的,也不一定能安装新的程序,即使是用 pip 或 npm 安装第三方依赖包也很困难。

此时基于 golang 编写简易的利用程序,利用交叉编译编译成无需依赖的单独 bin 文件下载到容器内执行就是经常使用的方法了。

最后编辑: kuteng  文档更新时间: 2022-06-01 16:17   作者:kuteng