¿De quién es tu router? Ingeniería inversa de un Comtrend GRG-4355u de Digi

El router que te deja el ISP es un pequeño OpenWrt que no controlas del todo: una cuenta de bajo privilegio que puede reescribir sus propios permisos, un hash root en DES, y un agente TR-069 por el que el operador reconfigura el aparato a distancia. Esto es la ingeniería inversa, lo que encontramos y cómo recuperamos el control, sin secretos ni recetas.

17 min de lecturaRead in English

// Sec · QUANTARMY research

¿De quién es tu router?

Ingeniería inversa de un Comtrend GRG-4355u de Digi

El router que te deja el operador no es tuyo del todo. Lo pagas en la cuota, vive en tu casa y lleva tu tráfico, pero su firmware lo decide el ISP, hay cuentas que no ves, y por un canal de gestión remota el operador puede reconfigurarlo, actualizarlo o reaprovisionarlo cuando quiera. Para un lector de ciberseguridad eso es una pregunta de modelo de amenazas: ¿quién controla de verdad este aparato, y qué puede hacer un atacante que tenga las credenciales de la pegatina?

Este artículo responde a esa pregunta sobre un caso concreto: el Comtrend GRG-4355u que Digi distribuye para fibra. Le hicimos ingeniería inversa —sin abrir la caja, sin UART, sin JTAG, solo por la red local—, encontramos una cadena de debilidades que lleva de una cuenta de invitado a root, y después lo convertimos en un router neutro y endurecido que ya no obedece al operador. Todo sobre equipo y línea propios.

Nota de investigación responsable. Todo lo que sigue es sobre un aparato propio, en la línea propia, en la LAN, con cambios reversibles y rollback documentado. No publicamos ni una credencial, ni un hash, ni un número de serie, ni la receta paso a paso: esto es un análisis de clases de vulnerabilidad y su significado, no un arma contra el parque de un ISP. Un detalle que vale la pena contar: el propio guardrail de la IA con la que trabajamos se negó a ejecutar el login root interactivo, y esos pasos los hizo el humano. La seguridad también se hace así.

El ecosistema: un OpenWrt del fabricante con dueños compartidos

Antes de tocar nada, el inventario. El GRG-4355u lo fabrica Comtrend (aunque Digi lo distribuya), monta un SoC Airoha EN7581 (cuatro núcleos ARM Cortex-A53), y por dentro corre un OpenWrt del fabricante con interfaz LuCI, kernel 5.4.55, bajo la etiqueta de firmware DIG-1.3.22. Las unidades que hemos visto declaran hardware 1.1 o 1.2.

Lo interesante no es la foto del hardware, sino el mapa de quién manda sobre él:

Planos de gestión del Comtrend GRG-4355u: el SoC EN7581 corre firmware DIG-1.3.22 (OpenWrt del fabricante con LuCI); en la LAN conviven la web LuCI sobre HTTPS con rpcd/ubus, SSH que cae en un CLI del fabricante, y cxt_acl_lan, un firewall propio fuera del UCI; por encima, el ACS del ISP gestiona el equipo por TR-069 sobre la VLAN de gestiónComtrend GRG-4355u (HGU de fibra) SoC Airoha EN7581 · quad Cortex-A53 → Firmware DIG-1.3.22 OpenWrt del fabricante + LuCI · kernel 5.4.55; Firmware DIG-1.3.22 OpenWrt del fabricante + LuCI · kernel 5.4.55 → LuCI / HTTPS rpcd · ubus (JSON-RPC); Firmware DIG-1.3.22 OpenWrt del fabricante + LuCI · kernel 5.4.55 → dropbear SSH la cuenta cae en /sbin/cli, no en shell; Firmware DIG-1.3.22 OpenWrt del fabricante + LuCI · kernel 5.4.55 → cxt_acl_lan firewall del fabricante, fuera del UCI; TR-069 / CWMP el ACS del ISP gestiona el equipo → Firmware DIG-1.3.22 OpenWrt del fabricante + LuCI · kernel 5.4.55 (VLAN de gestión · config, firmware, credenciales)VLAN de gestión · config, firmware, credencialesGestión en LANComtrend GRG-4355u (HGU de fibra)SoC Airoha EN7581 · quad Cortex-A53Firmware DIG-1.3.22OpenWrt del fabricante + LuCI · kernel 5.4.55LuCI / HTTPSrpcd · ubus (JSON-RPC)dropbear SSHla cuenta cae en /sbin/cli, no en shellcxt_acl_lanfirewall del fabricante, fuera del UCITR-069 / CWMPel ACS del ISP gestiona el equipo
Quién controla qué: tres planos de gestión en LAN y uno remoto del ISP
  • Cuentas: hay un admin, un user de bajo privilegio —cuyas credenciales suelen venir en la pegatina— y un root. Lo llamativo: entrar por SSH con las cuentas normales no da una shell de Linux, sino un CLI restringido del fabricante (/sbin/cli).
  • El plano web: LuCI habla por HTTPS con rpcd/ubus, el bus de llamadas de OpenWrt. Ahí se decide, por configuración, qué puede leer y escribir cada login.
  • Una capa de control oculta: además del firewall estándar (UCI), el fabricante instala cxt_acl_lan, un control de acceso propio fuera del UCI. Es decir, hay reglas que deciden qué puertos están abiertos que no se ven en la configuración normal del cortafuegos.
  • El ISP, por encima de todo: un agente TR-069 / CWMP conecta con el servidor de gestión (ACS) del operador por una VLAN de gestión separada. Ese canal puede empujar configuración, firmware y credenciales. El dueño de la casa no lo apaga desde la interfaz.

