2021-03-20 18:52:06
在渗透测试中,当获得一个Webshell并发现其位于Docker容器内时,如何进一步获取目标主机的权限成为关键。以下是一些常见的Docker容器逃逸案例和技术手段。
一、判断是否在docker容器里首先,需要确定当前环境是否处于Docker容器中。常用的检测方法包括:
其他辅助判断方法包括检测mount信息、使用fdisk -l查看硬盘、判断PID 1的进程名等。
二、配置不当引发的docker逃逸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。
docker.sock挂载到容器内部
场景描述:在Docker容器中调用和执行宿主机的Docker,将宿主机的docker文件和docker.sock文件挂载到容器中。
漏洞测试:
在容器中找到docker.sock。
查看宿主机docker信息。
运行一个新容器并挂载宿主机根路径,访问宿主机的全部资源,写入ssh密钥或计划任务,获取shell。

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。
Shocker攻击
漏洞描述:执行系统调用open_by_handle_at函数,Docker 1.0版本前未限制CAP_DAC_READ_SEARCH能力,引发容器逃逸风险。
漏洞影响版本:Docker版本<1.0。
利用:通过特定方法读取主机目录文件内容。

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。

Docker cp命令可导致容器逃逸攻击漏洞(CVE-2019-14271)
漏洞描述:Docker宿主机使用cp命令时,会调用辅助进程docker-tar,该进程没有被容器化,且会动态加载libnss_.so库。黑客可以通过替换这些库将代码注入到docker-tar中,实现Docker逃逸。
影响版本:Docker 19.03.0。
安全版本:升级至Docker 19.03.1及以上。
利用DirtyCow漏洞实现Docker逃逸
漏洞简述:Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,通过它可实现Docker容器逃逸,获得root权限的shell。
漏洞测试:
准备存在dirtyCow漏洞的宿主机镜像,如ubuntu-14.04.5。
下载并运行测试容器。
进入容器,编译POC并执行。
在监听端成功接收到宿主机反弹的shell。


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