MobyDick

目标与线索
端口扫描

目录扫描,注意选择大字典和后缀

penguin.php
80 页面给出了一句西班牙语提示:
Hola pinguinito. La ballena Docker con Grafana 8.3.0 esconde un database_pass.txt en /tmp
意思是:Docker 中的 Grafana 8.3.0 在 /tmp 留下了 database_pass.txt。这一步直接给出了后续复盘的四个关键词:pinguinito、Docker、Grafana 8.3.0,以及目标文件路径。
SSH 入口与本机线索
hydra 爆破拿到 pinguinito 用户的访问权限。
登录后发现 Database.kdbx:这是 KeePass 的加密密码库,通常不能直接读取,必须有主密码或配置的密钥材料。

继续检查运行中的进程,可以看到:
/usr/bin/containerd-shim-runc-v2 -namespace moby -id <container-id>
containerd-shim-runc-v2 是 Docker/containerd 正常的容器运行时组件;moby 命名空间说明系统中存在 Docker 容器。这与初始提示相互印证,也把枚举重点转向 Docker 默认网段。

Docker 网段发现与 SSH 隧道
枚举容器网络后,发现 Grafana 服务:
172.17.0.2:3000 Grafana 8.3.0

容器地址只能由靶机访问,因此在自己的测试机上通过 SSH 建立本地端口转发:
ssh -N -L 127.0.0.1:3000:172.17.0.2:3000 pinguinito@192.168.43.23
其中 -N 表示不执行远程命令,只保持隧道;-L 则把本机的 127.0.0.1:3000 转发到由靶机可达的容器服务。隧道建立后,从本机浏览器访问 http://127.0.0.1:3000 即可进入 Grafana。

Grafana 文件读取
该靶场中的 Grafana 仍保留初始默认凭据,admin:admin 可以登录并触发首次修改密码流程。随后依据已识别的 8.3.0 版本,在授权范围内验证文件读取问题,成功读取容器中的:
/tmp/database_pass.txt


文件中保存的字符串正好是打开 Database.kdbx 所需的主密码。
KeePass 数据库与结果
使用 KeePassXC 打开数据库:
keepassxc Database.kdbx

密码库中保存了另一位本地用户的凭据,至此攻击链闭合:

初始提示 → SSH 用户 → Docker 网段 → Grafana → /tmp/database_pass.txt → Database.kdbx → 本地用户凭据

修复建议
- 部署 Grafana 后立即禁用默认凭据,限制管理接口来源,并持续升级到受支持版本。
- 不要把密码或密钥材料写入容器的
/tmp;使用 Docker Secrets、受控环境变量或专用密钥管理服务。 - 将密码库与其主密码、密钥文件分离保管,不让它们在同一主机上形成可串联的路径。
- SSH 优先使用密钥认证、最小权限和登录审计,避免弱口令与横向凭据复用。