
Recientemente he encontrado una vulnerabilidad en el ZyXEL EX3301-T0 con firmware V5.50(ABVY.3.1)G0 aún no documentada por la que podremos inyectar código (como root) a través de cron, y así entre otras cosas sacar el pass de root/admin de nuestro router.
Procedimiento
Necesitamos:
- Un Pendrive , preferiblemente formateado en FAT32 (debería funcionar también en NTFS y Ext2/4).
- Tiempo
Pasos a seguir:
1- Descargamos el siguiente script pulsando con el botón derecho y Guardar como del siguiente enlace pass.sh o desde github.com/drumpinicho/ex3301pass/tree/main/script. Lo ponemos en la raíz del pendrive con el nombre de pass.sh
.
2- Insertamos el pendrive en el USB del Zyxel y entramos en la página del router, por defecto, http://192.168.1.1
y nos logueamos, si no habéis cambiado el usuario, con usuario user
contraseña user
.
3- Vamos a Configuración de red → Servicio USB.
Si ha detectado el pendrive veremos un apartado que pone Volumen y justo debajo el punto de montaje.
Si fuera diferente a usb2_sda1
, lo copiamos.

4- * Opcional. Por mayor comodidad activamos la compartición de ficheros añadiendo como recurso compartido, la raíz del USB.
5- Configuración de red → DNS → DNS Dinámico
- Seleccionamos DNS User Defined.
- Introducimos esto en Actualización de URL:
foo -x x ; /bin/sh /mnt/usb2_sda1/pass.sh ;
Donde usb2_sda1
es el punto de montaje anteriormente mencionado. Si este fuera diferente se cambiaría acorde al que corresponda y además lo añadimos justo después de pass.sh
, quedando de la siguiente forma:
Ejemplo
foo -x x ; /bin/sh /mnt/usb2_sdb1/pass.sh usb2_sdb1 ;
Rellenamos el resto de las entradas con el formato que corresponda (puede ser inventado).

Activamos y aplicamos
6- Vamos a Mantenimiento → Tiempo
Cambiamos la Zona Horaria y ponemos la hora lo más cercano posible de las 00:00. Tenéis la referencia de hora actual arriba al principio de la página.
Solo queda aplicar y esperar a las 00:01 apróximadamente
Resultado
Si todo ha ido bien, se crearán 4 archivos en la raiz del USB:
zcfb_config.json
, que es la configuración actual del router.flashdump
dump de la parte de mtd0 donde se guardan las contraseñas.hexdump_pass.txt
hexdump en formato texto del archivo flasdump.pass.txt
archivo con las cadenas de texto extraidas de flasdump.
En mi caso , la contraseña de root y admin es la misma y tiene un formato alfanumérico con mayúsculas y minúsculas de 10 caracteres que se corresponde con la quinta línea del pass.txt
.
Recomendaciones
Recomiendo encarecidamente entrar como admin al router una vez extraída la clave y realizar backup (aunque no hice un diff
, debería ser el mismo archivo que zcfg_config.json
) antes de toquetear nada y guardarlo a buen recaudo.
Recordad desactivar el DDNS una vez realizado y volver a poner en la hora GMT que le corresponda.
Agradecimientos
Quiero dar las gracias a ThomasRinsma , porque sin sus aportes nunca hubiera adivinado donde se guarda el password.
Actualización
He actualizado el comando a escribir en "Actualización de URL" para asegurarme de que dé error y siga con la ejecución el siguiente comando.