Esa última pieza es la tesis del artículo: el eslabón de confianza más fuerte del aparato no es local, es del operador.

Ingeniería inversa: de invitado a root, por la red

El objetivo no era abrir la caja. El reto era partir de lo que tiene cualquiera —las credenciales de bajo privilegio de la pegatina y acceso a la LAN— y ver hasta dónde se llega. Se llega a root, encadenando cuatro debilidades del plano de gestión.

Cadena conceptual: desde una cuenta local de bajo privilegio, V1 autorización rota permite reescribir la propia ACL, V2 exfiltración de firmware lee bloques crudos por la red, el análisis offline del squashfs da el /etc/shadow, el hash root de fábrica en DES crypt se rompe offline, y se llega a shell root por SSH con persistencia por claveCuenta local de bajo privilegio credenciales de la pegatina · solo LAN → V1 · Autorización rota la cuenta reescribe su propia ACL; V1 · Autorización rota la cuenta reescribe su propia ACL → V2 · Exfiltración de firmware lectura de bloques crudos por la red; V2 · Exfiltración de firmware lectura de bloques crudos por la red → Análisis offline squashfs → /etc/shadow; Análisis offline squashfs → /etc/shadow → Hash root de fábrica en DES crypt obsoleto → se rompe offline; Hash root de fábrica en DES crypt obsoleto → se rompe offline → Shell root por SSH V3 · persistencia por claveCuenta local de bajo privilegiocredenciales de la pegatina · solo LANV1 · Autorización rotala cuenta reescribe su propia ACLV2 · Exfiltración de firmwarelectura de bloques crudos por la redAnálisis offlinesquashfs → /etc/shadowHash root de fábrica en DES cryptobsoleto → se rompe offlineShell root por SSHV3 · persistencia por clave
La cadena, a nivel de clases de vulnerabilidad: ningún comando, solo el mecanismo

V1 · El plano de autorización se rompe a sí mismo. La primera debilidad es la más elegante y la más grave. En rpcd, cada login tiene una lista de permisos. La cuenta de bajo privilegio pertenece, por configuración de fábrica, a un grupo que le permite escribir la propia configuración que define sus permisos. Dicho de otro modo: una cuenta restringida puede editar las reglas que la restringen y ascenderse a permisos de comodín. No hace falta ningún exploit de memoria; es un fallo de modelo de autorización. Es, además, la parte que el propio proyecto dejó preparada para publicación, porque es la lección: el límite de privilegios estaba mal dibujado.

V2 · Exfiltrar el firmware por la red. Con permisos amplios, el siguiente paso es conseguir el firmware, del que no hay copia pública. No hace falta un UART: un endpoint de descarga autenticado del propio sistema web sirve ficheros completos incluyendo dispositivos de bloque crudos, lo que permite volcar las particiones de flash enteras por HTTPS. Es una clase de fallo —lectura de ficheros/bloques más allá de lo previsto— que convierte una sesión autenticada en una exfiltración de firmware y NVRAM. (El detalle exacto de la petición queda fuera: es la parte armable.)

El análisis offline, y el premio: DES crypt en 2026. Con el rootfs en la mano (un squashfs comprimido), se extrae /etc/shadow. Y ahí aparece el hallazgo que un lector de seguridad reconoce al instante: el hash de la contraseña root de fábrica usa DES crypt tradicional —el esquema de los años 70, de 56 bits y solo 8 caracteres significativos—, obsoleto desde hace décadas. Se rompe offline sin esfuerzo. Que un router de gama actual, de 2026, guarde su hash root en DES es un fallo de higiene de primer orden.

V · El muro no era la contraseña. Un detalle instructivo: tener la contraseña root no bastaba, porque el puerto SSH daba timeout. No por cifrado ni por la contraseña, sino porque esa capa oculta del fabricante (cxt_acl_lan) tenía el servicio SSH desactivado por política, fuera del cortafuegos visible. El dueño lo habilita desde el control de acceso del fabricante y el puerto 22 abre. Lección: hay estado de seguridad relevante que la interfaz no te enseña.

