scadastrangelove/zeronights2025-GRAFUNA

GitHub: scadastrangelove/zeronights2025-GRAFUNA

针对 Grafana 可观测性平台的红队研究工具集,揭示监控基础设施作为攻击面的潜在风险。

Stars: 1 | Forks: 1

# 我只是想…… GRAFUNA 红队 可观测性关乎可见性。 可见性是双向的。 如果你能看到它,别人也能看到。 这个仓库包含了我最近演讲的公开部分:幻灯片 + 小型辅助脚本。 这里的所有内容都是**只读 / 教育性质**的,除非你决定发挥创意(请勿这样做)。 ## 文件 - 幻灯片 (PDF): **Gordey - Grafana - ZN2025.pdf** - 脚本: **grafana_inventory.py** - 脚本: **grafana\_mssql\_health_mapper.py** - 脚本: **grafana\_infinity\_proxy_poc.py** ## 演讲内容 云原生可观测性技术栈 (Prometheus / Grafana / friends) 是:
- 无处不在,
- 功能强大,
- 并且通常带有“没问题”的默认配置。
悖论在于:我们构建监控是为了**减少**事故,却不小心创建了一个新的攻击面来**引发**事故。 涵盖的主题(高层概览):
- `/metrics`, `/debug`, `/pprof`,“有用的” API,以及为什么它们对*错误*的人很有用。
- Grafana 作为**控制平面**(dashboards, plugins, datasources, users/roles)。
- 大规模错误配置,以及为什么“内部服务”是一个营销良好的幻想。
- 红队检查清单 + 蓝队缓解措施(又名“绑定到 localhost 并祈祷”)。 **如果你观察的时间足够长,可观测性也会回望你。
(并且它会提交一个工单。)** # 超声波 Vibecoding 会议 我在一次超快的 vibecoding 会议中制作了这些。 它们勉强能跑,危险程度刚好,但还没好到值得骄傲。 如果你想使用它们,你必须修复它们。
修复它们就是 CAPTCHA。
通过 CAPTCHA 证明你(大概)是一个人类。
# 需求 - Python 3.8+ - `requests` ``` pip install requests ``` ## `grafana_inventory.py` 一个用于 Grafana 的最小化资产收集器: - 拉取元数据(健康状态、用户、datasources、plugins、dashboards/folders) - 输出 Markdown 报告 - **不写入** Grafana(仅限 GET) - 在 URL 中编辑 `user:pass@host` ### 用法 ``` python3 grafana_inventory.py \ --base-url "https://grafana.example.com" \ --output grafana_inventory.md \ --api-key "" ``` 你也可以通过环境变量提供 token: ``` export GRAFANA_API_KEY="" python3 grafana_inventory.py --base-url "https://grafana.example.com" ``` 注意: * 适用于子路径(`https://host/grafana`)。 * 允许在没有 token 的情况下运行(有时很有信息量):你只会收集到匿名用户能看到的内容。 * 输出故意设计得很无聊。无聊是好事。无聊就是安全。(通常如此。) * ![grafana_inventory 输出](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/de84e18c88141448.jpg) ## `grafana_mssql_health_mapper.py` **它是什么:** 一个 Grafana **MSSQL datasource** 滥用工具,将 `/api/datasources/.../health` 变成一个粗糙的**连通性探测器**。 **它做什么(用人类语言说):** - 获取一个 Grafana MSSQL datasource
- 反复将其目标服务器重写为 `host:port`
- 调用 datasource **健康检查**
- 根据结果文本 + 时间推断“有响应 / 无响应 / 超时”
- 定期轮换 auth token,因为平台看你做这事会感到厌烦
**为什么存在:** 因为“仅限内部”只是一个睡前故事,而 datasources 通常是一个带 GUI 的可编程网络边界。 **它不是什么:**
- 不是扫描器
- 不是可靠的事实
- 不隐蔽
- 不能用于生产环境
**输入 / 旋钮(预期):**
- Grafana base URL
- Session/API token
- Datasource ID (MSSQL)
- Hosts (CIDR/ranges)
- Ports 列表
- Timeouts / 并发行为(取决于你的修改)
**输出:**
- 一串“可能开放 / 可能关闭 / 可能被过滤 / 可能 Grafana 讨厌你”
- 如果你打算假装这是科学,你会想把它管道传输到结构化的东西里 **已知的罪过:**
- 错误字符串解析当作“协议”
- 当延迟、代理或速率限制决定模仿物理学时,启发式方法会撒谎
- 如果你跑得太猛,Grafana 就会开始做 Grafana 会做的事(tokens、节流、悲伤)
**修复我 CAPTCHA 想法:**
- 添加 JSONL 输出(`host`, `port`, `status`, `latency_ms`, `raw_error`)
- 使状态分类明确化(不要“可能”)
- 添加退避 / 速率限制
- 使 datasource 选择更安全(不要硬编码 ID/名称假设)
- 添加 dry-run 模式(打印计划变更而不触碰 Grafana)
## 2) `grafana_infinity_proxy_poc.py` (又名 `grafproxy.py`) **它是什么:**
一个本地 HTTP 服务器,试图使用 Grafana 的 **Infinity datasource**(`yesoreyeram-infinity-datasource`)作为一个豪华版的 **fetcher/proxy**,主要是为了理解管道的行为。 **它做什么(用人类语言说):**
- 启动一个微型本地 HTTP 监听器
- 查找 Infinity datasource(硬编码名称假设)
- 修改其 config/params
- 调用 Grafana `/api/ds/query`
- 从响应中提取一块数据并返回给你
**为什么存在:**
因为有时你不需要完整的漏洞利用链——你需要理解**管道的形状**。 **当前状态:**
PoC / 未完成 / “在我机器上能跑”的气场。 它只是一个想法的草图,不是一个工具。 **它不是什么:**
- 不是安全的代理
- 不是通用的 SSRF 框架
- 除非你喜欢应急响应,否则不是你应该暴露给互联网的东西
**输出:**
- Datasource 返回的任何内容,加上你在学习过程中意外泄露的内容 **已知的罪过:**
- 硬编码的 datasource 名称/类型期望
- 最小化的验证
- “请求路径”和“目标 URL”之间区分薄弱
- 那种*教会你*为什么需要代码审查的代码 **修复我 CAPTCHA 想法:**
- 使 datasource 选择明确化(通过 args/env 指定 ID)
- 正确解析和验证请求的 URL(允许列表、协议检查、无惊吓)
- 返回结构化结果 + 错误(不要静默吞掉)
- 添加有助于调试但不泄露秘密的日志
- 添加单元测试,只为在受控环境中体验痛苦
## 安全 / 法律 * 仅在你拥有或明确获得测试许可的系统上使用。 * 如果你把这指向随机的互联网终端:恭喜你,你变成了事故/问题/刑事案件。 ## 致谢 Sergey Gordeychik. 如果你觉得这很有用,请修补你的可观测性技术栈。如果你觉得这很可怕,请修补两次。 ## 许可证 代码:MIT 幻灯片:CC BY 4.0 或者选别的也行。
标签:API 滥用, API集成, Grafana, POC 验证, Proxy, Python, ZeroNights 2025, 仪表板安全, 内部服务暴露, 可观测性, 安全会议, 密码管理, 开放策略代理, 控制平面, 插件安全, 插件系统, 攻击面, 数据展示, 数据源利用, 无后门, 混合加密, 红队, 蓝队防御, 资产收集, 足迹分析, 逆向工具