En 2019, je vous ai présenté le routeur Xiaomi Mi Routeur 4 qui fonctionne en 2,4 et 5 GHz. Pour l’utiliser on est obligé de passer par l’application du constructeur : MiWiFi. Si on veut se sortir de cette obligation, il est possible d’installer OpenWrt, une solution libre. Benoît m’a proposé cet article pour modifier un Routeur Xiaomi, voici son article.
Au sommaire :
Passer le routeur Xiaomi Mi R4 sous OpenWrt
Attention, cette modification du routeur nécessite la prise en compte de plusieurs sources indiquées dans l’article. Ne vous lancez pas si vous n’avez pas les notions nécessaires à ces opérations. Vous pourriez « bricker » le routeur… le transformer en brique, en presse-papier, quoi 🙂 Nous ne pourrons pas vous aider en cas de souci et framboise314 comme l’auteur de l’article ne pourront être tenus pour responsable d’un mauvais fonctionnement.
OpenWrt
Le projet OpenWrt est un système d’exploitation Linux destiné aux appareils embarqués. Au lieu d’essayer de créer un seul firmware (micrologiciel) statique, OpenWrt fournit un système de fichiers avec gestion des paquets. Cela vous libère de la sélection et de la configuration des applications fournies par le fournisseur et vous permet de personnaliser le dispositif grâce à l’utilisation de paquets pour l’adapter à n’importe quelle application. Pour les développeurs, OpenWrt est le cadre permettant de construire une application sans avoir à écrire un micrologiciel complet autour de celle-ci. Pour les utilisateurs, cela offre la possibilité d’une personnalisation complète, permettant d’utiliser l’appareil d’une manière qui n’avait pas forcément envisagée par le constructeur.
L’article de Benoît
Bonjour, je n’ai rien inventé, juste pas mal fouillé pour trouver ce tuto que je détaille rapidement, j’ai surtout ressorti toutes les lignes de commandes. (en gras les lignes de commandes)
Sources
https://www.youtube.com/watch?v=BCLzeYCIp9Q&t=6s
Pre-requis
Il vous faut une machine sous Linux, soit en live, soit en dual boot, soit via wsl ou encore une framboise.
- Connecter le routeur
- Connecter la prise Wan du routeur au réseau filaire Ethernet (vers votre Box)
- Connecter un câble Ethernet au PC et le relier à un port Ethernet du routeur
Les manips sont à faire lorsque tout est câblé, une fois le flashage fini le routeur sera en 192.168.1.1 avec serveur DHCP sur les ports Ethrenet (eth), le wan sera en mode client DHCP, le WiFi sera off (il faudra le configurer une fois le flashage terminé et vérifié)
Pour commencer, on se sert d’une faille de sécurité du routeur pour activer le telnet, ssh et ftp.
Facultatif, se rendre sur les liens suivants.
https://github.com/acecilia/OpenWRTInvasion
Télécharger remote_command_execution_vulnerability.py : https://github.com/acecilia/OpenWRTInvasion/blob/master/remote_command_execution_vulnerability.py
Télécharger requirements;txt : https://github.com/acecilia/OpenWRTInvasion/blob/master/requirements.txt
Copier ces fichiers sur une clef ou dans un dossier, vous pouvez aussi utiliser
wget ‘url du fichier’
Pour récupérer ces fichiers plus simplement sous linux
Etape 1- prendre le contrôle du routeur
Ici nous somme donc en ligne de commande sous un Linux connecté en réseau filaire au routeur et le wan du routeur connecté au réseau local (Box).
Idéalement les maips suivantes se font dans /tmp/
wget https://github.com/acecilia/OpenWRTInvasion/blob/master/remote_command_execution_vulnerability.py
wget https://github.com/acecilia/OpenWRTInvasion/blob/master/requirements.txt
pip3 install -r requirements.txt
python3 remote_command_execution_vulnerability.py
on met l’ip du routeur (192.168.31.1)
le numéro stok
Pour ça, se rendre sur http ://192.168.31.1 avec vôtre navigateur favori.
et copier ce qui est après stoc=……… sans le /
On se connecte en telnet sur le routeur
telnet 192.168.31.1
user=root
pass=none ou root
cd /tmp/
Facultatif, se rendre sur les liens suivants.
https://github.com/ioiotor/mir4-ss/releases
Télécharger les .bin
On a besoin de ces 2 .bin dans /tmp/ . Vous pouvez utiliser wget pour les récupérer.
En ligne de commande
Etape 2 – on flash le nouveau firmware et on applique les modifications.
wget https://github.com/ioiotor/mir4-ss/releases/download/V19.07.4/openwrt-ramips-mt7621-xiaomi_mir4-squashfs-kernel1.bin
wget https://github.com/ioiotor/mir4-ss/releases/download/V19.07.4/openwrt-ramips-mt7621-xiaomi_mir4-squashfs-rootfs0.bin
mtd write openwrt-ramips-mt7621-xiaomi_mir4-squashfs-kernel1.bin
mtd write openwrt-ramips-mt7621-xiaomi_mir4-squashfs-rootfs0.bin
nvram set uart_en=1
nvram set bootdelay=5
nvram set flag_try_sys1_failed=1
nvram commit
reboot
On attend, ça peut prendre quelques minutes.
Et voilà, votre routeur est maintenant sous OpenWrt.
Conclusion
Merci Benoît pour cet article qui permettra aux possesseurs de routeurs Xiaomi Mi 4 de les passer sous OpenWrt. N’hésitez pas à indiquer dans les commentaires ci-dessous les résultats que vous obtenez ou les difficultés que vous avez pu rencontrer.
Merci pour ce tuto.
Je m’étais pris le 3G v1 (30€) lors des black fridays il y a 2 ans pour m’initier au hacking. Par contre je l’ai fait directement en UART.
Donc s’il a bien aussi une prise uart, ces petites bestioles sont imbrickable. Sous U-boot (leur « bios »),
on peut dialoguer en ssh, telnet, ssh, tftp ; donc on a le choix.
Bonjour
eh non là c’est uniquement accessible en WiFi via l’appli ou alors par l’@ IP
bonne année à toi et tes proches, et plein de nouveaux projets
cdt
françois
Merci François et à toi aussi.
Je viens de voir les photos et il a bien l’UART donc la manip devrait être faisable. Et si uboot comprend aussi le TFTP, on peut se créer un serveur TFTP (avec MobaXterm) et injecté directement les firmwares dedans. J’avais débrické le mien comme ça.
J’ai reçu un mail de Benoît, je retranscris notre conversation en-dessous
Mail reçu de Benoît (ce n’est pas confidentiel donc je me permets ;))
Salut,
Bonne année.
As tu un tuto pour les routeurs xiaomi et l’uart ttl ?
Sur le R4 il y a aussi moyen de rentrer en ttl, et même si pas besoin car pas encore brické ca peut servir.
PS la manip est la même pour beaucoup de routeurs de la marque, faut juste avoir les bons .bin
Sur A4 ca marche, sur le tien aussi.
Pour l’histoire, j’avais commandé un 3g v1 à 28€ sur ali et j’ai recu un R4 (remboursé en partie, il m’est revenu à 12€) donc ca va mais pas d’usb et 2 fois de ram. Ca fait le taff quand même..
Salutations
Ben
Bonne année à toi aussi.
J’avais suivi celui-là : https://dzone.com/articles/hacking-into-xiaomi-mi-router-3g-and-openwrt-firmw
J’y ai 2 choses à lui reprocher : il ne précise pas que la logique TTL Arduino est à 5V et celui du Mi à 3.3V. En final, ça l’a fait, toute une après-midi. Et il faut spammer la touche « enter » au boot pour voir le choix du démarrage sinon, ben ça boot.
La page d’openwrt est sympa aussi : https://openwrt.org/toh/xiaomi/mir3g
Il est vrai que le 3G v1 pour 30€ est vraiment un must-have. Ils ont dû s’en rendre compte et on sortit la v2 complètement bridé.
J’avais fait toutes les manips sous Windows et Mobaxterm : ssh, serial, serveur tftp. Je l’avais brické et je m’en étais sorti en tftp.
Pour 30€ je m’étais bien formé sur des protocoles / matos que je ne connaissais pas. La preuve, 2 ans plus tard je m’en souviens encore.
Bonne journée
Pour info, il est possible d’exécuter le script python à partir de WSL si vous n’avez pas Linux sous la main.
Il est aussi préférable de monter un port série avec un dongle ch340g par exemple en 3,3V pour mieux voir ce qui se passe pendant l’installation.
Sinon les performances sont bonnes en wifi, j’ai entre 200 et 450MBPS avec iperf3 en mode bridge.
Pour le prix, c’est un bon choix de borne wifi pour celui qui ne veut pas trop dépenser et avoir des performances.
Une borne UniFi à 100€ ne fait pas mieux, il faut juste mettre la main à la pâte.
Je conseille également mobaxterm pour le telnet et port série.
Bonjour,
Debian ne connaît pas ces deux commande:
pip3 install -r requirements.txt
python3 remote_command_execution_vulnerability.py
Il faut les taper dans le terminal?
bonjour
oui c est a taper dans un terminal
qu’avez vous comme réponse quand vous tapez
pip3 –version
(faites un copier coller de la réponse SVP)
j’ai :
ERROR: unknown command « –version »
quand je réinstalle j’ai:
Lecture des listes de paquets… Fait
Construction de l’arbre des dépendances
Lecture des informations d’état… Fait
python3-pip est déjà la version la plus récente (18.1-5).
il y a 2 tirets devant version – – mais sans espace entre les 2
onjour,
Dans un terminal :
sudo apt install python3-pip
ensuite :
pip3 install -r requirements.txt
python3 remote_command_execution_vulnerability.py
installation ok sudo apt install python3-pip
pip3 install -r requirements.txt j’obtiens
Invalid requirement: »
Traceback (most recent call last):
File « /usr/share/python-wheels/packaging-19.0-py2.py3-none-any.whl/packaging/requirements.py », line 93, in __init__
req = REQUIREMENT.parseString(requirement_string)
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 1632, in parseString
raise exc
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 1622, in parseString
loc, tokens = self._parse( instring, 0 )
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 3395, in parseImpl
loc, exprtokens = e._parse( instring, loc, doActions )
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 3717, in parseImpl
return self.expr._parse( instring, loc, doActions, callPreParse=False )
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 3378, in parseImpl
loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 1383, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File « /usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py », line 2689, in parseImpl
raise ParseException(instring, loc, self.errmsg, self)
pyparsing.ParseException: Expected W:(abcd…) (at char 0), (line:1, col:1)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File « /usr/lib/python3/dist-packages/pip/_internal/req/constructors.py », line 253, in install_req_from_line
req = Requirement(req)
File « /usr/share/python-wheels/packaging-19.0-py2.py3-none-any.whl/packaging/requirements.py », line 97, in __init__
requirement_string[e.loc : e.loc + 8], e.msg
pip._vendor.packaging.requirements.InvalidRequirement: Parse error at « ‘<!DOCTYP'": Expected W:(abcd…)
Bonjour,
J’ai réussi en suivant cette vidéo(https://www.youtube.com/watch?v=VxzEvdDWU_s), toute les étapes on fonctionné, le hic c’est que dans cette vidéo il prend un firmware de 3g ??? je me suis dit ca doit etre la bonne manière vu que jusque la tout fonctionne et du coup je pense avoir briqué le routeur. Du coup en fin de vidéo il explique comment débriqué (https://hoddysguides.com/xiaomi-debrick-tools-all/) je ne suis pas sure d’avoir bien compris la manip car tout est bon, j’attend 10mn pendant le flash mais quand je redémarre le routeur j’ai la led orange allumé et pas de ping sur 192.168.31.1.
As tu déjà testé cette manip du débricage?
pour récupérer requirements.txt et le programme utilisez ces commande en remplacement
wget https://raw.githubusercontent.com/acecilia/OpenWRTInvasion/master/requirements.txt
wget https://raw.githubusercontent.com/acecilia/OpenWRTInvasion/master/remote_command_execution_vulnerability.py
dites moi si ça a fonctionné SVP
oui ca avait fonctionné j’avais c’est deux paquets dans /temp
C’est l’étape suivant qui avait bloqué
$/temp/pip3 install -r requirements.txt
Du coup avec l’autre manip (voir la vidéo dans mon poste plus haut) ou tu clones directement j’ai fait la même commande en me mettant dans le dossier créé /Openwrt/pip3 install -r requirements.txt et ça a fonctionné
Donc le lien que tu donnes
wget https://raw.githubusercontent.com/acecilia/OpenWRTInvasion/master/requirements.txt
n’est pas bon apparemment
Je ne peux plus tester maintenant wget https://raw.githubusercontent.com/acecilia/OpenWRTInvasion/master/requirements.txt
et
wget https://raw.githubusercontent.com/acecilia/OpenWRTInvasion/master/remote_command_execution_vulnerability.py
vue que le routeur ne ping plus sur 192.168.31.1 et je j’ai la led orange allumé fixe.
Mon souci c’est d’abord de débriquer le routeur pour refaire une tentative
ok sur le routeur je ne peux pas vous aider.
désolé
j’ai trouvé ça :
https://forum.openwrt.org/t/xiaomi-router-4a-gigabit-bricked/77971
well, if you have R4AC global version story is different . try this method : 1-download MIWIFIRepairTool from xiaomi: http://bigota.miwifi.com/xiaoqiang/tools/MIWIFIRepairTool.x86.zip 2-download chinese firmware 2.18.28: https://anonfile.com/h414S108o6/miwifi_r4ac_all_c4b35_2.18.28_rar 3-set static ip to your computer
ok merci pour les infos je vais me concentrer la dessus et je reviendrai refaire une nouvelle tentative quand j’aurai résolu cela
RE
ok mon routeur est débriqué et il est de retour avec le firmware de base de xiaomi.
pour info tes lien:
wget https://github.com/acecilia/OpenWRTInvasion/blob/master/remote_command_execution_vulnerability.py
et
wget https://github.com/acecilia/OpenWRTInvasion/blob/master/requirements.txt
sont bon j’ai pu tester.
Ce soir je reprend la manip de Benoît pour passer ce routeur avec OpenWrt
Merci 😊 bonne continuation
la commande ne fonctionne pas
/tmp$ python3 remote_command_execution_vulnerability.py
Router IP address [press enter for using the default 192.168.31.1]:
stok: 9aefb …………………….d7f7464a
Traceback (most recent call last):
File « remote_command_execution_vulnerability.py », line 41, in
with open(« speedtest_urls_template.xml », « rt », encoding = « UTF-8 ») as f:
FileNotFoundError: [Errno 2] No such file or directory: ‘speedtest_urls_template.xml’
Vous avez une idée?
J’ai réussi à m’en sortir. J’ai fait un mix de plusieurs tuto pour avoir le bonne formule.
Ce modem toune donc avec la version snapshot de openwrt pour le xiaomi 4A gigabite, malgré la version snapshot depuis deux jours rien à signaler c’est stable et tout fonctionne bien.
Ping : Chien Robot XGO2 avec Raspberry Pi CM4 et ESP32 de ElecFreaks - Framboise 314, le Raspberry Pi à la sauce française....
Ping : Installer OpenWRT sur un routeur Xiaomi AX3000T - Framboise 314, le Raspberry Pi à la sauce française....