vlambda博客
学习文章列表

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

前言Docker模块简介漏洞利用    cdk关于该漏洞的exp    漏洞复现        环境安装        漏洞复现

前言

docker runc容器逃逸漏洞(CVE-2019-5736)发生在runc模块(也叫容器运行时)。

Docker、containerd或者其他基于runc的容器运行时存在安全漏洞,攻击者可以通过特定的容器镜像或者exec操作,来获取到宿主机的runc执行时的文件句柄,并修改掉runc的二进制文件,从而可以在宿主机上以root身份执行命令。

Docker模块简介

先看几张

docker模块分层图:

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

从 Docker 1.11 之后,Docker Daemon 被分成了多个模块。

containerd 主要职责是镜像管理(镜像、元信息等)、容器执行(调用最终运行时组件执行)。

containerd 向上为 Docker Daemon 提供了 gRPC 接口,使得 Docker Daemon 屏蔽下面的结构变化,确保原有接口向下兼容。

containerd 向下通过 containerd-shim 结合 runC,使得引擎可以独立升级,避免之前 Docker Daemon 升级会导致所有容器不可用的问题。

runC 是从 Docker 的 libcontainer 中迁移而来的,实现了容器启停、资源隔离等功能。也叫容器运行时。

漏洞利用

cdk关于该漏洞的exp

cdk支持该漏洞进行容器逃逸,调用名为runc-pwn

但由于该漏洞需要重写runc二进制文件,故漏洞利用完会造成目标docker无法使用。漏洞复现时可以打快照或者备份docker-runc文件。

漏洞复现

以下复现内容转载自:

docker逃逸漏洞复现(CVE-2019-5736) - FreeBuf网络安全行业门户

https://www.freebuf.com/articles/web/258398.html

环境安装

第一步:卸载已将安装的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

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

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

查看版本是否正确

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

漏洞复现

第一步:生成payload

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

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

编译生成payload(需要go环境,压缩包已在文件中,安装参考https://www.jianshu.com/p/c43ebab25484

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

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

第二步:攻击

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

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

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

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

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

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

攻击者开启nc监听

【云原生渗透】- docker runc容器逃逸漏洞(CVE-2019-5736)

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