Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
POC-CVE-2026-18963 — Proof-of-concept exploit for CVE-2026-18963, an authentication bypass in Keycloak's forgot-password flow, allowing password reset without proper verification. Includes non-destructive proof mode. | Kitploit
Tools/GitHubGitHub/t0w0t/poc-cve-2026-18963
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingAuthentication
GitHubt0w0t/poc-cve-2026-18963

POC-CVE-2026-18963

Proof-of-concept exploit for CVE-2026-18963, an authentication bypass in Keycloak's forgot-password flow, allowing password reset without proper verification. Includes non-destructive proof mode.

View Repository
11 day agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-18963 — Keycloak Forgot-Password Flow Authentication Bypass PoC

Proof of Concept for CVE-2026-18963, a flaw in Keycloak's "Forgot Password" / credential-selection flow that allows an attacker to reach the UPDATE_PASSWORD step — and reset a target account's password — without properly completing the required identity verification (e.g. without a valid OTP/second factor).

The script drives the flow purely over HTTP (no browser/Selenium required) by:

  1. Loading the realm's login page and locating the "Forgot Password" link.
  2. Opening the reset-credentials page and triggering tryAnotherWay.
  3. Submitting the username on the resulting credential selector.
  4. Extracting and replaying the startSessionPolling() restart URL used by the Keycloak UI to keep the auth session alive.
  5. Replaying the initial reset URL to reach a second credential selector.
  6. Submitting the username again to advance the flow straight to UPDATE_PASSWORD.
  7. Optionally submitting a new password for the target account.

⚠️ Disclaimer

This tool is provided for authorized security testing and research only (penetration tests you are engaged to perform, CTFs, your own lab environments, or coordinated vulnerability disclosure). Running it against systems you do not own or do not have explicit written authorization to test is illegal. The author and contributors assume no liability for misuse or damage caused by this tool.

Use --stop-at-update-password to produce a non-destructive proof (reaching UPDATE_PASSWORD without submitting a new password) whenever that is sufficient to demonstrate the issue.

Requirements

  • Python 3.8+
  • requests
  • beautifulsoup4

Installation

root@kitploit:~
git clone <this-repo-url>
cd POC
python -m venv .venv
source .venv/bin/activate   # on Windows: .venv\Scripts\activate
pip install -r requirements.txt

Usage

root@kitploit:~
python poc_cve_2026_18963_terminal.py \
    --base-url http://localhost:8080 \
    --realm master \
    --client-id account \
    --username admin \
    --new-password "NewPassword123!"

Options

FlagDefaultDescription
--base-urlhttp://localhost:8080Base URL of the target Keycloak instance
--realmmasterTarget realm
--client-idaccountOIDC client ID used to initiate the login flow
--usernameadminTarget username
--new-password(required)Password to set for the target account
--stop-at-update-passwordoffStop once UPDATE_PASSWORD is reached, without submitting a new password (non-weaponized proof)
--timeout10.0HTTP request timeout in seconds
--output-dirdebug_httpDirectory where each intermediate HTML response is saved for debugging
--insecureoffDisable TLS certificate verification

Non-destructive proof

root@kitploit:~
python poc_cve_2026_18963_terminal.py \
    --base-url https://target.example.com \
    --realm myrealm \
    --username victim \
    --new-password unused \
    --stop-at-update-password

Output

Every intermediate HTTP response is saved to --output-dir (debug_http by default) as 01_login.html, 02_reset.html, ... for offline review. The script exits 0 on success and 1 on failure, printing progress and diagnostic messages to stdout.

Author

Aurélien LOIE

Download Tool