OpenWRT - Libérer votre Xiaomi AIoT Router AX3600

OpenWRT - Libérer votre Xiaomi AIoT Router AX3600

McFly, Anthony
McFly, Anthony

Note: Certains liens présents dans cet article sont des liens affiliés (Domadoo, Amazon, AliExpress…). Cela veut dire que le commerçant me reverse un petit pourcentage. En passant par ces liens, vous soutenez mon travail sans dépenser plus, car le prix est exactement le même pour vous.

Tuto réalisé avec :


Aujourd’hui, je vais vous parler d’OpenWRT, un système open-source prévu pour remplacer l’OS par défaut de certains routeurs grand public. Je vais l’installer sur le remplaçant de mon Xiaomi Mi Router 3G qui est, lui aussi, sous OpenWRT et qui va terminer en répétiteur Wi-Fi.

OpenWRT OpenWrt est une distribution GNU/Linux hautement extensible. Contrairement à beaucoup d’autres distributions pour ces routeurs, OpenWrt est conçu dès le départ pour être un système d’exploitation complet et facilement modifiable pour votre routeur. En pratique, cela signifie que vous pouvez disposer de toutes les fonctionnalités dont vous avez besoin, sans rien de superflu, grâce à un noyau Linux plus récent que la plupart des autres distributions.

Mi AIoT Router AX3600 Le routeur Xiaomi AX3600 est un routeur WiFi tri-bande 802.11ax OFDMA et MU-MIMO, qui dispose des interfaces WiFi 2.4GHz (QCN5024 2×2/40MHz ax), 5GHz (QCN5054 4×4/80 ou 2×2/160MHz ax) et une AIoT (QCA9889 1×1 ac/n)

Il est équipé :

  • D’un SoC Qualcomm IPQ8071A à 4 cœurs (jusqu’à 1,4 GHz),
  • De 3 ports LAN 1Gb et d’un port WAN 1Gb,
  • De 7 antennes externes non détachables.

Il existe en deux variantes :

  • Une avec le micrologiciel OEM chinois,
  • Une autre avec l’OEM international.

Les deux peuvent fonctionner avec n’importe quel micrologiciel, Chinois ou International, et les deux supportent OpenWrt

Les grandes étapes de ce tutoriel sont :

  • Première mise en route du routeur et vérification de sa version de firmware,
  • Downgrade (revenir à une version antérieure) de la version du firmware par la version officielle autorisant l’exploit,
  • Création de l’accès SSH,
  • Pré-installation d’OpenWRT,
  • Installation permanente d’OpenWRT,
  • Premier lancement d’OpenWRT

Lancement du routeur en version originale

Premier lancement du routeur

Si vous venez de vous procurer ce routeur neuf ou d’occasion, il va falloir faire le premier lancement pour vérifier sa version de firmware et le downgrader, si nécessaire.

Pour le configurer, vous avez deux méthodes :

  • Via l’application Mi Wi-Fi (permet de garder internet sur votre PC)
  • Via un câble Ethernet branché entre votre PC et un port LAN du routeur.
Quand j’ai acheté le mien, il n’était pas réinitialisé, il fallait un mot de passe. J’ai dû le réinitialiser en restant appuyé 10 secondes sur le bouton reset situé derrière.

