Os pongo una explicacion creda por la IA de todo lo que hice para que se entienda mejor:
[TUTORIAL] Acceso y extracción de configuración en routers Zte vía Serial y U-Boot
¡Hola a todos!
Quiero compartir con la comunidad el proceso completo que he seguido para acceder a mi router Zte, extraer las particiones de la memoria flash y, finalmente, descifrar el fichero de configuración db_user_cfg.xml para obtener los datos en texto plano.
Objetivo final: Leer el fichero db_user_cfg.xml que contiene la configuración del usuario (credenciales SIP, configuraciones de red, etc.) de forma descifrada.
Disclaimer: Este proceso es avanzado y requiere ciertos conocimientos técnicos. Si no sigues los pasos con cuidado, podrías bloquear (brickear) tu dispositivo. Realiza este procedimiento bajo tu propia responsabilidad.
Material Necesario
Hardware:
Un conversor USB a Serie (TTL/UART), como los basados en chips CP2102 o FTDI.
Cables Dupont o Jumper para conectar el conversor al router.
(Opcional) Soldador, si los pines de la placa no están accesibles.
Software:
Un cliente de terminal serie: PuTTY, Minicom (Linux), o Tera Term.
Un servidor TFTP (como Tftpd64 en Windows o tftpd-hpa en Linux).
Herramientas de análisis de firmware como binwalk o jefferson para extraer el sistema de ficheros.
Python 3.
El repositorio de zte_config_utility (disponible en GitHub).
Paso 1: Conexión Física por Puerto Serie (UART/TTL)
Lo primero es abrir el router y localizar los pines de la conexión serie en la placa base (PCB). Normalmente están etiquetados como TX (Transmisión), RX (Recepción), GND (Tierra) y VCC (Voltaje).
Localiza los pines: Busca un conector de 4 pines, a menudo sin soldar. En este post hay fotos incluso un enlace a un video de YouTube que muestran el proceso.
Realiza la conexión:
GND del router → GND del conversor USB-Serie.
TX del router → RX del conversor USB-Serie.
RX del router → TX del conversor USB-Serie.
IMPORTANTE: NO conectes el PIN VCC. El router se alimentará con su propia fuente de alimentación y conectar VCC podría dañar ambos dispositivos.
Paso 2: Obtener Información de las Particiones (Arranque Normal)
Antes de manipular el bootloader (U-Boot), es crucial saber cómo está estructurada la memoria flash. La forma más sencilla es dejar que el sistema operativo del router (Linux) arranque por completo una vez.
Conecta el conversor USB a tu PC y abre tu programa de terminal. Configúralo con los parámetros correctos (el baud rate más común es 115200, 8 data bits, no parity, 1 stop bit).
Enciende el router. Verás un montón de texto de arranque en la consola.
No interrumpas el arranque. Deja que termine hasta que veas una shell de login o una línea de comandos (por ejemplo, # o $).
En la salida habrá algo parecido a esto entre toda la cantidad de informacion que nos sale. Guárdala bien, es tu mapa del tesoro.
dev: size erasesize name
mtd0: 00040000 00020000 "mtd_bl"
mtd1: 00180000 00020000 "mtd_kernel"
mtd2: 01e00000 00020000 "mtd_rootfs"
mtd3: 00e00000 00020000 "mtd_data"
mtd4: 00200000 00020000 "mtd_usercfg"
mtd5: 00040000 00020000 "mtd_crash"
En mi caso, el fichero de configuración que buscaba estaba en mtd4, la partición "usercfg".
Paso 3: Arrancar en U-Boot y Transferir las Particiones por TFTP
Ahora que tenemos el mapa, reiniciamos el proceso para extraer los datos usando U-Boot.
Prepara tu PC:
- Configura una IP estática en tu PC, por ejemplo, 192.168.1.100.
- Inicia tu servidor TFTP y asegúrate de que esté escuchando en esa IP.
- Interrumpe U-Boot:
Apaga y enciende el router de nuevo, con la consola serie abierta.
Justo al principio del arranque, verás un mensaje como Hit any key to stop autoboot: 3. Pulsa rápidamente cualquier tecla para detener el arranque automático y entrar en la línea de comandos de U-Boot (verás un prompt como Zte# o como en mi caso =>).
Configura la red en U-Boot:
Asigna una IP al router (temporal, para la transferencia) y dile cuál es la IP de tu servidor TFTP.
setenv ipaddr 192.168.1.1
setenv serverip 192.168.1.100
saveenv
Lee la partición de la flash a la RAM:
El comando para leer de la memoria flash a la memoria RAM puede variar (nand read, sf read, etc.). Basándome en el mapa de mtd4 ("usercfg") que obtuve antes, leí esa partición.
Necesitas saber la dirección de inicio y el tamaño de la partición y una dirección libre en la RAM a la que copiar los datos (por ejemplo, 0x80060000).
Ejemplo: Leer la partición mtd4 (2MB = 0x200000 bytes) a la RAM en 0x80060000
nand read 0x80060000 [offset_de_mtd4] [size_de_mtd4]
Transfiere el fichero por TFTP:
Usa el comando tftpput para enviar los datos desde la RAM de tu router a tu servidor TFTP en el PC.
Enviar 0x200000 bytes desde la RAM (0x80060000) a un fichero llamado mtd4_usercfg.bin
tftpput 0x80060000 0x200000 mtd4_usercfg.bin
Si todo va bien, verás un mensaje de transferencia exitosa y el fichero mtd4_usercfg.bin aparecerá en la carpeta de tu servidor TFTP. Repite el proceso para cualquier otra partición que te interese.
Paso 4: Extraer el Sistema de Ficheros en el PC
El fichero .bin que has transferido es una imagen en bruto de la partición. Ahora toca extraer su contenido.
Identificar el tipo de sistema de ficheros: Usamos binwalk para analizar la imagen.
binwalk mtd4_usercfg.bin
La salida probablemente te dirá que es un sistema de ficheros JFFS2, que es muy común en este tipo de dispositivos.
Extraer los ficheros: Puedes usar el propio binwalk o herramientas más específicas como jefferson.
Opción 1: Con binwalk
binwalk –dd='jffs2:jffs2' mtd4_usercfg.bin
O más simple
binwalk -Me mtd4_usercfg.bin
Esto creará una carpeta llamada _mtd4_usercfg.bin.extracted (o similar) con el contenido de la partición. Navegando por ella, encontré el fichero que buscaba en jffs2-root/cfg/db_user_cfg.xml.
Paso 5: Descifrar el Fichero "db_user_cfg.xml"
¡El último paso! Este fichero XML está cifrado. Para descifrarlo, usé la excelente herramienta zte_config_utility.
Clona el repositorio:
git clone github.com/sandz-github/zte_config_utility.git
cd zte_config_utility
Ejecuta el script de descifrado:
El script auto.py necesita dos datos clave de tu router para generar la clave de descifrado: el número de serie GPON y la dirección MAC. Los puedes encontrar en la pegatina de debajo del router.
Este es el comando exacto que ejecuté, adaptado a mis datos (pongo por seguridad datos inventados):
python3 examples/auto.py
- -serial ZTEGXXXXXXX
- -mac 99:99:99:99:99:99
/srv/tftp/_mtd4_usercfg.bin.extracted/jffs2-root/cfg/db_user_cfg.xml
output.xml
Desglose del comando:
- -serial [TU_NUMERO_DE_SERIE]: El S/N de tu router.
- -mac [TU_MAC]: La MAC de tu router.
La siguiente ruta es la ubicación del fichero cifrado que extrajiste.
output.xml: Es el nombre del fichero de salida donde se guardará la configuración descifrada.
¡Y listo! Al abrir output.xml, tenía toda la configuración en texto plano, incluyendo usuarios, contraseñas y todos los parámetros técnicos que necesitaba.
Espero que esta guía detallada le sirva a alguien más que esté intentando "abrir" su dispositivo. Ha sido un proceso de aprendizaje muy interesante.
Si tenéis alguna duda, ¡preguntad!
¡Un saludo!