abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-gitsync-dns-rebind
类别: SSRF 可达性: 远程
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
Git Sync 的 URLValidator 在准入阶段检查仓库 URL 主机。nanogit / Test 稍后重新解析,且没有 IP 固定。isBlockedIP 仅包含回环、RFC1918、链路本地和未指定地址。字面量 0.0.0.1 未被阻止。在验证时是公网的主机名,可以在克隆 GET 时重新绑定到 RFC1918。
Org Admin 测试一个重新绑定的 Git URL,使 Grafana GET 一个验证器本应拒绝的内部主机。
| ID | 暂无 CVE |
| 类别 | SSRF(DNS 重绑定 / 0.0.0.0/8 缺口) |
| 可达性 | 远程(Org Admin repositories:create) |
| CWE | CWE-918 / CWE-367 |
| CVSS | High: 7.7 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:N/A:N |
| 产品 | Grafana OSS |
| 受影响版本 | 13.2.3 (6193dc0);Git Sync 默认开启 |
| 认证 | Org Admin(repositories:create / :write)。不是 Viewer/Editor 创建。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
行为者是 Org Admin,不是陌生人。Org Admin 在 OSS 上已经可以将数据源指向内部 URL。这个遗留问题是绕过 Git Sync 的 URLValidator,该验证器本意是为仓库 URL 关闭这一类问题。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验证明或推断 |
|---|---|---|---|
| 使 Grafana GET 一个重新绑定的 Git URL | Org Admin POST .../repositories/{name}/test,带 spec.git.url=http://git.lab/... | 侦察(从 Grafana 进程发起出站 HTTP) | 实验证明。DNS A1 公网,之后 A 为 RFC1918。重绑定 oracle hits=3,witness 在响应体中 |
访问字面量 0.0.0.1 Git URL | 同样的 Test,带 http://0.0.0.1:18080/lab/gitsync.git | 侦察 | 实验证明在准入阶段未被阻止(状态 400 传输错误,而非 422 public-or-allowed) |
| 从该主机读取 Git Smart HTTP / HTTP 响应体到 Test 错误中 | gitRepository.Test 插值传输错误 | 侦察 | 从固定行为推断。实验使用了 200 git advertisement |
| 准入后重绑定到 RFC1918 / CGNAT | TOCTOU:先验证 DNS,再 nanogit 拨号 | 侦察 | 对 RFC1918 sidecar 172.30.60.3 实验证明 |
Viewer 读取存储的 spec.*.url,包括 userinfo | repositories:read | 侦察 | 从固定行为推断。非本实验 |
在此遗留问题上已关闭(实验证明):字面量回环 127.0.0.1 422;RFC1918 字面量 10.0.0.1 422;IMDS 169.254.169.254 422。已关闭:Editor 无法创建仓库。非 RCE。不需要 Grafana Admin。跳过 Grafana G2(IAM SSOSetting k8s authorizer)。
apps/provisioning/pkg/repository/validator.go 中的准入调用 URLValidator.ValidateURL。isBlockedIP 是四个谓词。未指定仅指 0.0.0.0 / ::。0.0.0.0/8 的其余部分和 CGNAT 通过。克隆稍后使用 nanogit.NewHTTPClient(gitConfig.URL) 并重新解析。
已记录的弯路:将 Org Admin DS URL 视为本遗留问题(那些是有意为之;这是 Git Sync 验证器绕过);期望 IMDS 169.254 通过(在准入阶段被阻止);Editor 创建(被拒绝);反向 shell。纯属表演。
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
或:
cd lab
./run.sh
回环:Grafana 127.0.0.1:19360,DNS 控制 127.0.0.1:19361,重绑定 oracle 127.0.0.1:19362。镜像 grafana/grafana:13.2.3。
SUCCESS GRAFANA-GITSYNC-DNS-REBIND how=live actor=org-admin path=rebind dns_lookups=4 negatives=3 GRAFANA-GITSYNC-DNS-REBIND-WITNESS
在克隆/Test 过程中固定解析后的地址,或在每次拨号时重新验证。将 0.0.0.0/8 和 CGNAT 视为已阻止。不要在未固定的情况下对允许列表主机跳过 DNS。
GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验。无担保。