Avec l’application Mi Wi-Fi

  1. Téléchargez et installez l’application Mi Wi fi (Xiaomi Inc), Application Mi Wi-Fi
  2. Branchez votre routeur électriquement, mais aussi en Ethernet, via le port WAN (1er à gauche, mais c’est indiqué en dessous du port), sur votre box opérateur.
  3. Connectez-vous au Wi-Fi du routeur “Xiaomi_XXXX_XXXX”, il n’y a pas de mot de passe (s’il vous en demande, réinitialisez le routeur),
  4. Lancez l’application puis choisissez Définir un nouveau routeur. Il devrait se connecter à internet. Cliquez sur suivant, Interface de l'application Mi Wi-Fi
  5. Il vous demande de sélectionner la région (France), le nom du réseau que vous souhaitez mettre et un mot de passe qui sera aussi le mot de passe admin en laissant la case en dessous cochée. Faites simple, car ça va changer, Configuration des informations du routeur via l'interface Mi Wi-Fi
  6. Il va ensuite examiner s’il y a des radars autour de vous (législation française) puis il activera la connexion Wi-Fi, Le routeur examine les Radars autour de nous. Une fois terminé, connectez-vous au Wi-Fi puis à l’interface du routeur http://192.168.31.1 ou miwifi.com,
  7. Saisir votre mot de passe admin (configuré plus haut),
  8. Une fois sur l’interface, allez dans Settings -> Status et vérifiez la version actuellement installée. (ici 3.0.22). Vérification de la version du firmware du Mi router AIoT AX3600

En Ethernet

  1. Branchez votre routeur électriquement, mais aussi en Ethernet, via le port WAN (1er à gauche, mais c’est indiqué en dessous du port), sur votre box opérateur.
  2. Branchez un câble Ethernet entre votre PC et un port LAN du routeur,
  3. Connectez-vous sur l’interface du routeur http://192.168.31.1 ou miwifi.com depuis votre navigateur, Interface Web du Mi Router - première connexion
  4. Saisir un mot de passe pour votre Wi-Fi et la connexion admin, Configuration du routeur Un rappel des éléments est affiché. Rappel des éléments de configuration du Mi Router Reconnectez-vous à l’interface puis
  5. Allez dans Settings -> Status et vérifiez la version actuellement installée. (ici 3.0.22) Vérification de la version du firmware du Mi router AIoT AX3600

Revenir à la version 1.0.17

Pour pouvoir accéder à l’exploit permettant l’accès SSH, il faut retourner sur la version 1.0.17.

  1. Récupérez le firmware 1.0.17 ici 🔗(Firefox m’a affiché une alerte sur ce fichier parce que c’est un .bin. Fennec ne m’a annoncé aucune alerte)
  2. Dans Settings -> Status cliquez sur Update manually,
  3. Cliquez sur Select file et sélectionnez le fichier miwifi_r3600_firmware_5da25_1.0.17.bin, Sélectionner le firmware à downgrader depuis l'interface de Mi Wi-Fi
  4. Cliquez sur Update now, Une fenêtre s’affiche, vous prévenant que vous allez installer une ancienne version et que vous devez nettoyer toutes les configurations personnalisées avant de continuer. Interface du Mii Router AIoT AX3600
  5. Cochez la case clear all custom configuration puis cliquer sur OK, Le flash vers la version 1.0.17 est en cours. Downgrade du routeur en cours

Une fois le retour de la LED bleue sur le routeur, l’update est fini. Votre routeur est réinitialisé.

Obtenir l’accès SSH

Il existe quatre méthodes différentes pour rooter ce modèle. Vous pouvez choisir celle qui vous convient le mieux, mais dans ce tutoriel, nous utiliserons la méthode JavaScript qui est la plus simple et la plus sûre.

Vu que votre routeur a été réinitialisé lors du downgrade, il va falloir suivre de nouveau les étapes pour la mise en route, que ce soit via l’application ou via l’Ethernet.

