Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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
CVE-2026-34828 — Persistencia de sesión de listmonk después del restablecimiento y cambio de contraseña | Kitploit
Herramientas/GitHubGitHub/0xmrma/cve-2026-34828
Análisis de VulnerabilidadesExplotaciónSeguridad WebPruebas de PenetraciónAutenticación
GitHub0xmrma/cve-2026-34828

CVE-2026-34828

Persistencia de sesión de listmonk después del restablecimiento y cambio de contraseña

Ver Repositorio
15hace 6 mesesAú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

CVE-2026-34828

Persistencia de sesión de listmonk tras el restablecimiento y cambio de contraseña

Introducción

Encontré este problema al revisar listmonk, un gestor de boletines y listas de correo de código abierto, con una simple pregunta de seguridad en mente:

Cuando un usuario cambia o restablece una contraseña, ¿la aplicación realmente termina las sesiones ya emitidas?

En este caso, la respuesta fue no.

Las sesiones autenticadas emitidas anteriormente siguieron siendo válidas después de:

  • restablecimiento de contraseña
  • cambio de contraseña

Eso significaba que una cookie de sesión robada podía sobrevivir a los mismos eventos de seguridad en los que los usuarios confían para recuperar su cuenta.

El problema fue aceptado y se le asignó CVE-2026-34828.

Proyecto: listmonk en GitHub
CVE: CVE-2026-34828

Esto afectó a listmonk, un proyecto ampliamente adoptado con más de 5M de pulls de Docker.

photo0

Cadena de ataque

sesión autenticada robada → la víctima restablece o cambia la contraseña → la sesión antigua sigue siendo válida → el atacante conserva el acceso a la cuenta tras la recuperación de credenciales


Qué hace listmonk

listmonk es un gestor de listas de correo y boletines autohospedado.

Ofrece:

  • autenticación de administradores
  • gestión de usuarios
  • creación de campañas
  • gestión de suscriptores
  • ajustes SMTP y operativos
  • administración basada en navegador

Eso significa que su modelo de sesión es un límite de seguridad real.

La pregunta importante aquí no era si listmonk soporta el restablecimiento de contraseña.

La pregunta real era:

¿El restablecimiento o el cambio de contraseña revocan realmente la persistencia del atacante si ya se ha robado una sesión?

En este caso, no lo hacía.


Por qué valía la pena investigar este fallo

Muchas revisiones de seguridad se centran demasiado en los bypass de inicio de sesión y en la escalada de privilegios obvia.

Eso pasa por alto una clase importante de debilidades:

fallos de recuperación

Si un usuario cambia o restablece una contraseña, se supone que esa acción debe ser significativa.
Se supone que debe reducir la confianza en credenciales antiguas y en el estado de autenticación previo.

Si un atacante ya tiene una sesión válida y esa sesión sobrevive al evento de recuperación, entonces la víctima no ha recuperado realmente la cuenta por completo.

Ese era el problema aquí.

Esto no era un fallo de validación de inicio de sesión. No era un problema de criptografía. No era un fallo en el hash de contraseñas.

Era un fallo del ciclo de vida de la sesión:

  • el estado de la contraseña cambió,
  • se produjo la recuperación de la cuenta,
  • pero las sesiones antiguas seguían siendo de confianza.

Eso es suficiente para crear una vulnerabilidad real.


El límite en el que me centré

No abordé listmonk golpeando endpoints al azar esperando que alguno cediera.

El camino más sólido era identificar primero el límite de confianza de mayor valor.

Para software con un fuerte componente de autenticación, uno de los mejores límites para probar es este:

¿Los cambios de cuenta sensibles para la seguridad revocan las sesiones previamente confiables?

Esa pregunta suele volverse interesante en torno a:

  • restablecimiento de contraseña
  • cambio de contraseña
  • cambios de 2FA
  • flujos de recuperación de cuenta

En listmonk, la señal más fuerte provino de los dos primeros.

Ahí es donde el problema se volvió evidente.


Causa raíz

El fallo no era que los cambios de contraseña fallaran.

El fallo era que las sesiones les sobrevivían.

