Google PlusFacebookTwitter

Flasher un routeur ZyXel EMG2926-Q10A de chez Vidéotron

By on Mar 25, 2017 in Autres, Embarqué, Linux | 36 comments

Share On GoogleShare On FacebookShare On Twitter

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:

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:

Wrong product name(NBG6716,EMG2926), stop to upgrade RAS image!
Wrong header checksum, stop to upgrade RAS image!
[    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 !

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:

  1. Récupération des informations et plus particulièrement du modèle (ATSH)
  2. Récupération du seed qui permettra d’obtenir le mot de passe (ATSE)
  3. Récupération du mot de passe via le seed obtenu précédemment (script en C)
  4. Activation de l’accès complet à zloader (ATEN)
  5. 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:

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 ! :mrgreen:

Liens

The following two tabs change content below.

Gaëtan Trellu (goldyfruit)

Cloud Technical Advisor chez IBM
Autodidacte en informatique, depuis 2005 je parcours l’écosystème Unix à la recherche de nouvelles connaissances et de nouvelles rencontres.

CC BY 4.0 Flasher un routeur ZyXel EMG2926-Q10A de chez Vidéotron par Gaëtan Trellu (goldyfruit) est sous Licence Creative Commons Internationale Attribution 4.0.

%d blogueurs aiment cette page :