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
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

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
hace 1 mesAú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-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:

root@kitploit:~
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:
root@kitploit:~
/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:

root@kitploit:~
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

Ambas tuvieron éxito.

/terminal/auth/ips devolvió hosts autorizados para terminal incluyendo:

root@kitploit:~
coolify-testing-host
host.docker.internal
localhost
127.0.0.1

Eso demostró que las rutas de bootstrap del backend confiaban en la sesión del miembro.

Paso 3: enumerar metadatos de servidor y clave

Desde páginas autenticadas normales, el mismo miembro podía enumerar:

  • UUIDs de servidores visibles
  • campos de conexión del servidor
  • UUIDs de claves privadas del equipo visibles

Eso fue suficiente para impulsar la ruta del terminal sin necesidad de divulgación de material secreto de clave.

Paso 4: abrir el websocket del terminal

Usando la misma sesión autenticada y el token XSRF, me conecté a:

root@kitploit:~
ws://127.0.0.1:6002/terminal/ws

Paso 5: enviar el payload del comando del terminal

El payload usó el mismo formato de comando esperado por el backend del terminal:

root@kitploit:~
{"command":["timeout 30 ssh -i /var/www/html/storage/app/ssh/keys/ssh_key@ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PasswordAuthentication=no -o ConnectTimeout=10 -o ServerAliveInterval=5 -o RequestTTY=no -o LogLevel=ERROR -p '22' 'root'@'coolify-testing-host' 'bash -se' << \\P0C\nprintf '__COOLIFY_POC_BEGIN__\\n'; id; whoami; hostname; printf '__COOLIFY_POC_END__\\n'\nP0C"]}

Paso 6: observar la salida del shell remoto

El websocket devolvió:

root@kitploit:~
pty-ready
__COOLIFY_POC_BEGIN__
uid=0(root) gid=0(root) groups=0(root)
root
efa027413801
__COOLIFY_POC_END__

Esa era la prueba importante.

No solo:

  • acceso a rutas
  • ni solo aceptación del websocket
  • ni solo exposición de metadatos

Sino ejecución real de comandos en el host gestionado a través de la ruta del terminal solo para administradores.


Por Qué Este PoC Era Sólido

Una parte de esta cadena ya habría sido interesante.

Por ejemplo:

  • acceso de miembro a /terminal/auth
  • o acceso de miembro a /terminal/auth/ips

Pero eso aún dejaría margen para ser descartado.

La validación más sólida fue de extremo a extremo:

  • sesión de miembro
  • éxito de bootstrap del backend
  • aceptación del websocket
  • creación de PTY
  • salida del shell remoto

Eso cierra la brecha entre "error de autorización en teoría" e "impacto práctico en infraestructura en realidad."

También hizo que la severidad fuera mucho más fácil de defender.


Severidad y Clasificación

Este problema fue clasificado correctamente como Crítico.

La clasificación fue:

  • CWE-862: Falta de Autorización
  • CVSS:
root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Tiene sentido.

La afirmación no es que un atacante no autenticado pueda obtener acceso al shell de la nada.

La afirmación es que:

  • un miembro del equipo con pocos privilegios
  • puede cumplir con las comprobaciones de confianza del terminal del backend
  • y alcanzar la ejecución de comandos en la infraestructura del equipo

Eso es un cambio de alcance importante de una falla de RBAC de aplicación a un impacto en el host gestionado.

Por lo tanto, aunque los privilegios son bajos en lugar de ninguno, el resultado sigue siendo claramente crítico.


Por Qué Todavía Valía la Pena Reportarlo

Algunas personas subestiman las vulnerabilidades que comienzan con PR:L.

Eso es un error cuando la funcionalidad afectada es el acceso al terminal.

La verdadera pregunta no es:

"¿El atacante ya había iniciado sesión?"

La verdadera pregunta es:

"¿Qué puede alcanzar ese usuario con menos privilegios una vez que la autorización del backend es incorrecta?"

