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-34048 — Rutas de arranque de terminal solo para administradores verificadas únicamente por estado de inicio de sesión, que permiten a un miembro normal del equipo manejar el backend de terminal en tiempo real de Coolify y ejecutar comandos en servidores del equipo. | Kitploit
Herramientas/GitHubGitHub/0xmrma/cve-2026-34048
Autenticación y AutorizaciónEscalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónSeguridad en la NubeComando y ControlRed Teaming
GitHub0xmrma/cve-2026-34048

CVE-2026-34048

8hace 2 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

Rutas de arranque de terminal solo para administradores verificadas únicamente por estado de inicio de sesión, que permiten a un miembro normal del equipo manejar el backend de terminal en tiempo real de Coolify y ejecutar comandos en servidores del equipo.

Ver Repositorio

CVE-2026-34048

Rutas de bootstrap de terminal solo para administradores verificaban únicamente el estado de inicio de sesión, lo que permitía a un miembro normal del equipo manejar el backend de terminal en tiempo real de Coolify y ejecutar comandos en los servidores del equipo.

Introducción

Encontré este problema mientras revisaba Coolify, un PaaS autogestionado de código abierto, con una pregunta de seguridad muy directa en mente:

¿Se aplica realmente el acceso al terminal en el límite de confianza del backend, o solo en la interfaz de usuario?

En este caso, la respuesta fue mala.

Coolify pretendía que el acceso al terminal estuviera restringido a administradores y propietarios del equipo, pero las rutas de bootstrap del terminal en tiempo real solo verificaban si el usuario había iniciado sesión. Eso permitía que un miembro del equipo con pocos privilegios cumpliera con las comprobaciones de confianza del websocket del terminal y alcanzara la ejecución de comandos en los servidores del equipo.

Validé esto de extremo a extremo en un laboratorio local construido a partir de la revisión vulnerable y luego lo reporté de forma privada. El problema fue asignado como CVE-2026-34048 con:

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Coolify: Coolify en GitHub
CVE: CVE-2026-34048

Esto afectó a Coolify, un PaaS autogestionado de código abierto. En su sitio oficial, Coolify afirma que tiene 3,641+ clientes en la nube y se presenta como una plataforma para implementar sitios web, bases de datos, aplicaciones web y 280+ servicios con un solo clic. Su changelog oficial de v4.0 también indica que miles de empresas y personas han estado usando Coolify en producción durante 1-2 años.

photo0


Cadena de Ataque

sesión de miembro con pocos privilegios -> /terminal/auth y /terminal/auth/ips solo verifican estado de inicio de sesión -> websocket en tiempo real confía en esas respuestas -> miembro enumera servidor del equipo y UUID de clave SSH visible -> /terminal/ws acepta la sesión -> se genera PTY respaldado por SSH -> acceso shell en servidor del equipo


Qué Hace Coolify

Coolify es un PaaS autogestionado y plataforma de despliegue.

Gestiona:

  • servidores
  • aplicaciones
  • despliegues
  • claves privadas
  • permisos de equipo
  • acceso al terminal a la infraestructura gestionada

Esa última capacidad es la importante aquí.

Una vez que una plataforma puede abrir terminales a hosts gestionados, su modelo de autorización ya no es solo lógica de aplicación. Se convierte en un límite de confianza de infraestructura.

La pregunta importante no era si la página /terminal parecía solo para administradores.

La pregunta real era:

¿El camino del terminal del backend realmente aplica ese mismo límite de autorización cuando se crea la sesión websocket?

En este caso, no lo hizo.


Por Qué Este Error Valía la Pena Investigar

Las funcionalidades de terminal son algunas de las superficies de mayor valor en el software de infraestructura.

¿Por qué?

Porque cualquier desajuste entre:

  • autorización de UI
  • autorización de backend
  • lógica de bootstrap del websocket
  • ejecución de comandos en el host

puede convertir a un usuario normal de la aplicación en un operador con capacidad de shell.

Eso es exactamente por qué valía la pena probar esta superficie.

No estaba buscando fallos aleatorios o errores de permisos cosméticos.

Buscaba una clase de fallo más fuerte:

¿Una funcionalidad solo para administradores depende de una verificación de confianza del backend más débil de lo que sugiere la UI?

