redesinternet

Descifrado de la configuración en routers Sagemcom

Cómo descifré el archivo de configuración del Sagemcom F@ST 5655v2 y 5657

Descifrado de la configuración en routers Sagemcom
Índice
  1. Punto de partida
  2. Extracción del firmware
  3. Identificando el formato del backup
  4. Buscando la clave dentro del firmware
  5. Localizando H235_KEY
  6. Descifrando device.cfg
  7. Esquema completo
  8. Conclusiones
  9. Finalizando

En este artículo voy a explicar, de forma resumida, el proceso que seguí para descifrar una copia de seguridad de la configuración de un router Sagemcom F@ST 5655v2. Este método también es aplicable al Sagemcom F@ST 5657.

El equipo utilizaba el firmware:

SGDV10000059

Al exportar la configuración desde el WebInterface, el router generaba un archivo device.cfg. Sin embargo, al abrirlo con un editor hexadecimal o intentar descomprimirlo, era evidente que no se trataba de un XML, ZIP o GZIP normal.

El objetivo era averiguar:

- Qué formato utilizaba el archivo
- Qué algoritmo de cifrado empleaba
- De dónde obtenía el router la clave
- Cómo recuperar finalmente el XML de configuración

Punto de partida

En este modelo no disponía inicialmente de una shell funcional desde la que poder inspeccionar directamente el sistema.

Por suerte, posteriormente pude conseguir:

- Un volcado NAND/UBI reciente del F@ST 5655v2
- Una copia de seguridad device.cfg generada por ese mismo router

Era importante que ambos archivos pertenecieran al mismo equipo o, al menos, que el volcado incluyera los parámetros permanentes de ese dispositivo.

Esto terminó siendo fundamental, porque la clave utilizada para proteger la configuración no es completamente genérica.


Extracción del firmware

El primer paso fue extraer el contenido del volcado NAND, cortesía de mi amigo Asu (muchas gracias).

El firmware estaba organizado mediante volúmenes UBI, así que hubo que identificar y extraer los diferentes volúmenes hasta obtener los sistemas de archivos que utilizaba el router.

Dentro del contenido extraído aparecieron las librerías, ejecutables y archivos de configuración habituales de un sistema Linux embebido.

Entre todo ese contenido, las librerías más interesantes para este análisis fueron:

libgsdf.so
libsmu.so

También apareció un archivo llamado:

permanent_param

Este archivo contiene parámetros permanentes propios del dispositivo. Más adelante veremos que uno de esos parámetros interviene directamente en la generación de la clave.


Identificando el formato del backup

Analizando la cabecera y la estructura de device.cfg, pude comprobar que el archivo utilizaba la cabecera:

AEAD 10

Este formato ya aparece en otros routers del fabricante.

A partir de ese momento, el problema parecía estar bastante claro: probablemente el algoritmo general no había cambiado, pero faltaba conocer la clave utilizada por este modelo concreto.

El proceso interno del archivo era, de forma simplificada:

Contenedor AEAD 10
        ↓
Descifrado AES en modo CTR
        ↓
Datos comprimidos con GZIP
        ↓
Configuración XML

Por tanto, para llegar al XML primero había que interpretar correctamente el contenedor, descifrar su contenido y después descomprimir el resultado.


Buscando la clave dentro del firmware

El siguiente paso fue analizar las librerías relacionadas con la exportación e importación de la configuración.

Siguiendo las referencias entre libgsdf.so y libsmu.so, apareció una llamada especialmente interesante:

gsdfSetCryptoKey(0x3001, 0, key, 0x20);

Esta función registraba una clave criptográfica de:

0x20 bytes = 32 bytes

Después de seguir la construcción de la variable key, se pudo ver que no se utilizaba una clave fija incluida directamente en el firmware.

La clave se construía concatenando tres valores:

"A91D2F0C" + H235_KEY + "9BD25A01"

Es decir:

Prefijo fijo
    +
Clave H235 propia del dispositivo
    +
Sufijo fijo

El prefijo y el sufijo son comunes, pero el valor central cambia en cada equipo.