Ensuite, connectez-vous à l’interface de votre routeur via votre navigateur. Une fois connectés, nous allons injecter un code JavaScript depuis le navigateur.

  1. Appuyez sur F12 pour ouvrir la console d’inspection du navigateur, puis cliquez sur l’onglet Console
  2. Collez le code suivant et cliquez sur entrée : Lancement de l'exploit via JavaScript depuis l'interface Web du Mi Routeur
   function getSTOK() {
    let match = location.href.match(/;stok=(.*?)\//);
    if (!match) {
        return null;
    }
    return match[1];
}

function execute(stok, command) {
    command = encodeURIComponent(command);
    let path = `/cgi-bin/luci/;stok=${stok}/api/misystem/set_config_iotdev?bssid=SteelyWing&user_id=SteelyWing&ssid=-h%0A${command}%0A`;
    console.log(path);
    return fetch(new Request(location.origin + path));
}

function enableSSH() {
    stok = getSTOK();
    if (!stok) {
        console.error('stok not found in URL');
        return;
    }
    console.log(`stok = "${stok}"`);

    password = prompt('Input new SSH password');
    if (!password) {
        console.error('You must input password');
        return;
    }

    execute(stok,
`
nvram set ssh_en=1
nvram commit
sed -i 's/channel=.*/channel=\\"debug\\"/g' /etc/init.d/dropbear
/etc/init.d/dropbear start
`
    )
        .then((response) => response.text())
        .then((text) => console.log(text));
    console.log('New SSH password: ' + password);
    execute(stok, `echo -e "${password}\\n${password}" | passwd root`)
        .then((response) => response.text())
        .then((text) => console.log(text));
}

enableSSH();

Un popup s’affiche vous demandant de saisir un mot de passe SSH. Mettez un mot de passe avec plus de huit caractères, mais sans caractère spécial, puis validez. Popup demandant de saisir un mot de passe SSH

Testons maintenant l’accès SSH

Ouvrez un Terminal puis lancez la commande suivante ssh -oHostKeyAlgorithms=+ssh-rsa root@192.168.31.1

La commande classique ssh root@192.168.31.1 indiquée dans la documentation ne marche pas.

Retour de la commande :

   anthony@McFly-Bureau:~$ ssh -oHostKeyAlgorithms=+ssh-rsa root@192.168.31.1
The authenticity of host '192.168.31.1 (192.168.31.1)' can't be established.
RSA key fingerprint is SHA256:K4bpJk49UQDBCNCrfERVwWMNsYtUsmFmeqvcVgPRYUA.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.31.1' (RSA) to the list of known hosts.
root@192.168.31.1's password: 


BusyBox v1.25.1 (2020-02-19 10:57:26 UTC) built-in shell (ash)

 -----------------------------------------------------
       Welcome to XiaoQiang!
 -----------------------------------------------------
  $$$$$$\  $$$$$$$\  $$$$$$$$\      $$\      $$\        $$$$$$\  $$\   $$\
 $$  __$$\ $$  __$$\ $$  _____|     $$ |     $$ |      $$  __$$\ $$ | $$  |
 $$ /  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ /  $$ |$$ |$$  /
 $$$$$$$$ |$$$$$$$  |$$$$$\         $$ |     $$ |      $$ |  $$ |$$$$$  /
 $$  __$$ |$$  __$$< $$  __|        $$ |     $$ |      $$ |  $$ |$$  $$<
 $$ |  $$ |$$ |  $$ |$$ |           $$ |     $$ |      $$ |  $$ |$$ |\$$\
 $$ |  $$ |$$ |  $$ |$$$$$$$$\       $$$$$$$$$  |       $$$$$$  |$$ | \$$\
 \__|  \__|\__|  \__|\________|      \_________/        \______/ \__|  \__|


root@XiaoQiang:~# 

Vous avez maintenant un accès SSH à votre routeur (toujours sous le firmware Xiaomi pour le moment).

Installation de OpenWRT

Activer le port série

Ce n’est pas obligatoire, mais cela vous permet d’avoir une solution de repli en cas de problème avec votre routeur (en plus, ça ne mange pas de pain).

   nvram set uart_en=1
nvram set boot_wait=on
nvram commit
reboot

Voici le retour :

   root@XiaoQiang:~# nvram set uart_en=1
root@XiaoQiang:~# nvram set boot_wait=on
root@XiaoQiang:~# nvram commit
root@XiaoQiang:~# reboot
root@XiaoQiang:~# Connection to 192.168.31.1 closed by remote host.
Connection to 192.168.31.1 closed.

Préinstaller OpenWRT

L’installation se fait par la méthode ubiformat, via SSH.

  1. Ouvrez le Terminal et connectez-vous en SSH à votre routeur.
  2. Récupérez le fichier .ubi avec la commande wget sous Linux (ou scp sous windaub) dans le dossier /tmp Le lien vers la dernière version ici 🔗 (prenez la stable).
    Les noms des fichiers correspondent à la version au moment où j’écris cet article, alors n’hésitez pas à vérifier.
   cd /tmp/
wget https://downloads.openwrt.org/releases/23.05.2/targets/ipq807x/generic/openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-initramfs-factory.ubi

Retour de la commande :

   root@XiaoQiang:~# cd /tmp/
root@XiaoQiang:/tmp# wget http://downloads.openwrt.org/releases/23.05.2/targets/
ipq807x/generic/openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-initramfs-factory.
ubi
Connecting to downloads.openwrt.org (151.101.194.132:80)
openwrt-23.05.2-ipq8 100% |*******************************| 12800k  0:00:00 ETA
root@XiaoQiang:/tmp# 

On vérifie sur quelle partition root notre routeur est démarré avec la commande suivante nvram get flag_boot_rootfs (0 = rootfs | 1 = rootfs_1)

   root@XiaoQiang:/tmp# nvram get flag_boot_rootfs
0

Mon routeur est démarré sur rootfs.

Vérifiez que les index mtd de rootfs et rootfs_1 soient bien mtd12 et mtd13 avec la commande suivante :

   cat /proc/mtd

Retour de la commande :

   root@XiaoQiang:/tmp# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00100000 00020000 "0:SBL1"
mtd1: 00100000 00020000 "0:MIBIB"
mtd2: 00300000 00020000 "0:QSEE"
mtd3: 00080000 00020000 "0:DEVCFG"
mtd4: 00080000 00020000 "0:RPM"
mtd5: 00080000 00020000 "0:CDT"
mtd6: 00080000 00020000 "0:APPSBLENV"
mtd7: 00100000 00020000 "0:APPSBL"
mtd8: 00080000 00020000 "0:ART"
mtd9: 00080000 00020000 "bdata"
mtd10: 00080000 00020000 "crash"
mtd11: 00080000 00020000 "crash_syslog"
mtd12: 023c0000 00020000 "rootfs"
mtd13: 023c0000 00020000 "rootfs_1"
mtd14: 01ec0000 00020000 "overlay"
mtd15: 00080000 00020000 "rsvd0"
mtd16: 0041e000 0001f000 "kernel"
mtd17: 015cc000 0001f000 "ubi_rootfs"
mtd18: 01876000 0001f000 "data"
root@XiaoQiang:/tmp# 

Nous sommes prêts à lancer le flash. ATTENTION à bien choisir la procédure associée à votre rootfs.

Si rootfs = 0

Lancez cette commande (attention au nom du fichier, il doit correspondre au vôtre).

   ubiformat /dev/mtd13 -y -f /tmp/openwrt-23.05.2-ipq807x-gen
eric-xiaomi_ax3600-initramfs-factory.ubi -s 2048 -O 2048 && nvram set flag_boot_
rootfs=1 && nvram set flag_last_success=1 && nvram commit

Retour de la commande pour rootfs=0 :

   root@XiaoQiang:/tmp# nvram get flag_boot_rootfs
0
root@XiaoQiang:/tmp# ubiformat /dev/mtd13 -y -f /tmp/openwrt-23.05.2-ipq807x-gen
eric-xiaomi_ax3600-initramfs-factory.ubi -s 2048 -O 2048 && nvram set flag_boot_
rootfs=1 && nvram set flag_last_success=1 && nvram commit
ubiformat: mtd13 (nand), size 37486592 bytes (35.7 MiB), 286 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 285 -- 100 % complete  
ubiformat: 286 eraseblocks have valid erase counter, mean value is 0
ubiformat: flashing eraseblock 99 -- 100 % complete  
ubiformat: formatting eraseblock 285 -- 100 % complete  
root@XiaoQiang:/tmp# 

Puis redémarrez avec reboot.

Si rootfs = 1

Lancez cette commande (attention au nom du fichier, il doit correspondre au vôtre).

   ubiformat /dev/mtd12 -y -f /tmp/openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-initramfs-factory.ubi -s 2048 -O 2048 && nvram set flag_boot_rootfs=0 && nvram set flag_last_success=0 && nvram commit

Puis redémarrez avec reboot.

Nous venons de flasher un initramfs OpenWrt ubinisé qui servira d’étape intermédiaire puisque OpenWrt utilise des rootfs unifiés afin d’utiliser pleinement la NAND et de fournir suffisamment d’espace pour les paquets.

Installation permanente d’OpenWRT

Nous allons quasiment suivre les mêmes étapes pour récupérer le fichier sysupgrade.bin que pour la récupération du fichier openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-initramfs-factory.ubi.

  1. Connexion en SSH,
    L’adresse IP a changé, elle est maintenant 192.168.1.1 donc ssh root@192.168.1.1
  2. Se rendre dans le dossier /tmp puis récupérer le fichier openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.bin
   cd /tmp/
wget https://downloads.openwrt.org/releases/23.05.2/targets/ipq807x/generic/openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.bin

Le lien vers la dernière version ici 🔗 (prenez la stable).

Retour de la commande :

   
anthony@McFly-Bureau:~$ ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
ED25519 key fingerprint is SHA256:lgTFkR3CSD+nRbI4VzWISieE5baeAAsISMzfKGR6y8A.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.1' (ED25519) to the list of known hosts.


BusyBox v1.36.1 (2023-11-14 13:38:11 UTC) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 23.05.2, r23630-842932a63d
 -----------------------------------------------------
=== WARNING! =====================================
There is no root password defined on this device!
Use the "passwd" command to set up a new password
in order to prevent unauthorized SSH logins.
--------------------------------------------------
root@OpenWrt:~# cd /tmp/
root@OpenWrt:/tmp# wget https://downloads.openwrt.org/releases/23.05.2/targets/ipq807x/generic/open
wrt-23.05.2-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.bin
Downloading 'https://downloads.openwrt.org/releases/23.05.2/targets/ipq807x/generic/openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.bin'
Connecting to 151.101.130.132:443
Writing to 'openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.bin'
openwrt-23.05.2-ipq8 100% |*******************************| 11930k  0:00:00 ETA
Download completed (12216619 bytes)
root@OpenWrt:/tmp# 

Lancez la commande de mise à jour du système.

   sysupgrade -n openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.
bin 

Retour de la commande :

   root@OpenWrt:/tmp# sysupgrade -n openwrt-23.05.2-ipq807x-generic-xiaomi_ax3600-squashfs-sysupgrade.
bin
Tue Jan 30 15:25:54 UTC 2024 upgrade: Commencing upgrade. Closing all shell sessions.
Command failed: Connection failed
root@OpenWrt:/tmp# Connection to 192.168.1.1 closed by remote host.
Connection to 192.168.1.1 closed.
anthony@McFly-Bureau:~$ 

Votre routeur redémarre avec OpenWRT complètement opérationnel.

Première connexion

Interface d’administration

Rendez-vous sur l’adresse http:/192.168.1.1 puis connectez-vous sans mots de passe. Ensuite, allez mettre un mot de passe solide, cette fois, car lui il va rester soit en passant par le bandeau en haut de l’écran, soit depuis les menus System -> Administration onglet Router Password. Ajouter un mot de passe fort

Par défaut, l’adresse IP d’OpenWRT est 192.168.1.1, il se peut que votre Box internet soit aussi sur la même réseau et cela va créer des problèmes. Il faut donc changer votre adresse sur OpenWRT pour éviter les incompatibilités. Le mieux est de débrancher le routeur OpenWRT de votre box Internet le temps de faire la manipulation.

Changer son IP

Allez dans Network -> Interfaces puis dans l’onglet interfaces, éditez l’interface lan. Ensuite, dans l’onglet General Settings changer l’adresse dans IPv4 adress (Ex 192.168.20.1 ici).

Réglages généraux de l'interface LAN dans OpenWRT

Connexion par Ethernet

Normalement, à ce stade, vous devriez avoir Internet sur les ports Ethernet de votre routeur, mais toujours pas de Wi-Fi configuré.

Je n’ai jamais réussi à avoir internet en désactivant le DHCP de ma box opérateur (Sosh). J’ai donc dû laisser le DHCP sur le réseau 192.168.1.1 géré par la box internet, mais par contre, j’ai réduit la plage d’attribution à deux IP seulement

Ajouter un point d’accès Wi-Fi

Nous allons ajouter deux interfaces Wi-Fi dans cet article, une 2.4GHz et une 5GHz, libre à vous d’en ajouter d’autres.

Tout se passe dans Network -> Wireless Configuration du Wi-Fi dans OpenWRT

Vous avez trois bandes radio sur le X3600 :

  • ac/b/g/n : Wi-Fi 5 (5GHz 5300Mbps), 2 (2.4GHz 11Mbps), 3 (2.4GHz 54Mbps), 4 (2.4GHz et 5GHz 288Mbps et 600Mbps)
  • ac/ax/n : Wi-Fi 5 (5GHz 5300Mbps), 6 (2.4GHz et 5GHz 10 530Mbps), 4 (2.4GHz et 5GHz 288Mbps et 600Mbps)
  • ax/b/g/n : Wi-Fi 6 (2.4GHz et 5GHz 10 530Mbps), 2 (2.4GHz 11Mbps), 3 (2.4GHz 54Mbps), 4 (2.4GHz et 5GHz 288Mbps et 600Mbps)

Il suffit donc soit d’ajouter un nouveau réseau sur chaque antenne, soit d’éditer celui présent par défaut nommé OpenWrt.

Nous allons éditer celui présent. Configuration du Wi-Fi dans OpenWRT Il n’y a pas grand-chose à configurer pour que ça marche simplement. Dans l’onglet General Setup :

  1. Laissez Access Point pour le mode,
  2. Donnez-luii un nom dans ESSID,
  3. Laisser l’interface lan dans Network.

Dans l’onglet Wireless Security : Configuration de la clé Wi-Fi dans OpenWRT

  1. Choisissez le format de clé qui vous convient le mieux (préférez une des trois affichées en strongly),
  2. Dans Key saisir votre clé (mot de passe de connexion a votre nouveau Wi-Fi)

Répétez ces opérations avec les trois bandes présentes, puis sauvegardez et appliquez les modifications.

Pour un usage domotique, j’aime bien dissocier le nom des bandes 2.4 et 5GHz, ça évite les problèmes de connexion des appareils ne pouvant fonctionner que sur le 2.4GHz (la plupart des appareils domotique)

Maintenant, vos interfaces étant toujours désactivées, il faut les activer en cliquant sur le bouton Enable en face de chaque interface radio. Une fois activée, la LED bleue sur l’antenne centrale de votre routeur devrait s’allumer.

Mes nouvelles interfaces Wi-Fi sont présentes. (Pour le tuto, j’ai différencié les deux bandes 5GHz pour que vous puissiez voir qu’elles sont bien présentes).

Détection des interfaces Wi-Fi nouvellement créés

Conclusion

Vous voila avec un routeur grand public, mais équipé d’une solution totalement OpenSource. Fini les envois vers des serveurs chinois ou autres de vos données.

OpenWRT permet de faire beaucoup plus de choses comme de l’agrégation de lignes (deux lignes internet en une, exemple ADSL et 4G), la création de plusieurs réseaux Wi-Fi (Domotique, Invité, etc), de faire des Vlans, des DMZ mais aussi d’étendre les réglages et options par rapport à un routeur classique. Il permet aussi d’exporter vos réglages pour ensuite les réimporter en cas de problème.

Alors, bonne découverte et amusez-vous bien avec votre nouveau jouet.

PS : Je vous laisse un lien vers du contenu en français sur OpenWRT.

Sources