Según la revisión del código fuente, el flujo de restablecimiento de contraseña:

  • generaba y validaba un token de restablecimiento de un solo uso,
  • actualizaba la contraseña,
  • creaba una nueva sesión,

pero no había una revocación visible de las sesiones anteriores.

El mismo patrón aparecía en el flujo autenticado de cambio de contraseña:

  • la contraseña se actualizaba,
  • pero las sesiones antiguas ya emitidas no se invalidaban.

Ese comportamiento coincidía exactamente con los resultados en vivo.

Las áreas de código relevantes que revisé fueron:

  • cmd/auth.go para el comportamiento de olvido/restablecimiento
  • cmd/users.go para actualizaciones autenticadas del perfil
  • internal/core/users.go para el manejo de la actualización de contraseña

Por qué esto es explotable

Porque el robo de sesión es una condición de ataque real.

Una vez que un atacante obtiene una cookie de sesión autenticada válida por cualquier medio, como:

  • compromiso del navegador
  • malware
  • acceso a estaciones de trabajo compartidas
  • XSS en otro componente
  • fuga a través de proxy o depuración
  • exposición accidental de cookies

la víctima debería poder terminar esa persistencia del atacante cambiando o restableciendo la contraseña.

Aquí, no podía.

La cadena de ataque era sencilla:

  • el atacante tiene una cookie de sesión válida
  • la víctima realiza un restablecimiento o cambio de contraseña
  • la contraseña antigua se vuelve inválida
  • la contraseña nueva funciona
  • la sesión antigua del atacante sigue autenticándose correctamente

Esa es toda la vulnerabilidad.


Qué hace que esto sea un problema de seguridad y no solo un comportamiento de la aplicación

La distinción importante es la persistencia después de la recuperación.

Muchas aplicaciones tratan el cambio de contraseña como un evento puramente a nivel de credenciales. Eso no es suficiente.

La pregunta real no es:

"¿Cambió el valor de la contraseña en el almacenamiento?"

La pregunta real es:

"¿Se revocó la relación de confianza asociada a las sesiones antiguas?"

En listmonk, no se revocó.

Eso convierte lo que podría haber sido un mantenimiento ordinario de la cuenta en una recuperación de seguridad incompleta.

Esa es la diferencia entre:

  • la continuidad ordinaria de la sesión
  • y una debilidad de seguridad real

PoC

Validé el problema en dos flujos separados.

Caso 1: El restablecimiento de contraseña no revoca las sesiones existentes

Primero, creé un usuario de prueba normal e inicié sesión, guardando la cookie de sesión autenticada.

Luego activé el flujo de contraseña olvidada, capturé el enlace de restablecimiento y restablecí la contraseña.

Después del restablecimiento:

  • la contraseña antigua ya no funcionaba
  • la contraseña nueva funcionaba
  • pero la cookie de sesión anterior al restablecimiento seguía autenticándose correctamente

Una solicitud de validación representativa tenía este aspecto:

GET /api/profile HTTP/1.1
Host: 127.0.0.1:9000
Cookie: session=<old_pre_reset_session>

Y el servidor seguía devolviendo:

HTTP/1.1 200 OK
Content-Type: application/json

con el perfil autenticado.

Eso confirmó la afirmación principal:

  • la recuperación se completó,
  • las credenciales cambiaron,
  • pero la confianza de la sesión existente permaneció intacta.

Caso 2: El cambio de contraseña no revoca las sesiones activas paralelas

Luego validé la misma clase de fallo en el flujo autenticado de cambio de contraseña.

Inicié sesión dos veces como el mismo usuario y guardé dos sesiones autenticadas válidas:

  • sesión A
  • sesión B

Usando la sesión A, cambié la contraseña a través del endpoint de actualización de perfil.

Ejemplo de solicitud:

PUT /api/profile HTTP/1.1
Host: 127.0.0.1:9000
Cookie: session=<session_A>
Content-Type: application/json

{
  "name":"victim1",
  "email":"[email protected]",
  "password":"VictimChanged123"
}

Después de eso:

  • la contraseña antigua ya no funcionaba
  • la contraseña nueva funcionaba
  • pero la sesión B seguía siendo válida
Descargar herramienta