El resultado final es una cadena de 32 caracteres que la función entrega como una clave de 32 bytes.

Un detalle importante es que esa cadena se utiliza tal cual. No hay que convertir los caracteres hexadecimales en una clave binaria de 16 bytes.


Localizando H235_KEY

Ya sabíamos cómo se construía la clave, pero todavía faltaba obtener el valor de:

H235_KEY

Siguiendo de nuevo el código del firmware apareció esta función:

bsp_get_permParam_h235Key()

Su nombre daba una pista bastante clara.

La función recuperaba el valor desde los parámetros permanentes del router, almacenados en:

permanent_param

Dentro del volcado del equipo pude localizar el valor correspondiente a H235_KEY.

No voy a publicar aquí la clave real de mi router, pero tendría un formato parecido a este:

H235_KEY = XXXXXXXXXXXXXXXX

Con ese valor ya era posible construir la clave completa:

A91D2F0CXXXXXXXXXXXXXXXX9BD25A01

Esto también explica por qué una clave obtenida de otro Sagemcom, aunque utilice el mismo formato de backup, no tiene por qué funcionar.

El algoritmo es el mismo, pero una parte de la clave depende del dispositivo.


Descifrando device.cfg

Una vez obtenida la clave completa, el resto del proceso consistió en reproducir lo que hacía el propio firmware.

De forma resumida:

1. Leer el contenedor AEAD 10
2. Extraer los parámetros necesarios para AES-CTR
3. Utilizar la clave de 32 bytes
4. Descifrar el contenido
5. Comprobar que el resultado comienza con una cabecera GZIP
6. Descomprimirlo
7. Guardar el XML resultante

Al utilizar la clave correcta, el resultado descifrado comenzó con la cabecera habitual de GZIP:

1F 8B

Después de descomprimirlo apareció finalmente el XML completo de configuración.

Dentro del archivo estaban los parámetros del router, incluyendo la configuración de Internet, GPON, telefonía, Wi-Fi y otros servicios gestionados por el operador.


Esquema completo

El proceso completo quedaría más o menos así:

Volcado NAND del router
          │
          ▼
Extracción de los volúmenes UBI
          │
          ▼
Análisis de libgsdf.so y libsmu.so
          │
          ▼
Localización de gsdfSetCryptoKey()
          │
          ▼
Clave = prefijo + H235_KEY + sufijo
          │
          ▼
Obtención de H235_KEY desde permanent_param
          │
          ▼
Descifrado AES-CTR del contenedor AEAD 10
          │
          ▼
Descompresión GZIP
          │
          ▼
Configuración XML

Conclusiones

Finalmente, el formato de las copias de seguridad del F@ST 5655v2 no era completamente nuevo.

Sagemcom seguía utilizando el esquema:

AEAD 10 → AES-CTR → GZIP → XML

La diferencia principal estaba en la clave.

En este firmware, la clave se construye utilizando dos partes fijas y un valor H235_KEY almacenado en los parámetros permanentes del dispositivo:

"A91D2F0C" + H235_KEY + "9BD25A01"

Esto significa que no existe una única clave universal válida para todos los F@ST 5655v2. Para descifrar un backup es necesario disponer del valor H235_KEY correspondiente a ese router.

Lo más complicado no fue realmente implementar AES-CTR o descomprimir el archivo, sino seguir el recorrido dentro del firmware hasta descubrir de dónde salía exactamente la clave.

Una vez localizada la llamada a gsdfSetCryptoKey() y su relación con permanent_param, el resto del proceso quedó bastante claro.

Finalizando

Estarás diciendo, 'ya que voy a desoldar la memoria para leerla puedo obtener los datos necesarios directamente del volcado', y así es, por lo que todo este proceso no te sería necesario. Pero como aquí hemos venido a jugar, a continuación adjunto una pequeña aplicación web, que funciona todo en local, para cifrar y descifrar el archivo de configuración.

Comentarios

0 comentarios
Cargando comentarios recientes…

Deja un comentario

Puedes iniciar sesión o comentar sin registrarte. El correo de los invitados nunca se muestra públicamente.

Los comentarios de invitados quedan pendientes de moderación.