abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-signup-invite-join
类别: 权限残留 可达性: 远程
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
当 users.allow_sign_up 为 true 且 users.verify_email_enabled 保持默认的 false 时,未认证的 POST /api/user/signup/step2 携带受邀邮箱即可创建账户,并且 applyUserInvite 会以 invite.Role 附加该地址的所有 InvitePending 记录。此路径从不要求 30 字符的邀请码。角色可以是 Admin。
知道受邀邮箱。跳过邀请码。以 Admin 身份加入组织。
| ID | 暂无 CVE |
| 类别 | 权限残留 |
| 可达性 | 远程(未认证 HTTP;需要 users.allow_sign_up=true) |
| CWE | CWE-862 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| 产品 | Grafana OSS |
| 受影响版本 | 13.2.3 (6193dc0);开放注册路径 |
| 认证 | 未认证。邮箱验证默认关闭。原版 defaults.ini 中注册为关闭。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
需要知道受邀地址(邀请邮件、猜测或另一处泄露)。不需要邮箱访问权限,也不需要邀请码。不需要已有的 Grafana 账户。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验验证或推断 |
|---|---|---|---|
| 以受邀邮箱创建账户 | 未认证 POST /api/user/signup/step2 携带 code="" | 完整性(账户创建) | 实验验证。会话 /api/user login=invitee |
| 以邀请角色加入受邀组织(本实验中为 Admin) | 来自 GetTempUsersQuery{Email, InvitePending} 的 applyUserInvite | 完整性(组织成员身份 + 角色) | 实验验证。/api/user/orgs role=Admin;sqlite org_user Admin |
| 完成待处理邀请,使真实受邀者无法使用 | updateTempUserStatus(..., TmpUserCompleted) | 完整性(邀请消耗) | 实验验证。待处理列表为空;sqlite temp status=Completed |
| 对 Viewer/Editor 邀请执行相同加入 | invite.Role 被原样复制 | 完整性 | 推断。实验使用 Admin |
| 登录后以 Org Admin 身份读写该组织 | Org Admin API(数据源、仪表盘、用户) | 侦察 + 完整性 | 推断。实验止于 role=Admin |
| 阴性对照 | 以不同邮箱和空邀请码注册 | 不适用 | 实验验证。invite-org-role=none |
此残留已排除的情况:注册关闭的默认安装;邮箱验证开启路径(该路径会检查 form.Code);完成邀请的邮箱绑定(CVE-2022-39306 类,仍然存在);Grafana Admin(isGrafanaAdmin)。不是未认证 RCE。跳过 Grafana G2(IAM SSOSetting k8s authorizer)。
我锁定了 Grafana OSS 13.2.3。默认 OSS 在此标准下返回为空。我仍然研究了开放注册路径。POST /api/user/signup/step2 是未认证的。SignUpStep2 创建用户,然后按邮箱加载待处理邀请。仅当 VerifyEmailEnabled 为 true 时才要求 form.Code。
已记录的弯路:重新提交 CVE-2022-39306(完成邀请仍会绑定邮箱);将原版 defaults.ini 视为此残留(其中注册是关闭的);OSS 上的 SCIM 未认证(nil k8s client);反向 shell。都是做戏。
python3 grafana-signup-invite-join-Abraxas-Labs.py
或:
cd lab
./run.sh
目标仅限 http://127.0.0.1:19350。镜像 grafana/grafana:13.2.3,设置 GF_USERS_ALLOW_SIGN_UP=true 且邮箱验证保持关闭。
SUCCESS GRAFANA-SIGNUP-INVITE-JOIN version=13.2.3 invite-org=2 invite-code-len=30 step2-code-sent=empty step2-redirect=redirect-to-select-org api-role=Admin sqlite-role=Admin temp-status=Completed control-invite-org-role=none GRAFANA-SIGNUP-INVITE-JOIN-WITNESS
在注册时执行 applyUserInvite 之前,要求提供待处理邀请码或邮箱证明。不要仅凭邮箱匹配就附加 InvitePending 记录。
signup.go · org_invite.goGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。