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-34207 — El filtro SSRF verificaba el texto del nombre de host, pero el destino real se decidía después mediante DNS. Ese desfase permitió que las URL de Webhook controladas por el atacante alcanzaran objetivos de loopback, metadatos y redes privadas. | Kitploit
Herramientas/GitHubGitHub/0xmrma/cve-2026-34207
Análisis de VulnerabilidadesExplotaciónSeguridad WebPruebas de PenetraciónPapers e InvestigaciónAprendizaje y Educación
GitHub0xmrma/cve-2026-34207

CVE-2026-34207

El filtro SSRF verificaba el texto del nombre de host, pero el destino real se decidía después mediante DNS. Ese desfase permitió que las URL de Webhook controladas por el atacante alcanzaran objetivos de loopback, metadatos y redes privadas.

Ver Repositorio
6hace 3 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-34207

El filtro SSRF verificaba el texto del nombre de host, pero el destino real se decidía después mediante DNS. Esa brecha permitió que URLs de Webhook controladas por el atacante alcanzaran loopback, metadatos y objetivos de red privada.

Introducción

Encontré este problema mientras revisaba Typebot, un creador de chatbots de código abierto, con una simple pregunta de seguridad en mente:

¿Qué sucede si la protección SSRF valida el texto del nombre de host, pero el destino real se decide después mediante DNS?

En este caso, esa pregunta llevó a un error real.

La protección SSRF de Typebot para los bloques Webhook / Petición HTTP validaba solo:

  • la cadena de la URL,
  • los literales de nombre de host bloqueados,
  • y los formatos IP literales

No resolvía los nombres de host antes de permitir la petición.

Eso significaba que un nombre de host como ssrf-repro.example podía parecer inofensivo durante la validación, y luego resolverse a:

  • 127.0.0.1
  • 169.254.169.254
  • o espacio RFC1918/red privada

y aun así ser obtenido por el cliente HTTP del backend.

Ese problema se convirtió en CVE-2026-34207.

Typebot: Typebot en GitHub
CVE: CVE-2026-34207
Corregido en: 3.16.0

Esto afectó a Typebot, una plataforma de chatbot de código abierto ampliamente utilizada. En su sitio oficial, Typebot se presenta como confiable para más de 650 empresas en todo el mundo. El sitio también publicita más de 2 millones de chats mensuales y más de 1,5 millones de bots publicados.

photo0

Cadena de ataque

URL de Webhook controlada por atacante -> nombre de host pasa validación SSRF solo literal -> sin resolución DNS antes de la decisión de permitir -> cliente HTTP del backend resuelve nombre de host a destino interno -> petición del lado del servidor alcanza loopback / metadatos / red privada -> los datos de respuesta están disponibles a través de registros de ejecución


Lo que hace Typebot

Typebot es un creador de chatbots.

Permite a los usuarios crear flujos que pueden:

  • hacer preguntas
  • recopilar entradas estructuradas
  • llamar a servicios externos
  • encadenar lógica de negocio
  • y desencadenar peticiones HTTP salientes a través de bloques Webhook / Petición HTTP

Eso significa que la ejecución de peticiones salientes es un límite de seguridad real.

La pregunta importante aquí no era si Typebot soportaba bloques Webhook.

La pregunta real era:

¿La protección SSRF valida el destino real al que se conectará el servidor, o solo el texto del nombre de host que aparece en la URL?

En este caso, solo validaba la forma textual primero.

Ese fue el error.


Por qué valía la pena examinar esta superficie

Las defensas SSRF fallan de maneras muy predecibles.

La mayoría de las veces, los errores interesantes no son:

  • "olvidaste bloquear 169.254.169.254"
  • o "olvidaste bloquear localhost"

Los errores más significativos son errores de límite:

  • la validación ocurre antes de la canonicalización
  • la validación ocurre antes de las redirecciones
  • la validación ocurre antes de la resolución DNS
  • la validación ocurre en una representación, pero la pila de red usa otra

Ese era el lugar adecuado para buscar aquí.

Typebot ya tenía lógica de endurecimiento SSRF para IPs literales de metadatos, loopback, rangos privados y trucos de IP codificadas.

Eso hizo obvia la siguiente pregunta:

¿Qué sucede si el nombre de host no es literalmente peligroso, pero se resuelve a un destino peligroso más tarde?

Eso es exactamente lo que sucedió.


Causa raíz

El problema raíz fue la validación del destino basada en el texto del nombre de host en lugar de la dirección IP resuelta.

En la implementación vulnerable, validateHttpReqUrl():

  • analizaba la URL
  • permitía solo http: y https:
  • bloqueaba una lista corta de nombres de host literales como metadata.google.internal, metadata.goog, metadata y localhost
  • detectaba trucos de IP decimal/hexadecimal/octal literales
  • analizaba direcciones IPv4/IPv6 literales
  • validaba la dirección solo si el nombre de host ya era una IP literal

Esa es la parte importante.

Si el nombre de host era un valor normal como:

ssrf-repro.example

entonces parseIPAddress(hostname) devolvía null, y el validador se detenía allí.

No ocurría resolución DNS antes de la aprobación.

Por lo tanto, la lógica vulnerable se reducía efectivamente a:

const ip = parseIPAddress(hostname);
if (ip) {
  validateIPAddress(ip);
}

Eso significa:

  • las IPs literales peligrosas estaban bloqueadas
  • las IPs codificadas peligrosas estaban bloqueadas
  • pero los nombres de host que se resuelven a IPs peligrosas no lo estaban

La segunda mitad del error estaba en la ruta de ejecución.

En executeHttpRequest(), Typebot primero ejecutaba la validación y luego realizaba la petición real con ky(request.url, ...).

Por lo tanto, la secuencia era:

  • validar la cadena de URL
  • aceptar el nombre de host
  • luego más tarde resolver el nombre de host durante la petición saliente real
  • conectarse al destino interno resuelto

Esa es toda la vulnerabilidad.


Por qué esto es un problema de seguridad, no solo un filtrado incompleto

La distinción importante es dónde se tomó la decisión de confianza.

Muchos errores parecen pequeños si se describen mal.

Si describes este como:

"el filtro de nombre de host estaba incompleto"

suena como un problema de calidad.

Ese no es el problema real.

El problema real era:

  • el servidor tomó una decisión de seguridad antes de conocer el destino real
  • la pila de red luego se conectó a otro lugar
  • y la aplicación trató esa petición como válida

Eso no es una debilidad cosmética de filtrado.

Eso es una falla de límite de confianza.

Y debido a que el ejecutor HTTP registraba los datos de respuesta en los registros de ejecución, el problema ni siquiera era ciego en los casos más fuertes.

Así que esto no era solo:

  • "tráfico interno inesperado ocurrió"

Era:

  • ocurrió tráfico interno
  • y el atacante a menudo podía recuperar la prueba y el contenido de la respuesta a través del comportamiento normal de la aplicación

Eso es una verdadera vulnerabilidad SSRF.


Prueba de concepto

Usé dos capas de prueba porque demostraban dos cosas diferentes.

PoC 1: demostración local con resolución controlada

La primera PoC aisló la causa raíz limpiamente.

Usé un pequeño entorno local que:

  • iniciaba un servidor HTTP loopback en 127.0.0.1
  • validaba una URL como http://ssrf-repro.example:18080/...
  • usaba un resolvedor controlado para que ssrf-repro.example se resolviera a 127.0.0.1
  • luego realizaba la petición

Eso demostró la falla exacta:

  • la validación pasó porque el nombre de host no era un valor bloqueado literal
  • la petición posterior aún alcanzó loopback

La salida capturada mostraba:

  • resultado del validador: pasado
  • resultado de la ejecución de la petición: loopback alcanzado
  • cuerpo de la respuesta devuelto desde el servicio loopback

Eso probó directamente la brecha de validación.


PoC 2: ruta de ejecución real de Typebot

La segunda PoC mostró el error a través de la ruta de funcionalidad real que importa.

La reproducción más simple era:

  1. Mapear un nombre de host benigno a loopback en la máquina donde el backend de Typebot resuelve DNS
  2. Iniciar un servicio HTTP local
  3. Crear un bloque Webhook que apunte a ese nombre de host benigno
  4. Activar el bloque a través de una ruta de vista previa autenticada normal o de ejecución en vivo

Un bloque representativo se veía así:

Descargar herramienta