- Las solicitudes HTTP de la red doméstica se reproducían tal cual unos 10 segundos después desde una IP de DigitalOcean, lo que reveló indicios de que el tráfico de varios dispositivos detrás de una gateway Cox Panoramic Wifi estaba expuesto al exterior
- El rastreo en VirusTotal y URLscan mostró que esa IP había estado vinculada anteriormente con dominios de phishing y con dominios masivos del formato
word+6 digits+TLD, lo que planteó la posibilidad de un algoritmo de generación de dominios para C&C - Durante el análisis del portal Cox Business en 2024, quedaron expuestos una API basada en Spring detrás de
/api/cbma/y documentos Swagger, y se produjo una omisión de verificación de permisos con solo repetir solicitudes - La API expuesta permitía buscar clientes, consultar PII de cuentas, consultar direcciones MAC de equipos e incluso cambiar configuraciones WiFi; la lógica de generación de
encryptedValuetambién podía invocarse desde el JavaScript del frontend - Cox retiró la API expuesta en menos de 6 horas tras el reporte, pero este servicio comenzó en 2023, por lo que la causa de la intrusión original al módem en 2021 sigue siendo un caso aparte
Reproducción de solicitudes HTTP detectada en la red doméstica
- Para probar una vulnerabilidad blind XXE, se levantó un servidor HTTP en Python en una instancia de AWS y luego se envió una solicitud a
/test123desde una computadora en casa- La solicitud original llegó desde la IP doméstica
98.161.24.100 - Unos 10 segundos después, una IP desconocida
159.65.76.209volvió a enviar una solicitud a la misma ruta
- La solicitud original llegó desde la IP doméstica
- Al solicitar la misma URL desde Safari en iPhone, la misma IP volvió a reproducir la solicitud
- El mismo fenómeno se repetía no solo en la computadora de casa, sino también en otros dispositivos de la red doméstica
- La misma IP reprodujo solicitudes también con una nueva instancia de AWS y Nginx, y con una instancia de GCP, lo que redujo la probabilidad de que fuera un problema propio de AWS
- Las posibilidades restantes eran una intrusión en el ISP, en el módem o en la ruta de red
- Al consultar el propietario de la IP,
159.65.76.209resultó ser una dirección de DigitalOcean, no una dirección del ISP
Infraestructura maliciosa previa vinculada con la IP de DigitalOcean
- Una consulta en VirusTotal confirmó dominios que en el pasado resolvían a esa IP
- De los 5 dominios más recientes, 3 eran sitios de phishing y 2 parecían servidores de correo
- Dominios de ejemplo:
regional.adidas.com.pyisglatam.onlineisglatam.tkmx12.limit742921.tokyomx12.jingoism44769.xyz
isglatam.onlineeisglatam.tkeran sitios de phishing dirigidos contra la empresa sudamericana de ciberseguridadisglatam.com- En el sitio real de ISG Latam se confirmó que es una empresa con sede en Paraguay y socia de Crowdstrike, AppGate, Acunetix, DarkTrace y ForcePoint
- En URLscan quedaron rastros de que ambos dominios alojaban un sitio de phishing BeEF típico
- Registro relacionado: resultado de URLscan
- La misma IP estaba vinculada con un dominio relacionado con Adidas, phishing a ISG Latam y actividades que parecían reproducción de tráfico de módem
- Aunque existía la posibilidad de que la IP hubiera rotado entre varios propietarios, los intervalos entre actividades eran largos, por lo que no parecía probable que hubiera sido reasignada de inmediato a otro usuario malicioso
Reemplazo del módem y nueva investigación 3 años después
- El equipo en uso era una gateway Cox Panoramic Wifi, y se reemplazó por un módem nuevo en una tienda de Cox
- Como el equipo anterior era alquilado al ISP, debía devolverse
- No fue posible realizar un volcado del firmware ni ingeniería inversa
- Tras instalar el módem nuevo, la reproducción de solicitudes HTTP se detuvo por completo
- Ya no aparecía ninguna otra IP en los logs
- En ese momento era difícil investigar más allá de concluir que el módem anterior había sido comprometido
- A inicios de 2024, unos 3 años después, al reabrir la investigación con conocidos del sector de seguridad, llamaron la atención formatos de dominio como
limit742921.tokyoyjingoism44769.xyz- Al hacer búsquedas reverse IP sobre las IP relacionadas, se confirmaron más de 1,000 dominios con el mismo patrón
- Todos los dominios tenían la estructura
word+6 numbers+TLD- Por el registro masivo y la estructura algorítmica, parecía un algoritmo de generación de dominios usado por operadores maliciosos para ocultar direcciones de servidores C&C
- El último dominio observado se registró el 17 de marzo de 2023, y desde entonces ya no había hosts resolviendo
- El módem nuevo de reemplazo era del mismo modelo, pero según búsquedas en Google no se encontraron vulnerabilidades públicas para ese modelo
Hipótesis a partir de herramientas de soporte del ISP y TR-069
- Al mover un módem Cox a una nueva ubicación, se confirmó que un agente de soporte del ISP podía cambiar la configuración del equipo de forma remota
- El agente de soporte podía actualizar la configuración del equipo, cambiar la contraseña WiFi y revisar los dispositivos conectados
- Esta administración remota se realiza mediante el protocolo TR-069, implementado en 2004
- Es un método para que el ISP administre equipos dentro de su propia red usando el puerto
7547 - El protocolo también se trató en una charla de DEF CON, pero no era una superficie expuesta al exterior
- Es un método para que el ISP administre equipos dentro de su propia red usando el puerto
- El foco de la investigación pasó del protocolo en sí al sitio web interno de administración de equipos que usan los agentes y a las API detrás de él
- Si estas API podían consultar o modificar la configuración de los equipos de clientes, o ejecutar comandos, podían convertirse en una vía de intrusión al módem
Estructura de la API del portal Cox Business
- El portal Cox Business ofrece administración remota de equipos, configuración de reglas de firewall y monitoreo de tráfico de red
- Se extrajeron rutas desde el archivo JavaScript del frontend de la página de login,
main.36624ed36fb0ff5b.js- Se confirmaron más de 100 llamadas a API basadas en
/api/cbma/ - Ejemplos:
/api/cbma/voicemail/services/voicemail/inbox/transcribeMessage//api/cbma/profile/services/profile/userroles//api/cbma/accountequipment/services/accountequipment/equipments/eligibleRebootDevice
- Se confirmaron más de 100 llamadas a API basadas en
/api/cbma/mostraba respuestas distintas a las del frontend general, por lo que parecía un reverse proxy hacia un backend separado- Una solicitud a
/api/anything_else/exampledevolvía una redirección 301 - Una solicitud a
/api/cbma/exampledevolvía 500 Internal Server Error
- Una solicitud a
- La solicitud de registro incluía varios encabezados relacionados con autenticación
Clientid: cbmauserApikey: 5d228662-aaa1-4a18-be1c-fb84db78cf13Cb_session: unauthenticateduserAuthorization: Bearer undefined
- Al cambiar el método HTTP, se devolvió una respuesta de error con formato Spring, lo que confirmó que el backend estaba basado en Spring
Documentación Swagger y bypass de recursos estáticos
- No se encontraron rutas de Spring actuator, pero algunas rutas de Swagger UI sí eran accesibles
- La ruta
/api/cbma/userauthorization/swagger-ui/index.htmlrespondía
- La ruta
- La página Swagger cargada inicialmente estaba vacía
- Los recursos estáticos como
.png,.jsy.cssse enrutaban a la ruta del host original en lugar de al proxy de la API, generando redirecciones infinitas
- Los recursos estáticos como
- Con Burp Intruder, al probar agregando desde
%00hasta%FFal final de la URL, se obtuvo 200 OK al añadir%2f, la/codificada en URL, después de.js- Ejemplo:
/swagger-initializer.js%2f
- Ejemplo:
- Al usar match-and-replace de Burp para agregar
%2fa todos los recursos estáticos, la documentación Swagger cargó correctamente - En total se confirmaron alrededor de 700 llamadas a API
account: 115voiceutilities: 73user: 70datainternetgateway: 57accountequipment: 55billing: 53ticket: 52- Otros como
profile,voicecallmanagement,voicemail,userauthorization,csr, etc.
- Las API directamente relacionadas con equipos y cuentas de clientes parecían ser principalmente
accountequipment,datainternetgatewayyaccount
Omisión de verificación de permisos mediante solicitudes repetidas
- Al revisar si era posible acceder sin autenticación a todos los endpoints GET, algunos devolvían errores de autenticación y otros devolvían 200 OK
- El endpoint
profilesearchdevolvía inicialmente una respuesta exitosa con resultados de búsqueda vacíos- La misma solicitud a veces devolvía
Authorization Error-Invalid User Tokeny, al enviarla de nuevo, tenía éxito
- La misma solicitud a veces devolvía
- Al reenviar la misma solicitud varias veces, el error de permisos desaparecía y se devolvían resultados de búsqueda de clientes
- Una búsqueda de
coxdevolvía10000+ hits - Una búsqueda de
fbidevolvía resultados con direcciones físicas de oficinas de campo del FBI que eran clientes comerciales de Cox
- Una búsqueda de
- Solo repitiendo solicitudes a la API era posible una omisión de permisos, y el mismo problema parecía afectar a más de 700 API en general
Acceso a equipos de clientes y consulta de cuentas
- Para verificar si la API de Cox Business también podía acceder a equipos de redes residenciales, se probó una API simple que recibía una dirección MAC
- Endpoint:
/api/cbma/accountequipment/services/accountequipment/ipAddress?macAddress=:mac
- Endpoint:
- Tras confirmar la dirección MAC desde la propia cuenta Cox y repetir la solicitud, se devolvió la dirección IPv4 del módem propio
- Se confirmó que esta API podía comunicarse con equipos reales de Cox
- También funcionaba una API de listado de equipos que usa el ID de cuenta
- Endpoint:
/api/cbma/accountequipment/services/accountequipment/v1/equipments/{accountId} - La respuesta incluía información de equipos de internet, voz y TV
- Se devolvían modelo del equipo, tipo de equipo, dirección MAC, lista de puertos y número de serie
- Endpoint:
- Una API de consulta de usuario basada en email también devolvía información de cuentas comerciales
- Solicitud de ejemplo:
/api/cbma/user/services/user/admin@cox.net - Incluía email, nombre, teléfono, estado, permisos, si era propietario del perfil y email alternativo
- Solicitud de ejemplo:
- Una solicitud POST similar para actualizar cuentas también funcionaba, confirmando que era posible leer y escribir en cuentas comerciales
encryptedValue y cambio de configuración de equipos
- Las solicitudes para cambiar configuraciones de hardware requerían un parámetro llamado
encryptedValue- Ejemplos: cambiar contraseña del equipo, cambiar configuración WiFi
- Se rastreó en el JavaScript del frontend la lógica para generar y descifrar
encryptedValueencryptWithSaltandPaddingdecryptWithSaltandPadding
- Como el PIN de 4 dígitos configurado al registrar una cuenta también se cifraba con la misma función, era posible poner un breakpoint en el punto donde el navegador llamaba a esa función e invocarla directamente desde la consola
- Al descifrar un
encryptedValueobtenido de una respuesta real de cuenta, se confirmó un valor con el siguiente formato- Número de cuenta Cox
- Nombre del equipo
- ID del equipo
- Valor desconocido
- Dirección MAC
- Etiqueta
- Incluso al rellenar con valores arbitrarios la mayoría de los campos, como el número de cuenta, y usar solo una dirección MAC válida para generar un nuevo
encryptedValue, la solicitud tenía éxito- El servidor no verificaba que el ID de cuenta coincidiera con la dirección MAC
Posibilidad de cambiar la configuración de cualquier módem
- Se envió una solicitud POST contra el equipo propio para cambiar el SSID WiFi a
Curry- Endpoint:
/api/cbma/accountequipment/services/accountequipment/gatewaydevice/wifisettings - El cuerpo de la solicitud incluía
wifiSettings,additionalPropertiesyencryptedValue
- Endpoint:
- La respuesta fue
{"message": "Success"}y luego la red se desconectó brevemente y se reinició unos 5 minutos después- El SSID cambió efectivamente a
Curry
- El SSID cambió efectivamente a
- Este comportamiento demostró que los cambios de configuración de equipos mediante la API se aplicaban a los equipos reales
- Un atacante podía obtener el UUID de cuenta mediante búsqueda de clientes
- Consultar las direcciones MAC de los equipos conectados
- Leer o cambiar la configuración del equipo según la dirección MAC
- Este nivel de permisos equivalía a un acceso similar al del equipo de soporte del ISP, y era una vía que podía afectar a millones de equipos Cox
Alcance del impacto y escenarios de ataque
- La combinación de vulnerabilidades mostró que un atacante externo, sin condiciones previas, podía hacer lo siguiente
- Ejecutar comandos y cambiar configuraciones en millones de módems
- Acceder a PII de clientes de Cox Business
- Obtener permisos similares a los del equipo de soporte del ISP
- Cox es el proveedor privado de banda ancha más grande de Estados Unidos, el tercer proveedor de TV por cable más grande y el séptimo operador telefónico más grande, además de ser el ISP más popular en 10 estados
- Flujo de ataque de ejemplo:
- Buscar objetivos de Cox Business por nombre, teléfono, email o número de cuenta
- Usar el UUID devuelto para consultar toda la PII de la cuenta, direcciones MAC de equipos, emails, teléfonos y direcciones
- Usar la dirección MAC del hardware para consultar la contraseña WiFi y los dispositivos conectados
- Ejecutar comandos arbitrarios, cambiar propiedades del equipo y secuestrar la cuenta de la víctima
- Una parte importante de las más de 700 API expuestas ofrecía funciones de administrador, y al repetir solicitudes se producía el mismo problema de permisos
Reporte a Cox y corrección
- La vulnerabilidad fue reportada mediante el responsible disclosure program de Cox
- Cox retiró las llamadas a la API expuesta en menos de 6 horas tras el reporte y comenzó a trabajar en la corrección de la vulnerabilidad de permisos
- Al día siguiente ya no era posible reproducir la vulnerabilidad
- Cronograma público:
- 2024-03-04: reporte de la vulnerabilidad a Cox
- 2024-03-05: aplicación de hotpatch; endpoints comerciales no esenciales comenzaron a devolver 403 y dejaron de funcionar
- 2024-03-06: se informó por email a Cox que la vulnerabilidad ya no podía reproducirse
- 2024-03-07: Cox respondió que iniciaría una revisión de seguridad integral
- 2024-04-10: se informó a Cox la intención de publicar tras 90 días desde el reporte
- 2024-04-29: se compartió con Cox el enlace al borrador del blog
Dudas pendientes
- Cox investigó si la ruta de vulnerabilidad específica había sido explotada en el pasado y confirmó que no había historial de explotación
- El servicio comenzó a operar en 2023
- Como la intrusión original al módem ocurrió en 2021, la vulnerabilidad pública de la API de Cox Business no fue la causa de aquella intrusión
- Cox informó que no tenía ninguna relación con la IP de DigitalOcean
- El equipo sí fue hackeado realmente, pero mediante un método distinto a la vulnerabilidad pública de la API
- El módem no estaba configurado para permitir acceso externo y nunca se había iniciado sesión en el equipo desde la red doméstica
- Entre otras posibles vías se mencionó algo como un 0day que llevara de CSRF local a RCE
- La mayor duda es por qué el atacante reprodujo las solicitudes HTTP
- Si ya estaba dentro de la red, podía acceder sin ser detectado, pero no se confirmó por qué reprodujo todas las solicitudes HTTP
1 comentarios
Opiniones en Hacker News
Buen artículo y fácil de seguir. En particular, me gustó que Cox no atacara a quien reportó el problema ni lo negara, sino que actuara como un ejemplo de respuesta de seguridad responsable, que es lo que uno esperaría en una situación así.
Me gustaría ver una publicación de seguimiento sobre cuál fue el bug que permitía de forma intermitente el acceso no autorizado a la API. Este tipo de errores puede pasarse por alto fácilmente con pruebas superficiales o, según la causa, quizá ni siquiera reproducirse en un entorno de pruebas.
Hace tiempo descubrí por casualidad una vulnerabilidad grave en una telco tradicional, y solo con los canales normales de soporte al cliente me tomó casi una semana llegar a la persona adecuada; la organización de soporte no pudo escalar el caso en absoluto. En el caso de Cox también, un profesional de infosec llegó personalmente con un equipo infectado, pero la organización de soporte no supo manejarlo bien.
Lo molesto en estas situaciones es cuando el ISP te obliga a usar su módem o router. Por ejemplo, AT&T fiber usa autenticación 802.1X basada en certificados para acceder a la red; sin eso, se podría conectar cualquier equipo al ONT.
Hay o hubo métodos para saltárselo, pero no quiero pasar por todo ese proceso solo para usar internet, así que desactivo todas las funciones del router de AT&T y conecto detrás mi propio router, que mantengo actualizado. Si hackean el router de AT&T, quizá no me dé cuenta hasta que el servicio se vea afectado. Menos mal que hoy casi todo usa HTTPS.
Si el ONT se reinicia, probablemente haya que hacerlo de nuevo, pero en mi caso AT&T me dio un UPS para el ONT, así que debería reiniciarse con poca frecuencia. Personalmente armé una configuración compleja basada en una NIC de bypass: cuando el firewall está apagado o reiniciándose, el tráfico pasa por el módem de AT&T; cuando está encendido, mi firewall recibe el tráfico y lo reenvía selectivamente a través del módem. Pero, en realidad, con un switch no administrado alcanza.
Pero hasta ahí llegan mis elogios a Cox. Llevo dos años sufriendo pérdida intermitente de paquetes, y aunque recopile datos que indican que cierto nodo probablemente está sobresuscrito, no parece haber una ruta de escalamiento de soporte para llegar a alguien que lo entienda.
En la práctica, el estado de 802.1X no se valida del lado del servidor. El estándar dice que, si se requiere 802.1X y no se realiza, el módem no debería reenviar tráfico, pero la mayoría simplemente lo reenvía o puede modificarse para que lo haga. Del lado de AT&T no lo verifican y siempre dejan pasar el tráfico; internamente, eso es lo que está ocurriendo.
Es un artículo muy legible y la investigación es excelente. También está bueno ver un caso en el que una gran empresa no le tira una bomba nuclear al investigador de seguridad.
No estoy seguro, pero sospecho que las solicitudes a la interfaz local de administración de este router Nokia no se autentican correctamente. Hace poco me dieron el mismo equipo, y había configuraciones que no se podían cambiar con privilegios de administrador normal; el ISP no me dio una cuenta de superadministrador. Pero si con el inspector de la página volvía a habilitar los campos desactivados y cambiaba los valores, la API los aceptaba sin más. En ese estado, si una aplicación pudiera ejecutarse dentro de la red interna, no sería difícil tomar control del router de esa forma, aunque parece requerir condiciones bastante específicas.
Cox es claramente un objetivo atractivo, y como muestra el ejemplo del artículo, una sola vulnerabilidad podría poner en riesgo incluso una oficina de campo del FBI. Creo que habría sido más correcto escribir “Cox afirmó haber investigado usos maliciosos anteriores” en lugar de “Cox investigó usos maliciosos anteriores y no encontró registros”.
¿Se puede confiar en la afirmación de que “no hubo historial de explotación previa”? Toda la red parece estar llena de agujeros como queso suizo.
Muchos routers requieren actualizar el firmware manualmente. Los routers GL.iNet tuvieron varias vulnerabilidades de ejecución remota de código en los últimos 6 meses, así que conviene revisar rápido que tu router no haya sido hackeado y, si es posible, actualizar el firmware.
Desde el punto de vista de un usuario común, los síntomas visibles fueron una caída en la velocidad de Internet, cortes de la señal Wi‑Fi y fallas al conectar dispositivos, y que el propio router estaba conectado a Internet pero la página interna de administración (192.168.8.1) no respondía. En mi caso, el atacante instaló la app Pawns de IPRoyal para convertir el router en un servidor proxy y ganar dinero; también robó registros del sistema con el tiempo de uso y si había conexión al NAS, y tenía una shell inversa. Lo mejor para resolverlo es, en este orden: actualizar el firmware, restablecer el router para eliminar el malware, desactivar SSH y apagar accesos remotos como DNS dinámico. Si se necesita acceso remoto, se pueden evaluar opciones como Cloudflare Tunnel, Zero Trust, GoodCloud, ZeroTier o Tailscale, aunque no sé bien cuál sería la más adecuada. GL.iNet no sigue el principio de mínimo privilegio y, por defecto, ejecuta procesos como root; además, SSH viene activado por defecto con acceso root, así que parece mejor evitarlo.
Que “no hubiera historial de abuso” podría deberse a que desde el principio no había suficientes logs o materiales de auditoría, o a que después del hackeo no quedaron logs.
¿Qué sistema de autenticación deja pasar llamadas al azar de vez en cuando? Parece realmente incompetente.
¿Le pagaron? Esta persona básicamente salvó a Cox y les avisó de una toma total de la infraestructura de seguridad que ni siquiera era fácil de descubrir.
Parece que no recibió nada a cambio de “hacer lo correcto”, y eso es bastante insultante. La forma en que la empresa habrá visto a alguien que llegó a sus oficinas con información importante seguramente fue muy distinta a cómo él se percibía a sí mismo. Casos como este muestran muy bien por qué nunca se debería reportar un 0day.
Una pregunta que sigue abierta es cómo los atacantes capturaron su tráfico HTTP.
Algunos CPE tienen una función de depuración parecida a un Wireshark en la nube. No sé si las imágenes de firmware de producción de Cox incluyen algo así. Normalmente hay firmware de producción y firmware de pruebas por separado, lo que hace más difícil probar problemas del entorno de producción. Cox debería poder verificar qué versiones de firmware hay en campo; un ISP puede actualizar automáticamente firmware que no coincide con una versión específica, y como es un módem de Cox, es muy probable que también tengan el firmware. Si era firmware de depuración, me da curiosidad cómo se instaló y cómo siguió ahí.
Sería fácil interceptar todos los datos del puerto 80, parsear los encabezados HTTP y hacer lo necesario. Aunque no tengo claro por qué alguien reproduciría las solicitudes.
Es una de las razones por las que no deberíamos recibir con entusiasmo los módems de cable provistos por el ISP con Wi‑Fi integrado, y por las que hay que asegurar bien los endpoints y servicios dentro de la LAN. Como mínimo, se necesita TLS y DNS over TLS en el tramo módem/ISP.
Yo simplemente lo dejo en modo bridge, apago el Wi‑Fi y hago que todo el funcionamiento de red quede a cargo de mi propio equipo. El último módem alquilado al ISP que tuve no recibió actualizaciones de firmware durante casi 10 años, aunque gracias a eso fue muy estable.
Free, donde trabajo, es un ISP francés y también ofrece gateways domésticos en Italia a través de Iliad; incluso seguimos actualizando equipos lanzados en 2011. Corren Linux 6.4 reciente y ofrecen funciones modernas como airtime QoS, actualizaciones de la app móvil y varias funciones de software.
Compré un router relativamente decente, instalé OpenWrt y lo conecté a la red en bridge a través del equipo del ISP, y funciona bien. Ahora uso HTTPS incluso dentro de la LAN.