docker逃逸方法汇总与简要分析
内容提要
渗透测试发现主机是docker环境,需要逃逸到宿主机。逃逸方法包括dirty cow漏洞、runC容器逃逸漏洞和docker配置不当。还有docker remote api未授权访问导致逃逸。
延伸解读
逃逸前提:准确识别Docker环境
在尝试逃逸前,需先确认目标是否为Docker容器。文章提供了多种判断方法:检查根目录下是否存在.dockerenv文件、查看/proc/1/cgroup是否包含docker字符串、观察容器IP是否多为172.17网段,以及使用Metasploit的checkcontainer模块。这些方法有助于渗透测试者快速定位环境,避免在非容器环境中错误利用逃逸技术。
内核漏洞逃逸:Dirty Cow的适用条件
Dirty Cow(CVE-2016-5195)是Linux内核权限提升漏洞,影响内核版本2.6.22及以上。由于Docker容器与宿主机共享内核,若宿主机存在该漏洞,容器内即可利用它提权至root,进而逃逸。文章给出了多个EXP链接,但利用成功与否取决于宿主机内核版本,需通过uname -a确认。
runC漏洞逃逸:依赖exec触发
CVE-2019-5736影响Docker版本低于18.09.2及runC版本不高于1.0-rc6。攻击者需在容器内上传并执行恶意POC,覆盖宿主机runC二进制文件。当管理员再次使用docker exec进入容器时,会触发payload反弹shell,从而获得宿主机权限。此方法利用条件较苛刻,需等待交互操作。
配置不当逃逸:未授权API与特权模式
Docker Remote API若监听在0.0.0.0:2375且无认证,攻击者可直接通过HTTP请求控制Docker,例如挂载宿主机根目录到容器内,进而写入计划任务逃逸。特权模式(--privileged)启动的容器可访问所有设备,攻击者能挂载宿主机磁盘并修改文件。这两种方式均因配置疏忽导致,风险极高。
Q&A
如何判断当前机器是否运行在Docker容器环境中?
可以通过以下方法判断:1. 使用Metasploit的checkcontainer模块;2. 检查根目录下是否存在.dockerenv文件;3. 检查/proc/1/cgroup文件中是否包含docker字符串;4. 容器IP通常为172.17网段,且很多命令如vim未安装。
Docker逃逸有哪些常见方法?
常见的Docker逃逸方法包括:1. 内核漏洞,如Dirty Cow(CVE-2016-5195);2. 软件程序漏洞,如runC容器逃逸漏洞(CVE-2019-5736);3. Docker配置不当,如特权模式逃逸和Docker Remote API未授权访问。
Dirty Cow漏洞如何导致Docker逃逸?
Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,源于内存子系统在处理写入时拷贝(copy-on-write)存在竞争条件。Docker容器与宿主机共享内核,因此如果宿主机内核版本>=2.6.22且存在该漏洞,攻击者可以利用漏洞提权到root,进而逃逸到宿主机。
runC容器逃逸漏洞(CVE-2019-5736)影响哪些版本?如何利用?
受影响的版本为Docker Version < 18.09.2和runC Version <= 1.0-rc6。利用步骤:1. 目标需为Docker环境;2. 使用POC脚本(如CVE-2019-5736-PoC)修改Payload中的反弹shell地址;3. 编译GO脚本生成可执行文件;4. 将文件上传到容器中;5. 执行并等待容器再次被exec;6. 攻击机开启监听,当有人执行docker exec进入容器时触发payload,反弹shell到VPS,获得系统权限。
Docker Remote API未授权访问如何导致逃逸?
Docker Remote API若配置不当(如监听在0.0.0.0:2375且无安全保护),攻击者可直接通过HTTP请求访问API,可能导致敏感信息泄露或数据删除。逃逸方法:启动新容器并将宿主机根目录挂载到容器的/mnt目录,然后通过修改/mnt下的文件(如/etc/crontab)或直接获取宿主机shell,从而逃逸到宿主机。
特权模式下的Docker容器如何逃逸?
当容器以特权模式(--privileged)启动时,可以访问主机上的所有设备,并执行mount命令。逃逸步骤:1. 以特权模式运行容器;2. 查看磁盘文件;3. 创建文件夹并将宿主机磁盘(如/dev/vda1)挂载到该文件夹;4. 写入计划任务到宿主机的cron文件;5. 在VPS上监听,等待反弹shell。