V3 · Persistencia limpia. Curiosamente, cambiar la contraseña de root desde la interfaz falla ("usuario no autorizado"), pero la escritura de ficheros sí está disponible con los permisos elevados. Así que la persistencia se hizo por el camino estándar de OpenWrt: una clave pública SSH en el authorized_keys de root. Login por clave, sin tocar /etc/shadow, y con las cuentas admin/user intactas. Reversible borrando un fichero.

V4 · El atajo del CLI. Y por si faltaba, el CLI del fabricante guarda su contraseña de modo privilegiado ("enable") como un doble base64 en la configuración, legible por la cuenta de bajo privilegio. Eso no es cifrado, es ofuscación: se decodifica de forma trivial. Un secreto de fabricante guardado con codificación reversible es, en la práctica, un secreto en claro.

Lo que esto significa

Resumido en clases: autorización rota (V1), exfiltración de firmware por lectura de bloques (V2), hash débil y contraseña por defecto (DES crypt), capa de control oculta (cxt_acl_lan) y secreto de fabricante ofuscado, no cifrado (V4). Ninguna requiere acceso físico. Cualquiera con las credenciales de la pegatina y la LAN puede, en principio, sacar el firmware entero, la NVRAM y obtener root persistente. Y como el aparato lo gestiona el operador por TR-069, el plano de gestión remota es tan crítico como el local.

Qué hicimos después: un router neutro y endurecido

Encontrar root es la mitad entretenida. La mitad útil es recuperar el control del aparato y dejarlo rápido, robusto y bajo tu mando, sin romper la fibra. Todo lo que sigue es reversible y está pensado para sobrevivir a un reinicio.

Estado final: el GRG endurecido con TR-069 fuera para que el ISP deje de reaprovisionar, un debloat reversible de unos 22 servicios, el HW NAT/PPE intacto sin SQM ni BBR; y ante la pregunta de poner firmware propio en el GRG, como el stack PON/OMCI es cerrado sobre el EN7581, las alternativas son un stick SFP ONT 8311 en tu router o el modo bridgeGRG-4355u endurecido root propio · reversible → TR-069 fuera el ISP deja de reaprovisionar; GRG-4355u endurecido root propio · reversible → Debloat (~22 servicios) VoIP, DLNA, UPnP, telemetría…; GRG-4355u endurecido root propio · reversible → HW NAT/PPE intacto sin SQM/BBR a propósito; GRG-4355u endurecido root propio · reversible → ¿Firmware propio en el GRG? PON/OMCI cerrado sobre EN7581; ¿Firmware propio en el GRG? PON/OMCI cerrado sobre EN7581 → Stick SFP ONT (8311) en tu propio router (no viable → alternativas); ¿Firmware propio en el GRG? PON/OMCI cerrado sobre EN7581 → Modo bridge (VLAN20 → LAN5) tu router detrás del GRGno viable → alternativasEndurecimiento reversibleGRG-4355u endurecidoroot propio · reversibleTR-069 fuerael ISP deja de reaprovisionarDebloat (~22 servicios)VoIP, DLNA, UPnP, telemetría…HW NAT/PPE intactosin SQM/BBR a propósito¿Firmware propio en el GRG?PON/OMCI cerrado sobre EN7581Stick SFP ONT (8311)en tu propio routerModo bridge (VLAN20 → LAN5)tu router detrás del GRG
El router endurecido, y por qué el firmware propio no va en el GRG

Autonomía: fuera TR-069. Lo primero, quitar el agente TR-069/CWMP (easycwmp y los paquetes asociados) y deshabilitar sus demonios. Con eso, el operador deja de gestionar, actualizar y reaprovisionar el equipo automáticamente. Es el cambio que más devuelve el control: el router pasa a arrancar de su configuración guardada, sin un ACS decidiendo por ti.

Debloat reversible. Un router doméstico trae un montón de servicios que no usas y que son superficie de ataque: VoIP, DLNA/Samba/FTP, multicast proxy, UPnP, DDNS, SNMP, telemetría varia. El script de optimización apaga alrededor de 22 servicios, guardando el estado para poder revertir. Clave: se hace con lista blanca de lo que nunca se toca —el stack PON (la fibra), el firewall, dropbear, rpcd, uhttpd, DNS/DHCP, NTP— para no romper nada esencial.

