Vidéotron, le retour avec ZyXel…
Il y a presque 4 années, je rédigeais un billet sur comment Flasher un routeur D-Link DIR-825 de chez Vidéotron. Aujourd’hui, je vais rester sur le même sujet à une petite nuance près, le routeur sera un ZyXel EMG2926-Q10A toujours de chez Vidéotron.
Avant d’aller plus loin, une petite mise en garde habituelle au sujet de la procédure qui suit. Comme la plupart des changements bas niveau il existe un risque, c’est pour cela que je ne pourrai en aucun cas être tenu responsable des possibles dommages engendrés suite au remplacement du micrologiciel (firmware) ou à la suite de cette procédure.
Pour la petite histoire, le modèle EMG2926-Q10A de chez ZyXel n’est en fait qu’un ZyXel NBG6716. Ce modèle découle peut-être d’un partenariat entre Vidéotron et ZyXel, je ne saurai le confirmer !
ZyXel propose par défaut un firmware OpenWRT personnalisé aux couleurs de la société. Comme à son habitude, Vidéotron a décidé (et je peux comprendre) de personnaliser le firmware en limitant l’accès à certaines fonctions comme par exemple:
- La mise à jour du firmware
- L’accès via Telnet (je sais… mais ça peut toujours servir…)
- L’utilisateur n’est pas réellement administrateur
- La commande sysupgrade n’est pas utilisable (/lib/ar71xx.sh est manquant)
Si je décide de passer en mode paranoïaque 😈 , je pourrai dire qu’il est « simple » de lister les fonctions manquantes mais qu’il est beaucoup plus complexe d’identifier les « choses » ajoutées (comme un spyware par exemple ?).
Plus compliqué que prévu
Restaurer le firmware ZyXel fut une tâche bien plus compliquée que prévu… Ci-joint une liste des problèmes rencontrés:
- Impossible de restaurer le firmware par défaut du ZyXel NBG6716
Wrong product name(NBG6716,EMG2926), stop to upgrade RAS image!
- Mauvaise signature du firmware après édition de ce dernier pour modifier le modèle
Wrong header checksum, stop to upgrade RAS image!
- Impossible d’installer le firmware OpenWRT Chaos Calmer 15.05.1
[ 2.320000] UBI: auto-attach mtd8 [ 2.320000] UBI: attaching mtd8 to ubi0 [ 2.660000] UBI error: ubi_compare_lebs: unsupported on-flash UBI format [ 2.660000] UBI error: ubi_attach_mtd_dev: failed to attach mtd8, error -22 [ 2.670000] UBI error: ubi_auto_attach: cannot attach mtd8 [ 2.680000] UBIFS error (pid 1): ubifs_mount: cannot open "ubi0:rootfs", error -19 [ 2.680000] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6 [ 2.690000] Please append a correct "root=" boot option; here are the available partitions: [ 2.700000] 1f00 256 mtdblock0 (driver?) [ 2.710000] 1f01 64 mtdblock1 (driver?) [ 2.710000] 1f02 64 mtdblock2 (driver?) [ 2.720000] 1f03 3712 mtdblock3 (driver?) [ 2.720000] 1f04 2048 mtdblock4 (driver?) [ 2.730000] 1f05 2048 mtdblock5 (driver?) [ 2.730000] 1f06 1024 mtdblock6 (driver?) [ 2.740000] 1f07 2048 mtdblock7 (driver?) [ 2.740000] 1f08 123904 mtdblock8 (driver?) [ 2.750000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) [ 2.750000] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
Pour ce qui est du « Kernel panic« , je dois avouer que je pensais avoir brické mon cher et tendre routeur.
Après plusieurs heures d’acharnement, de recherches, d’échecs, de frayeurs, de déprime, de café et de chocolat (et de gâteaux aussi parce que les gâteaux c’est bon), la sombre idée d’abandonner commença sournoisement à faire son nid…
Tout problème a sa solution (mais si!)
Toutes les « solutions » trouvées sur les forums, blogs, liste de diffusions, etc… se sont soldées par des échecs et cela même si chacune d’entre-elles apportaient leur lot d’informations plus qu’instructives. J’ai vraiment tout essayer, tout !
- Modification du firmware V1.00(AAKG.9)C0.bin
- Utilisation du firmware openwrt-15.05.1-ar71xx-nand-nbg6716-squashfs-factory.bin
- Mise à jour de la version Vidéotron via openwrt-15.05.1-ar71xx-nand-nbg6716-squashfs-sysupgrade.tar
- Extraction du firmware V1.00(AAKG.9)C0.bin avec binwalk et jefferson
Pour les modèles non Vidéotron de ZyXel, la mise à jour du firmware est censée s’effectuer très simplement à l’aide d’un serveur TFTP. Il suffit de déposer le firmware dans /var/tftp/ par exemple et de renommer le firmware V1.00(AAKG.9)C0.bin en ras.bin puis d’allumer le routeur en maintenant le bouton WPS enfoncé. Le serveur TFTP doit-être branché via un câble RJ45 au routeur et doit absolument avoir l’adresse IP 192.168.1.33 (le routeur quand à lui aura l’adresse IP 192.168.1.1).
Pour en revenir à la solution, il m’a « suffit » de renommer le routeur. En renommant le routeur de EMG2926 à NBG6716 j’occulte la partie qui consiste à éditer le firmware V1.00(AAKG.9)C0.bin et donc de ce fait à éviter un changement de signature (checksum) du fichier pour au final ne plus avoir de message d’erreur jeter par zloader et être capable de restaurer le firmware de mon choix.
Le service TFTP sera géré par DNSmasq (Linux), ce qui fera amplement l’affaire, le service écoute sur le port 69 (pensez à votre pare-feu).
# apt-get install dnsmasq unzip curl # cat <<EOF > /etc/dnsmasq.conf enable-tftp tftp-root=/var/tftp EOF # mkdir -pv /var/tftp # systemctl restart dnsmasq # cd /tmp && curl -O "ftp://ftp2.zyxel.com/NBG6716/firmware/NBG6716_V1.00(AAKG.9)C0.zip" # unzip NBG6716_V1.00\(AAKG.9\)C0.zip # mv V1.00\(AAKG.9\)C0.bin /var/tftp/ras.bin
Pour ceux étant sous Windows ou Mac OS, il y a moult tutoriels et documentations sur Internet.
Nous voilà en possession d’un serveur TFTP fonctionnel ainsi que du plus récent firmware pour le routeur ZyXel NBG6716.
À votre tournevis !
Vous vous en doutiez n’est-ce pas ? Il est encore temps de rebrousser chemin ^^
Hélas, il est nécessaire d’ouvrir le routeur pour y avoir accès en console série, cela signifie qu’il est nécessaire d’avoir un câble USB vers TTL.
Si vous avez déjà joué avec Arduino, Raspberry Pi, OLinuXino, etc… vous êtes certainement (sauf toi Étienne 😆 ) déjà en possession de ce dernier, si ce n’est pas le cas allez voir ici.
Le branchement du câble USB/TTL pour notre routeur est parfaitement détaillé sur le site d’OpenWRT (cf. https://wiki.openwrt.org/toh/zyxel/zyxel_nbg6716#serial).
Une fois les câbles RJ45 et USB connectés à votre ordinateur, il vous faut installer un outil permettant une interaction entre votre clavier et le router. Pour ce faire j’ai choisi minicom mais screen peut tout aussi bien faire l’affaire.
# apt-get install minicom $ minicom --device /dev/ttyUSB0
Résultat:
Welcome to minicom 2.7 OPTIONS: I18n Compiled on Jan 1 2014, 09:28:00. Port /dev/ttyUSB0, 12:28:27 Press CTRL-A Z for help on special keys U-Boot 2009.11 (May 25 2015 - 13:40:13) EMG2926 - Scorpion 1.0 DRAM: 32bit ddr2 256 MB Flash: 16 MB *** Warning *** : PCIe WLAN Module not found !!! Net: Max resets limit reached exiting... eth0, eth1 NAND: Hynix NAND 128MiB 3,3V 8-bit [128MB] ZyXEL zloader v2.21 (May 25 2015 - 14:13:21) Multiboot clinent version: 1.2 Hit any key to stop autoboot: 3
Quand la ligne « Hit any key to stop autoboot: 3 » apparaît, il suffit d’appuyer sur n’importe quelle touche (vous avez 3 secondes). Suite à cela nous avons accès à un premier prompt, celui du booloader ZyXel: zloader. Ce dernier va nous permettre d’accéder à U-Boot (même si c’est U-boot qui charge zloader) une fois qu’il aura été déverrouillé, « déverrouillé » dans le sens ou toutes les fonctionnalités de zloader seront accessibles.
EMG2926>
zloader, made in ZyXel
Le déverrouillage de zloader n’est pas très intuitif, voici une description des étapes à suivre:
- Récupération des informations et plus particulièrement du modèle (ATSH)
- Récupération du seed qui permettra d’obtenir le mot de passe (ATSE)
- Récupération du mot de passe via le seed obtenu précédemment (script en C)
- Activation de l’accès complet à zloader (ATEN)
- Entrée dans le shell U-Boot (ATGU)
Avant d’aller plus loin, ouvrez une nouvelle fenêtre dans votre terminal. Il est nécessaire de récupérer un petit de bout de code en C sur GitHub puis de le compiler (à l’aide de gcc), ce script nous permettra de récupérer le mot de passe de zloader.
# apt-get install gcc curl $ curl -O https://gist.githubusercontent.com/goldyfruit/3a0c1500cb539fabe2c4105373b836ae/raw/d3a01d0bec303cfbf5e287d668a8a50278a9b2be/zynpass.c $ gcc -v zynpass.c -o zynpass
Après compilation (qui sera volubile et qui ne durera qu’une seule seconde), un fichier exécutable nommé zynpass aura fait son apparition. En ligne de commande voici ce que ça donne:
EMG2926> ATSH ZLD Version : 2.21 (May 25 2015 - 14:13:19) Bootbase Version : U-Boot 2009.11 (May 25 2015 - 13:40:13) Firmware Version : V1.00(AAQT.2)b2 Product Model : EMG2926 Serial Number : D345B87551234 First MAC Address : 05CB8A7EE8B2 Default Country Code : FF Header Checksum : 0000da2b RootFS Checksum : 00004503 Boot Module Debug Flag : 00 Boot Block Write Enable: no HTP Mode Enable : no EMG2926> ATSE EMG2926 0087397EE8B2
Maintenant que nous connaissons le seed, la prochaine étape consiste à exécuter le script zynpass qui a été compilé juste avant afin de récupérer le mot de passe de. Le script zynpass prend en argument la valeur retournée par la commande ATSE précédente, exécutez-le dans une nouvelle fenêtre.
$ ./zynpass 0087397EE8B2
Résultat:
ATEN 1,43CCC1E
Une fois le mot de passe obtenu, nous sommes prêt pour retourner sur notre prompt zloader pour exécuter notre nouvelle commande.
EMG2926> ATEN 1,43CCC1E EMG2926> ATGU EMG2926#
Vous remarquerez le changement de prompt, nous sommes passés de > à #, cela signifie que nous sommes dans le shell U-Boot \o/
U-Boot, on y est presque !
On se motive, le plus dur est fait. Le prochaine étape consiste à modifier le hostname et à sauvegarder cette modification mais avant cela nous allons vérifier notre hostname actuel ainsi que l’adresse IP du routeur histoire de valider certains acquis.
EMG2926# printenv ipaddr hostname
Résultat:
ipaddr=192.168.1.1 hostname=EMG2926
Pour obtenir la totalité des variables d’environnement il suffit d’exécuter la commande printenv sans aucun argument, bref tout semble correct. Il est temps de remplacer ce hostname qui nous pose tant de traquas, de sauvegarder le tout puis de redémarrer le routeur en faisant un reset CPU.
EMG2926# set hostname NBG6716 EMG2926# printenv hostname hostname=NBG6716 EMG2926# saveenv Saving Environment to Flash... Un-Protected 1 sectors Erasing Flash... First 0x4 last 0x4 sector size 0x10000 4 Erased 1 sectors Writing to Flash... write addr: 9f040000 done Protected 1 sectors EMG2926# reset
This is it, on flash…
C’est la dernière étape, promis ! Le meilleur pour la fin, le routeur redémarre et comme expliqué un peu plus haut dans cette incroyable procédure (n’est-ce pas ? 😯 ), lorsque la fameuse ligne « Hit any key to stop autoboot: 3 » fait son retour; appuyez sur n’importe quelle touche. Vous devriez-être retour au prompt zloader.
EMG2926>
La prochaine action consiste à télécharger via TFTP le firmware V1.00(AAKG.9)C0.bin que nous avons renommé en ras.bin en utilisant la commande ATUR. L’exécution dure à peine 10 secondes…
EMG2926> ATURras.bin download ras.bin to memory address 0x80000000 Using eth0 device TFTP from server 192.168.1.33; our IP address is 192.168.1.1 Filename 'ras.bin'. Load address: 0x80000000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################### done Bytes transferred = 23724032 (16a0000 hex) Please be patient, start to upgrade RAS! Erasing at 0x4e0000 -- 100% complete. done Skipping bad block at 0x009e0000 Erasing at 0x22e0000 -- 100% complete. write...Skip bad block 0x009e0000 done First 0x6 last 0x6 sector size 0x10000 6 Erased 1 sectors write addr: 9f060000 EMG2926>
Il ne reste plus qu’à démarrer le routeur sur le nouveau noyau à l’aide de la commande ATGO.
EMG2926> ATGO ### JFFS2 loading '/boot/vmlinux.lzma.uImage' to 0x80400000 Scanning JFFS2 FS: '/boot/vmlinux.lzma.uImage' found, done Loading file: done ### JFFS2 load complete: 1021898 bytes loaded to 0x80400000 ## Booting kernel from Legacy Image at 80400000 ... Image Name: MIPS OpenWrt Linux-3.3.8 Created: 2016-09-09 7:59:00 UTC Image Type: MIPS Linux Kernel Image (lzma compressed) Data Size: 1021834 Bytes = 997.9 kB Load Address: 80060000 Entry Point: 80060000 Verifying Checksum ... OK Uncompressing Kernel Image ... OK Starting kernel ...
Le processus de boot prend environ 60 secondes le temps de démarrer tous les services, la séquence de boot devrait se terminer par « sysinit: Boot finished! » . Il suffit d’appuyer sur une touche pour avoir un prompt de login. Les identifiants sont les suivants:
- Utilisateur: root
- Mot de passe: 1234
NBG6716 login: root Password: BusyBox v1.19.4 (2016-09-08 20:38:03 CST) built-in shell (ash) Enter 'help' for a list of built-in commands. _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- (r7623) root@NBG6716:~# cat /etc/openwrt_release DISTRIB_ID="OpenWrt" DISTRIB_RELEASE="Bleeding Edge" DISTRIB_REVISION="r7623" DISTRIB_CODENAME="barrier_breaker" DISTRIB_TARGET="ar71xx/generic" DISTRIB_DESCRIPTION="OpenWrt Barrier Breaker r7623" root@NBG6716:~#
Ouvrez un navigateur et rendez-vous (mon côté autoritaire reprend le dessus) à l’adresse http://192.168.1.1 vous devriez avoir la page de connexion ZyXel et non plus celle de Vidéotron. J’ai envie de dire, VICTOIRE !
Conclusion
Ce fut un long billet, certainement difficile à lire et à comprendre mais au final être capable d’installer un firmware du constructeur, libre ou simplement de votre choix ça n’a pas de prix !
Je n’ai pas la science infuse et ce genre de « bidouille » n’est pas mon quotidien donc s’il y a des erreurs merci de ne pas me fustiger !
Liens
- OpenWRT et ZyXel NBG6716: https://wiki.openwrt.org/toh/zyxel/zyxel_nbg6716
- Une discussion sur le même sujet abordé ici: https://forum.openwrt.org/viewtopic.php?pid=350341
- Un peu de U-Boot: https://wiki.openwrt.org/doc/techref/bootloader/uboot.config
- zynpass sur GitHub: https://gist.github.com/goldyfruit/3a0c1500cb539fabe2c4105373b836ae
- Site très utile pour comprendre la commande ATEN: http://www.ixo.de/info/zyxel_uclinux/
Gaëtan Trellu (goldyfruit)
Derniers articles parGaëtan Trellu (goldyfruit) (voir tous)
- Qinling, let’s the journey begin! - 23 mai 2019
- systemd-networkd, l’âge de la maturité ? - 13 mars 2018
- Hyper-V, Nova, VxLAN et Open vSwitch, enfin une belle histoire ! - 31 décembre 2017
Flasher un routeur ZyXel EMG2926-Q10A de chez Vidéotron par Gaëtan Trellu (goldyfruit) est sous Licence Creative Commons Internationale Attribution 4.0.