En este caso, la respuesta fue:

  • datos de selección de host
  • confianza de bootstrap del terminal
  • ejecución de PTY respaldado por SSH
  • acceso al shell en servidores del equipo

Eso está mucho más allá de un error común de permisos de miembro.


Análisis de la Corrección

La corrección mínima correcta es directa:

  • aplicar can.access.terminal tanto a POST /terminal/auth como a POST /terminal/auth/ips
  • asegurar que los miembros no administradores sean denegados de ambas rutas
  • agregar cobertura de regresión para:
    • usuarios no autenticados denegados
    • miembros autenticados denegados
    • administradores y propietarios autorizados permitidos

Eso aborda la falla inmediata del límite de confianza.

En mi parche de validación local, aplicar el middleware de autorización de terminal a esas dos rutas eliminó la ruta de miembro a terminal.

Pero la lección más importante es que el backend no debería confiar en cadenas de comando SSH controladas por el atacante como la fuente principal de metadatos del objetivo.

El endurecimiento recomendado es:

  • vincular las solicitudes de terminal a un identificador de servidor o contenedor autorizado del lado del servidor
  • volver a validar la autorización cuando se ejecuta el comando, no solo cuando se abre el websocket
  • reducir la dependencia de la estructura de comando del terminal proporcionada por el cliente para decisiones de seguridad

Ese es el tipo de remediación que se desea para una funcionalidad de terminal:

  • corregir la falta inmediata de autorización
  • luego ajustar el modelo de confianza más profundo

Divulgación

Este problema fue reportado de forma privada a través del flujo de reporte de seguridad de GitHub.

El reporte incluía:

  • el desajuste de autorización
  • las rutas afectadas
  • la ruta de confianza del backend en tiempo real
  • una validación funcional de laboratorio local
  • prueba de extremo a extremo mostrando salida de shell remoto

El problema fue posteriormente asignado:

CVE-2026-34048


Qué Enseña Realmente Este Error

La lección principal aquí es simple:

la UI solo para administradores no importa si el canal de bootstrap del backend confía en un estado más débil.

Esa es la clase de problema real.

  • Una página puede estar protegida correctamente.
  • Un menú puede estar oculto correctamente.
  • Una pantalla de terminal puede estar bloqueada correctamente.

Nada de eso importa si:

  • la ruta de bootstrap del websocket solo verifica el estado de inicio de sesión
  • el backend del terminal confía en esas respuestas de bootstrap
  • y la sesión resultante puede alcanzar la ejecución de comandos en el host

Una vez que una plataforma gestiona infraestructura, los desajustes de autorización dejan de ser errores comunes de control de acceso. Se convierten en vulnerabilidades que impactan la infraestructura.

Esa es la conclusión real.


Puntos Clave

  • los endpoints de bootstrap del websocket son límites de seguridad reales
  • la autorización solo de UI no es suficiente para funcionalidades de terminal
  • los usuarios con pocos privilegios aún pueden producir un impacto crítico cuando la confianza del backend es incorrecta
  • la enumeración de metadatos del servidor más los UUID de clave visibles hicieron práctico este error
  • la validación de tiempo de ejecución de extremo a extremo importa al defender la severidad
  • la corrección correcta es una autorización consistente del backend, no un bloqueo más fuerte del frontend

Palabras Finales

Esta vulnerabilidad no se trataba de un payload ingenioso.

Se trataba de identificar el límite de confianza correcto.

Coolify pretendía que el acceso al terminal fuera solo para administradores. Pero el backend del terminal en tiempo real confiaba en rutas que solo verificaban si el usuario había iniciado sesión.

A partir de ahí, un miembro del equipo con pocos privilegios podía manejar la ruta del terminal websocket y alcanzar la ejecución del shell en un servidor del equipo.

Es por eso que esto se convirtió en CVE-2026-34048.

Descargar herramienta