技术干货 | Docker 容器逃逸案例汇集

技术干货 | Docker 容器逃逸案例汇集
最新回答
被強煎的蛋

2021-03-20 18:52:06

Docker 容器逃逸案例汇集

在渗透测试中,当获得一个Webshell并发现其位于Docker容器内时,如何进一步获取目标主机的权限成为关键。以下是一些常见的Docker容器逃逸案例和技术手段。

一、判断是否在docker容器里

首先,需要确定当前环境是否处于Docker容器中。常用的检测方法包括:

  • 检查/.dockerenv文件:该文件在Docker容器中通常存在。
  • 检查/proc/1/cgroup:查看是否包含"docker"等字符串。

其他辅助判断方法包括检测mount信息、使用fdisk -l查看硬盘、判断PID 1的进程名等。

二、配置不当引发的docker逃逸
  1. Docker Remote API未授权访问

    Docker Remote API可以执行Docker命令。如果Docker守护进程监听在0.0.0.0,攻击者可直接调用API来操作Docker。

    漏洞利用

    通过docker daemon API执行docker命令,如列出容器信息、启动新容器等。

    新运行一个容器,挂载点设置为服务器的根目录至/mnt目录下,然后在容器内执行命令,将反弹shell的脚本写入到宿主机的/var/spool/cron/root中,最后本地监听端口,获取宿主机shell。

  2. docker.sock挂载到容器内部

    场景描述:在Docker容器中调用和执行宿主机的Docker,将宿主机的docker文件和docker.sock文件挂载到容器中。

    漏洞测试

    在容器中找到docker.sock。

    查看宿主机docker信息。

    运行一个新容器并挂载宿主机根路径,访问宿主机的全部资源,写入ssh密钥或计划任务,获取shell。

  3. Docker高危启动参数

    特权模式(--privileged):使用特权模式启动的容器,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限。

    漏洞测试

    通过特权模式运行一个容器。

    在容器内查看磁盘文件,挂载磁盘设备到新建目录。

    将计划任务写入到宿主机,开启nc监听,成功获取宿主机反弹回来的shell。

    挂载敏感目录(-v /:/soft)

    漏洞测试

    将宿主机root目录挂载到容器。

    模拟攻击者写入ssh密钥,利用私钥成功登录,获取宿主机权限。

    相关启动参数存在的安全问题:Docker通过Linux namespace实现资源隔离,但部分启动参数授予容器较大权限,打破了资源隔离界限。

    如--cap-add=SYS_ADMIN允许执行mount特权操作;--net=host绕过Network Namespace;--pid=host绕过PID Namespace;--ipc=host绕过IPC Namespace。

三、Docker软件设计引起的逃逸
  1. Shocker攻击

    漏洞描述:执行系统调用open_by_handle_at函数,Docker 1.0版本前未限制CAP_DAC_READ_SEARCH能力,引发容器逃逸风险。

    漏洞影响版本:Docker版本<1.0。

    利用:通过特定方法读取主机目录文件内容。

  2. runC容器逃逸漏洞(CVE-2019-5736)

    漏洞简述:Docker 18.09.2之前的版本使用的runc版本小于1.0-rc6,允许攻击者重写宿主机上的runc二进制文件,以root身份执行命令。

    利用条件:Docker版本<18.09.2,runc版本<1.0-rc6。

    漏洞测试

    下载测试环境镜像和POC。

    修改Payload,编译并拷贝到Docker容器中执行。

    管理员通过exec进入容器,触发Payload。

    在监听端成功获取宿主机反弹回来的shell。

  3. Docker cp命令可导致容器逃逸攻击漏洞(CVE-2019-14271)

    漏洞描述:Docker宿主机使用cp命令时,会调用辅助进程docker-tar,该进程没有被容器化,且会动态加载libnss_.so库。黑客可以通过替换这些库将代码注入到docker-tar中,实现Docker逃逸。

    影响版本:Docker 19.03.0。

    安全版本:升级至Docker 19.03.1及以上。

四、内核漏洞引起的逃逸
  1. 利用DirtyCow漏洞实现Docker逃逸

    漏洞简述:Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,通过它可实现Docker容器逃逸,获得root权限的shell。

    漏洞测试

    准备存在dirtyCow漏洞的宿主机镜像,如ubuntu-14.04.5。

    下载并运行测试容器。

    进入容器,编译POC并执行。

    在监听端成功接收到宿主机反弹的shell。

综上所述,Docker容器逃逸技术涉及多个方面,包括配置不当、软件设计缺陷和内核漏洞等。了解这些逃逸技术和相应的防御措施,对于提高系统的安全性至关重要。