Reports
ALTA[SSRF]#3393664

SSRF en la vista previa de enlaces de Rocket.Chat: un dominio que resuelve a una IP interna esquiva el filtro

La vista previa de enlaces de Rocket.Chat 7.11.0 solo bloqueaba IPs internas escritas tal cual en la URL; un dominio apuntando a una IP privada hacía que el servidor pidiera y mostrara contenido de la red interna.

Resumen
Resumen en castellano de un reporte público, no una traducción literal. El código y los comandos se mantienen como en el original.

Resumen

Rocket.Chat genera una vista previa cada vez que alguien manda un enlace en un canal o en un mensaje directo. La función viene activada por defecto y es el propio servidor quien descarga la página enlazada para construir esa vista previa.

Para evitar que esto sirva de puerta a la red interna, la versión 7.11.0 comprobaba el hostname de la URL: si era una dirección IP local, no se generaba la vista previa. El problema es que esa comprobación se hacía solo sobre el texto de la URL. Después de resolver el nombre por DNS, nadie volvía a mirar a qué IP se iba a conectar realmente el servidor.

Así, basta con un dominio cuyo registro DNS apunte a una IP privada para que el filtro lo deje pasar y el servidor de Rocket.Chat haga la petición a un equipo interno. Se trata de una falsificación de peticiones del lado del servidor (SSRF). El investigador indica que es un hallazgo distinto de otro que había enviado antes (#3383079).

Pasos de reproducción

En el entorno de prueba del investigador había un servidor httpbin en la misma red local que Rocket.Chat, en 192.168.100.14:80, inaccesible directamente para el atacante.

  1. Conseguir un dominio en un servicio de registro y apuntarlo a la IP interna 192.168.100.14 (en la prueba se usó *.conamikan.servegame.com, obtenido en noip.com y ya desactivado).
  2. Como control, publicar en cualquier canal o mensaje directo:

`` http://example.com `` Al ser una URL externa normal, aparece la vista previa.

  1. Publicar la IP interna directamente:

`` http://192.168.100.14 `` La protección contra SSRF la detecta y no se muestra vista previa.

  1. Publicar el dominio que resuelve a esa misma IP:

`` http://test.conamikan.servegame.com ``

  1. El servidor de Rocket.Chat resuelve el nombre, envía una petición GET a http://192.168.100.14 y muestra en el chat una vista previa con parte del contenido del servidor httpbin interno.

Impacto

  • Acceso, a través del servidor de Rocket.Chat, a recursos de la red interna que no deberían ser alcanzables desde fuera, y posibilidad de usarlo para escanear esa red.
  • Como la vista previa devuelve fragmentos de la respuesta, el atacante no dispara a ciegas: puede leer parte del contenido de los servicios internos.
  • Con la misma técnica se podrían alcanzar servicios de la nube y sus endpoints de metadatos, con el riesgo de exponer datos sensibles y credenciales del entorno cloud.

Remediación

El reporte figura como resuelto. La corrección que proponía el investigador es validar también la dirección IP obtenida tras la resolución DNS, y no solo el nombre que aparece en la URL.