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.
- 1 Procedimiento
- 2 Resultado
- 3 Recomendaciones
- 4 El usuario admin no loguea en la web o aparece como bloqueado
- 5 Agradecimientos
- 6 Actualización
Procedimiento
Necesitamos:
- Conexión a Internet . Sin tener la conexión activa a internet, este método no funcionará.
- 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:
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:
zcfg_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.
El usuario admin no loguea en la web o aparece como bloqueado
A la vista de los datos que he analizado, casi con toda seguridad puedo decir, que en algunos routers la contraseña de admin no coincide con la de root. Puede ser que esta haya sido generada por algoritmo , recomiendo probar este método.
Si la generación de contraseña no funciona podemos hacer lo siguiente:
Si no estás seguro de lo que haces, no realices el siguiente método. Un mal formato de la configuración puede hacer que el dispositivo no inicie y tengas que resetearlo de fábrica.
Elevación de privilegios de un usuario de administrador a supervisor
Como a día de hoy no hay forma de desencriptar la configuración del router, nos aprovecharemos de él para que nos genere los datos para un nuevo usuario y cambiar ese usuario en el archivo /data/zcfg_config.json para elevar los privilegios de Medium a High y este actúe como supervisor .
Asumiendo que nos encontramos en Windows , necesitaremos:
- Editor de texto
Recomiendo el uso de Notepad++ Nunca useis el Notepad de windows
- Cliente FTP
Recomiendo el uso de FileZilla
Configuramos FileZilla para que use Notepad++ como editor por defecto en Edición → Opciones → Edición de archivo → Usar editor personalizado
Método:
1- Entramos al router por el navegador y nos logueamos, ip por defecto 192.168.1.1
2- Creamos un nuevo usuario en Mantenimiento → Cuenta de usuario → Añadir nueva cuenta , relleneais a vuestro gusto y guardamos cambios.
3- Ahora, usando FileZilla, nos conectamos vía FTP al router con usuario root mediante conexión rápida donde:
Servidor : IP del router
Nombre de usuario : root
Contraseña : la que hemos sacado en pasos anteriores
Puerto : 21
4- Navegamos mediante la ventana de la derecha a la carpeta /data
5- Seleccionamos el archivo zcfg_config.json
con el botón derecho y le damos a editar
6- Nos vamos abajo, a la parte del archivo que contiene el usuario que acabamos de crear (podeis buscarlo mediante Ctrl+F por el nombre de usuario o buscando LoginCfg que es la sección que los alberga.
7- Cortamos el usuario que hemos creado (no copieis, no podemos tener usuarios duplicados) de corchete {
a corchete }
, incluyendo la primera coma ,
8- Pegamos el contenido justo después del corchete }
del usuario admin quedando de la siguiente forma:
Ejemplo simplificado
9- Guardamos cambios en Notepad++ y cerramos, a la pregunta de ¿Volver a subir este archivo al servidor? en FileZilla le decimos que si.
* Opcional . Podéis volver a abrir el archivo subido descartando el archivo local , para ver que los cambios se han realizado correctamente
10- Solo queda entrar de nuevo en el router mediante la web y realizar un reinicio desde Mantenimiento → Reinicializar
Con esto nos aseguramos de no tener pérdida de datos y que realice el Sync en el sistema de archivos antes de hacer el reboot.
Ya podremos entrar con nuestro nuevo usuario que tendrá permisos de supervisor.
Elevación de privilegios de un usuario de administrador a supervisor. Método 2 gracias al usuario @Burequant
Introducción del config en modo consola por ssh con usuario root para elevear privilegios de otro usuario.
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
ez-ipupdate
dé error y siga con la ejecución el siguiente comando, que sería el script. - Añadida forma de elevar privilegios a cualquier usuario.
- Sin conexión a Internet no funciona el método de obtención de claves.
- Método nuevo de elevación de privilegios para usuario web gracias al usuario @Burequant
- Lamentablemente debido a que ya no dispongo de este router no puedo seguir aportando nada nuevo.