docker逃逸漏洞复现(CVE-2019-5736)
2020-12-21 12:41:50 Author: www.freebuf.com(查看原文) 阅读量:207 收藏

概述

2019年2月11日,runC的维护团队报告了一个新发现的漏洞,SUSE Linux GmbH高级软件工程师Aleksa Sarai公布了影响Docker, containerd, Podman, CRI-O等默认运行时容器runc的严重漏洞CVE-2019-5736。

漏洞会对IT运行环境带来威胁,漏洞利用会触发容器逃逸、影响整个容器主机的安全,最终导致运行在该主机上的其他容器被入侵。漏洞影响AWS, Google Cloud等主流云平台。

攻击者可以通过特定的容器镜像或者exec操作可以获取到宿主机的runC执行时的文件句柄并修改掉runc的二进制文件,从而获取到宿主机的root执行权限。

漏洞原理

漏洞点在于runC,RunC是一个容器运行时,最初是作为Docker的一部分开发的,后来作为一个单独的开源工具和库被提取出来。作为“低级别”容器运行时,runC主要由“高级别”容器运行时(例如Docker)用于生成和运行容器,尽管它可以用作独立工具。像Docker这样的“高级别”容器运行时通常会实现镜像创建和管理等功能,并且可以使用runC来处理与运行容器相关的任务:创建容器、将进程附加到现有容器等。在Docker 18.09.2之前的版本中使用了的runc版本小于1.0-rc6,因此允许攻击者重写宿主机上的runc 二进制文件,攻击者可以在宿主机上以root身份执行命令。

利用方式

docker 18.09.2之前的runc存在漏洞,攻击者可以修改runc的二进制文件导致提权。

影响版本

docker version <=18.09.2 RunC version <=1.0-rc6

环境安装

第一步:卸载已将安装的docker

$ sudo apt-get remove docker docker-engine docker-ce docker.io

第二步:安装前准备

1、更新索引包

$ sudo apt-get update

2、安装以下包,以使apt 可以通过https 使用repository

$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

3、添加Docker官方的GPG密钥并更新索引包

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

$ sudo apt-get update

第三步安装指定的docker版本

1、列出可用版本

apt-cache madison docker-ce

1608521534_5fe0173e7c19025f92069.png!small

2、选择一个版本来安装

$ sudo apt-get install docker-ce=<VERSION> 比如: $ sudo apt-get install docker-ce=18.06.1~ce~3-0~ubuntu

3、查看是否安装正常

$ sudo systemctl start docker $ docker info

查看版本是否正确

1608521545_5fe01749a23eca12b0d0a.png!small

漏洞复现

第一步:生成payload

下载CVE-2019-5736编译go脚本生成攻击payload。(https://github.com/Frichetten/CVE-2019-5736-PoC),将go脚本中的命令修改为反弹shell(附件)

将此内容进行更改,设置nc监听地址。

1608521554_5fe0175229e447a04a16d.png!small

编译生成payload(需要go环境,压缩包已在文件中,安装参考https://www.jianshu.com/p/c43ebab25484) CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

1608521576_5fe01768389e102f54897.png!small

建议打快照,漏洞复现完成会造成docker无法使用。

第二步:攻击

将该payload拷贝到docker容器中(这就是模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸)

1608521601_5fe01781c727736ad300d.png!small

执行payload,等待受害者去启动docker容器。(如果ctf比赛选手说容器启动有问题,引诱管理员启动docker就中招了)

1608521609_5fe01789638c00db950cb.png!small

xshell重新打开一个选项卡,进入容器。(sh启动)

1608521615_5fe0178f6dc231d7aa471.png!small

攻击者开启nc监听

1608521619_5fe01793512a1a43c6f4f.png!small

受害者启动docker容器时,触发payload,成功反弹shell。

1608521624_5fe01798942deec08e65c.png!small

1608521629_5fe0179d3d5ab11d2405d.png!small

解决方案

升级docker到最新的版本

注:转载请注明本地址


文章来源: https://www.freebuf.com/articles/web/258398.html
如有侵权请联系:admin#unsafe.sh