Esa era la pregunta correcta.


El Límite en el Que Me Centré

No abordé Coolify fuzzeando endpoints aleatorios y esperando algo interesante.

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

Para Coolify, ese límite era el flujo de trabajo del terminal:

  • la UI dice que el acceso al terminal está restringido
  • el servicio de terminal está basado en websocket
  • los servicios websocket suelen tener lógica de confianza de bootstrap separada
  • los comandos del terminal finalmente cruzan del estado de la aplicación a la ejecución en el host

Eso hizo que las rutas de bootstrap fueran el lugar adecuado para buscar.

Y ahí es donde estaba el problema.


Causa Raíz

La causa raíz fue un desajuste de autorización entre la UI del terminal y las rutas de bootstrap del websocket del terminal.

En la revisión vulnerable:

  • GET /terminal estaba protegido por can.access.terminal
  • POST /terminal/auth solo verificaba auth()->check()
  • POST /terminal/auth/ips solo verificaba auth()->check()

Eso significa que la UI estaba controlada por autorización de terminal, pero el límite de confianza del backend estaba controlado por la simple presencia de sesión autenticada.

El servicio en tiempo real confiaba completamente en esas dos rutas.

En docker/coolify-realtime/terminal-server.js:

  • verifyClient() hacía POST a /terminal/auth
  • la configuración de la sesión websocket hacía POST a /terminal/auth/ips
  • el manejador websocket aceptaba la entrada de comandos del terminal proporcionada por el atacante después de solo verificar si el host objetivo aparecía en la lista de hosts devuelta

Esa es toda la cadena del error.

Por qué esto es explotable

Porque un miembro normal del equipo podía construir las entradas necesarias desde la superficie normal de la aplicación:

  • /servers exponía UUIDs de servidores visibles
  • /server/{uuid} exponía ip, user y port en campos de formulario renderizados
  • /security/private-key exponía UUIDs de claves privadas del equipo visibles
  • la ruta del terminal hacía referencia a claves a través de rutas deterministas de la forma:
/var/www/html/storage/app/ssh/keys/ssh_key@<uuid>

Por lo tanto, la ruta de explotación era directa:

  • iniciar sesión como miembro del equipo no administrador
  • llamar a /terminal/auth
  • llamar a /terminal/auth/ips
  • enumerar un servidor visible
  • enumerar un UUID de clave visible
  • conectar a /terminal/ws
  • enviar la misma forma de comando SSH que el backend espera
  • recibir salida del shell de un host del equipo

Eso no es un desajuste teórico. Es una falla práctica de autorización del backend.


Qué Hace Que Esto Sea un Problema de Seguridad, No Solo un Desajuste de UI

La distinción importante es la confianza del backend y la ejecución de comandos.

Muchos errores se ven como:

  • "el botón está oculto"
  • "la página está bloqueada"
  • "la UI dice que no deberías estar aquí"

Eso solo no es suficiente.

La verdadera pregunta es:

¿Puede el usuario con menos privilegios seguir cumpliendo con las comprobaciones de confianza del backend que importan?

Aquí, la respuesta fue sí.

Esto no era:

  • un menú roto
  • una verificación de frontend faltante
  • un problema cosmético de enrutamiento

Era:

  • autorización de bootstrap del websocket demasiado débil
  • autorización del host del terminal derivada de ese límite de confianza débil
  • acceso real al shell en infraestructura gestionada

Por eso era un problema de seguridad real.


PoC

Validé esto en un laboratorio local controlado construido a partir de:

06f60c9a98bead0c932c6adf7fd43a45d9149048

El laboratorio usaba:

  • URL base: http://127.0.0.1:18000
  • cuenta de miembro con pocos privilegios: [email protected]
  • servidor objetivo: localhost -> coolify-testing-host:22 as root
  • UUID de clave visible: ssh
  • endpoint websocket: ws://127.0.0.1:6002/terminal/ws

Paso 1: confirmar el límite de la UI

La cuenta de miembro no estaba destinada a tener acceso al terminal a través de la UI normal orientada a administradores. Eso estableció el límite de seguridad esperado.

Paso 2: llamar a las rutas de bootstrap directamente

Usando la sesión del miembro, envié:

  • POST /terminal/auth
  • POST /terminal/auth/ips
Descargar herramienta