docker逃逸漏洞复现(CVE-2019-5736)

0x01 概述

2019年2月11日,runC的维护团队报告了一个新发现的漏洞,该漏洞最初由Adam Iwaniuk和Borys Poplawski发现。该漏洞编号为CVE-2019-5736,漏洞影响在默认设置下运行的Docker容器,并且攻击者可以使用它来获得主机上的root级访问权限。

0x02 漏洞原理

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

0x03 利用方式

  • 宿主机利用攻击者提供的image来创建一个新的container 。
  • 拥有container root权限,并且该container后续被docker exec attach。

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

0x04 影响版本

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

0x05 漏洞复现

1.安装漏洞环境。(Ubuntu16.04)
https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw/
在这里插入图片描述
测试环境:
在这里插入图片描述

2.编译go脚本生成攻击payload。
(https://github.com/Frichetten/CVE-2019-5736-PoC)
在这里插入图片描述
将go脚本中的命令修改为反弹shell
在这里插入图片描述
编译生成payload
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
在这里插入图片描述
3.将该payload拷贝到docker容器中(此时可以模拟攻击者获取了docker容器权限,在容器中上传payload进行docker逃逸)

docker cp main e3:/home
docker exec -it e3 bash
cd /home/
chmod 777 main

在这里插入图片描述

4.执行payload,等待受害者去启动docker容器。
在这里插入图片描述
攻击者开启nc监听
在这里插入图片描述

5.受害者启动docker容器时,触发payload。
在这里插入图片描述
6.成功反弹shell。
在这里插入图片描述

0x06 参考

https://thinkycx.me/2019-05-23-CVE-2019-5736-docker-escape-recurrence.html
https://www.4hou.com/vulnerable/16361.html
https://github.com/Frichetten/CVE-2019-5736-PoC

发布了37 篇原创文章 · 获赞 21 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lhh134/article/details/104107776