Publié le 1 janvier 2021 - par

Passer le routeur Xiaomi mi R4 sous OpenWrt

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.

Passer le routeur Xiaomi Mi R4 sous OpenWrt

Cliquez pour des informations sur le niveau

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

https://github.com/ioiotor/mir4-ss/releases/download/V19.07.4/openwrt-ramips-mt7621-xiaomi_mir4-squashfs-kernel1.bin

https://github.com/ioiotor/mir4-ss/releases/download/V19.07.4/openwrt-ramips-mt7621-xiaomi_mir4-squashfs-rootfs0.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.

http://192.168.1.1

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.

Sources

Share Button

23 réflexions au sujet de « Passer le routeur Xiaomi mi R4 sous OpenWrt »

  1. dyox

    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.

    Répondre
      1. dyox

        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

        Répondre
  2. dyox

    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

    Répondre
    1. dyox

      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

      Répondre
  3. Seb

    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.

    Répondre
  4. Grum

    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?

    Répondre
      1. Grum

        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).

        Répondre
  5. Benoit

    onjour,
    Dans un terminal :
    sudo apt install python3-pip

    ensuite :
    pip3 install -r requirements.txt
    python3 remote_command_execution_vulnerability.py

    Répondre
  6. Grum

    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…)

    Répondre
    1. Grum

      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?

      Répondre
  7. Grum

    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

    Répondre
  8. Grum

    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?

    Répondre
    1. Grum

      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.

      Répondre
  9. Ping : Chien Robot XGO2 avec Raspberry Pi CM4 et ESP32 de ElecFreaks - Framboise 314, le Raspberry Pi à la sauce française....

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.