Escalada de miembro a administrador en un clon de Trello por filtración de la clave de firma JWT
Un endpoint de configuración pública filtra la clave con la que se firman los JWT; con ella un miembro forja un token role=admin válido y lee la clave maestra de la organización.
Este hackeo se reportó sin recompensa
Aprende a encontrar este bug
Un hackeo real de HackerOne, reproducido para que lo practiques.
Crea tu cuenta y practica bugs reales que se pagaron. Descarga el entorno, encuéntralo y aprende la técnica exacta — tu camino a tu primer bounty.
hunters entrenando
labs de hackeos reales
completaciones
pagados por estos bugs
Acceso a todos los labs · sin permanencia · cancela cuando quieras
Hackers que lo han resuelto· 1
Objetivos
Logro que recibirás
Cuando resuelvas este lab desbloqueas este logro compartible

Writeups de la comunidad
La checklist que repaso en cada objetivo nuevo
47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.
Te das de baja en un clic, desde cualquier correo.
Contenido del lab
Escenario
Kanbia es un clon de Trello: organizas el trabajo del equipo en tableros con listas y tarjetas. La organización Nébula Studio tiene una clave maestra (rota API keys, SCIM y exports) que solo debería ver un administrador, en Ajustes de la organización › Seguridad. Esa clave es la flag.
Tú eres un miembro normal: attacker@kanbia.local / password123. Tu objetivo es leer esa clave maestra sin ser administrador.
Qué tienes
- Tu cuenta de miembro, con acceso a los tableros del equipo (punto de partida, no es el fallo).
- El panel de organización con tres pestañas: General, Miembros y Seguridad (bloqueada para ti).
Guía paso a paso
Recon. Entra en Ajustes › Seguridad: te dice "Solo administradores". El servidor decide tu rol; no basta con tocar el cliente. Mira ahora en el proxy/Network las peticiones que lanza la app al arrancar: entre ellas hay una a
GET /api/config.Tu sesión es un JWT. Coge tu token (cookie
kb_tokenolocalStorage.kb_token) y decodifícalo (jwt.io). El payload traerole: "member". Si solo cambiasmember→adminy reenvías, el servidor responde 401: la firma ya no cuadra. La firma sí se valida; te falta la clave para firmar tú.La fuga. Abre la respuesta de
GET /api/config. Junto a datos inocuos (nombre de app, flags de features) viajaauth.signingKey: la clave con la que el servidor firma los JWT. No debería salir nunca del servidor.Forja el token. Reconstruye tu JWT con
role: "admin"y fírmalo con HS256 usando esasigningKey(en jwt.io pega la clave en "your-256-bit-secret", o con un script). Obtienes un token admin con firma válida.Captura la flag. Envía
GET /api/org/settingsconAuthorization: Bearer <token_admin>(o guarda el token enkb_tokeny abre Seguridad): ahora responde 200 y muestra la clave maestra de la organización:FLAG{…}.
Canales de feedback (no vuelas a ciegas)
- El panel bloqueado nombra explícitamente el requisito ("Solo administradores") → el rol es lo que importa.
- Cambiar el
rolesin re-firmar da 401 → la firma se valida de verdad; necesitas el secreto. /api/configdevuelve lasigningKeyen claro → confirmas la fuga al instante.- Con el token admin,
/api/org/settingspasa de 403 a 200 conmasterKey→ sabes que escalaste.
Decoys (descártalos por razonamiento)
- El control de rol no está roto:
requireAdminvalida bien y un token mal firmado se rechaza. El fallo es que el secreto se filtra, no la verificación. - La pestaña Miembros (
/api/org/members) lista a todo el equipo, pero no contiene la clave maestra: no es la vía. - El resto de
/api/config(features, límites de subida) es ruido verosímil: el único campo peligroso esauth.signingKey.
La falla del laboratorio
Clases: uso de credencial/secreto expuesto (CWE-798), verificación de firma inefectiva por secreto comprometido (CWE-347) y escalada por control de acceso roto (CWE-285), con divulgación de información sensible (CWE-200). OWASP A01:2021 (Broken Access Control) + A02:2021 (Cryptographic Failures) + A05:2021 (Security Misconfiguration).
La raíz es una sola: un secreto de servidor viaja al cliente. El endpoint de configuración mezcla datos públicos con la clave de firma de los JWT; a partir de ahí toda la criptografía de sesión es papel mojado, porque cualquiera puede emitir tokens válidos con el rol que quiera. La verificación de firma —correcta en sí misma— deja de proteger. La defensa: los secretos de firma viven solo en el servidor (secret manager), se rotan, y un endpoint que consume el cliente jamás debe incluirlos; como defensa en profundidad, no derivar autorización sensible únicamente del role del token sin revalidar contra la base de datos.
Laboratorio basado en la reproducción anonimizada (empresa ficticia Kanbia) de una técnica real de bug bounty: escalada de privilegios por filtración de la clave de firma de sesión.