La optimización que no hicimos, a propósito. Aquí la decisión de ingeniería interesante: nada de SQM ni de tuneos de BBR/buffers. Suena contraintuitivo, pero el EN7581 hace NAT por hardware (HW NAT/PPE); meter colas de software o reescribir los buffers sacaría el tráfico del camino del hardware y lo haría más lento. El AQM ya lo hacen las colas del propio chip. La única sintonía de red fue subir el conntrack_max (de 16.384 a 65.536) y bajar el nivel de log de consola. Honestidad técnica: el cambio de gobernador de CPU se dejó anotado pero en el EN7581 resulta ser un no-op (se queda en userspace), así que no cuenta como mejora.

Robustez y persistencia. Los cambios viven en el overlay (UBIFS), así que sobreviven a un reinicio. Un reset de fábrica sí los borra —por diseño del aparato—, y por eso el proyecto tiene una re-entrada automatizada que vuelve a dejar el router en su estado conocido sin intervención manual. Cada cambio tiene su procedimiento de vuelta atrás.

El router neutro. El objetivo final era poner tu router detrás y usar el GRG solo como ONT. Se puede, puenteando la VLAN de Internet (la 20) al puerto de 10 Gb (LAN5): el GRG hace de ONT tonto y tu router hace de router. En nuestro montaje, además, un segundo equipo quedó como punto de acceso tonto para la Wi-Fi.

¿Y firmware propio? El veredicto honesto

La pregunta natural de cualquiera que llega hasta aquí: ¿y por qué no flashear OpenWrt de verdad y olvidarse del firmware del fabricante? La respuesta, tras evaluarlo, es que hoy no es viable en el GRG si quieres conservar la fibra.

El motivo es el SoC. El EN7581 es a la vez el router y la ONT (la parte óptica), y todo el stack de fibra —los módulos de kernel del MAC PON, el demonio de red de Airoha, la pila OMCI— es binario cerrado y atado al kernel 5.4.55. OpenWrt upstream tiene soporte básico del EN7581 (Ethernet, Wi-Fi, routing), pero no hace PON: flashearlo significa quedarte sin fibra. Reutilizar los blobs del fabricante sobre un OpenWrt moderno tampoco va: los módulos de 5.4.55 no cargan en kernels 6.x y nadie ha portado la pila PON del EN7581.

Las alternativas realistas, por tanto, no pasan por el GRG:

  • Un stick SFP ONT "8311" (el ONT en un transceptor) en el puerto SFP de tu propio router, programado con la identidad de la línea. Tu router es el router; el operador solo controla el stick por OMCI.
  • Modo bridge, que es lo que dejamos montado: el GRG como ONT en puente y tu router detrás.

Decir "no se puede, y esto es lo que sí" es parte del oficio. Un resultado honesto vale más que una promesa que brickea la fibra.

Modelo de amenazas y lo que nos llevamos

  • El plano de gestión manda sobre todo lo demás. Da igual lo fuerte que sea la contraseña Wi-Fi si una cuenta local puede reescribir sus propios permisos y si el operador puede empujar configuración por TR-069. La seguridad de un router se juega en quién controla su gestión, local y remota.
  • Los valores por defecto a escala de parque son el riesgo real. Una contraseña trivial y un hash root en DES crypt, si son comunes a toda la flota, exponen a cada unidad al mismo compromiso local. DES en 2026 es un fallo de higiene difícil de justificar.
  • Ofuscación no es cifrado. Un doble base64 "protegiendo" un secreto de fabricante es un secreto en claro con un paso extra. Lo mismo vale para cualquier "codificación" que un atacante deshace mentalmente.
  • Hay planos de control que no ves. Un firewall del fabricante fuera del UCI, o un TR-069 que no puedes apagar desde la interfaz, significan que no tienes visibilidad completa del estado de seguridad de tu propio aparato. Recuperarla —quitando TR-069, mapeando cxt_acl— es parte del endurecimiento.
  • Investiga sobre lo tuyo, y con freno. Equipo propio, línea propia, LAN, cambios reversibles, y sin publicar lo que arma a un tercero. Que un guardrail te pare el login root y lo tenga que hacer el humano no es un estorbo: es el modelo de responsabilidad funcionando.

El router del salón resultó ser un objetivo de seguridad completo: autorización rota, firmware exfiltrable por la red, criptografía de los setenta y un operador con un canal de control que el dueño no ve. Convertirlo en un aparato neutro, rápido y bajo tu mando fue la recompensa; el mapa de confianza —y de quién manda de verdad— es lo que nos llevamos.

Recursos

  • OpenWrt — el sistema sobre el que se construye el firmware del fabricante y la alternativa de referencia: openwrt.org.
  • Proyecto 8311 — firmware para sticks SFP ONT, la vía realista al "router propio" en fibra: busca la comunidad 8311.
  • Sobre TR-069 / CWMP y la gestión remota de CPE: el estándar del Broadband Forum (TR-069).