hack_xiaomi_mi_zigbee_sniffer

Hack Xiaomi Mi SmartHome – Zigbee Sniffer

Cet article fait suite à la découverte de la technologie utilisée dans les capteurs « SmartHome » de chez Xiaomi. Comme vous avez été nombreux à apprécier mon précédent billet sur le hack du capteur de température / humidité Xiaomi. Je me suis dit qu’il fallait que j’aille un peu plus loin. Sniffer le protocole Zigbee avec un capteur Xiaomi.

J’ai donc franchi le pas et lu le plus de documentations possibles (pour « hacker », on est obligé de bien connaître sa cible) sur le microcontrôleur JN5169

D’ailleurs en parcourant le web, à la recherche de documentations, je suis tombé sur un logiciel très intéressant, Ubiqua protocol analyzer, permettant de sniffer des trames Zigbee ! Dans ma tête, je me suis dit, c’est génial ! C’est parfait pour comprendre le fonctionnement d’un appareil et correspond à un petit projet pour commencer sans être plongé directement dans le code.

Ma note :

Votre note

[Total : 41    Moyenne : 3.4/5]

Voici comment j’ai procédé :

Hardware

Les différents capteurs

Pour tout vous dire, je suis tombé sur ces petits capteurs car je suis l’actualité « SmartHome » et que je suis moi même équipé d’appareils domotiques pour rendre ma maison « intelligente ».

Les capteurs ne sont pas très chers, de bonnes qualité et sont tout petits. Du coup, j’en ai commandé un jeu:

Pour le capteur de température, je vous laisse relire mon article

Voici à quoi ressemble le capteur de mouvement:

Vous pouvez vous le procurer ici :

xiaomi body sensorOriginal Xiaomi Smart Human Body Sensor

Voici la carte électronique correspondant au cœur :

xiaomi_human_body_sensor_progCœur du capteur avec le port de programmation

Ça ne vous rappelle rien ? hé bien si, je crois bien que c’est le même port de programmation que le capteur de température et humidité précédemment testé.

xiaomi_body_sensor_avantCapteur PIR de la carte fille

xiaomi_body_sensor_completCœur et carte fille assemblées

Et voici le capteur d’ouverture de porte :

Vous pouvez vous l’acheter ici :

xiaomi door sensorOriginal Xiaomi Mi Smart Temperature and Humidity Sensor

Voici côté carte électronique:

Xiaomi_Door_sensor_progPort de programmation du capteur d’ouverture de porte Xiaomi

Xiaomi_Door_sensor_JN5169Coeur de la carte électronique avec capteur ILS

Vous remarquerez que les ports de programmation se présentent toujours sous la même forme. En effet, pour la production, c’est plus facile, un seul programmateur pour tous les types de capteurs.

Et bien pour nous aussi…

J’avais déjà produit rapidement, un bout de carte électronique pour récupérer les infos du capteur mais, il n’était pas pratique car il fallait souder des petits fils pour démarrer dans le « bootloader » puis dessouder pour repasser dans le programme principal.

J’ai donc décider de développer une carte électronique un peu plus évoluée pour que ce soit plus commode pour moi.

Carte électronique pour flasher les objets

Voici le schéma de la carte :

schema_prog_jn5169Schématique de la carte de programmation

Avec pour JP1 (Série TTL du câble FTDI :

1 = GND
2 = TX
3 = RX

Pour JP2 (Connecteur côté capteur) :

1 = TX
2 = RX
3 = DO1
4 = VCC
5 = RST
6 = GND

SW1 sert à démarrer en mode UART sur le Bootloader.
SW2 sert à redémarrer le microcontrôleur.

Voici à quoi cela ressemble une fois réalisé :

Carte programmation xiaomi USB FTDICarte de programmation des Capteurs Xiaomi Mi SmartHome

Vous reconnaissez surement le convertisseur USB / Série FTDI que j’utilise dans mes projets. Vous pouvez le retrouver ici :

Convertisseur USB / Série TTL FTDI

J’aurai bien voulu faire une carte électronique avec des « pogos pins » pour que ce soit au top, comme les vrais 😉 mais j’en ai pas en stock (du coup j’en ai commandé pour les prochains projets). J’ai donc utilisé des petits connecteurs mâles et femelles adaptés au pas du port de programmation.

Carte de programmation capteurs xiami vu de dessousCarte de programmation vu de dessous avec connecteur pour Xiaomi

Carte de programmation connectée au capteur XiaomiProgrammateur Xiaomi connecté au capteur d’ouverture de porte

Voilà, cette fois-ci c’est bon, nous avons terminé la partie matérielle et nous avons tout ce dont nous avons besoin pour jouer avec les capteurs Xiaomi Mi.

Cependant, il reste encore un travail indispensable. En effet, l’un n’est rien sans l’autre. Il va falloir s’attaquer à la partie logiciel.

Logiciels

Pour pouvoir mettre en place mon sniffer, il faut deux logiciels :

  • 1 pour le capteur Xiaomi (firmware sniffer)
  • 1 pour l’ordinateur qui va analyser les trames

Voici comment ça fonctionne concrètement:

schema_hack_fonctionnement_XiaomiPrincipe de fonctionnement du « Sniffage » de Zigbee

Firmware pour sniffer

Figurez-vous que quand j’ai installé le SDK pour développer sur le JN5169, en parcourant les différents répertoires, je suis tombé sur un dossier nommé « Tools » avec dedans un fichier binaire JennicSniffer !!!

En me renseignant sur la toile je me suis aperçu que ce firmware permettait au microcontrôleur d’être en tant que coordinateur (c’est à dire récepteur) et de re-router les paquets sur le port série. Intéressant, mais pas que… en plus de cela, il existe au moins 1 logiciel (je vous expliquerai juste après pourquoi le « au moins ») capable de décoder les trames pour en extraire le type de protocole et les données.

Je me suis donc muni de mon programmateur et à l’aide du logiciel BeyondStudio for NXP et du SDK, j’ai flashé le capteur de température Xiaomi pour qu’il devienne un » Sniffer » Zigbee.

jn5169_ecriture_flashEcriture dans la flash du JN5169

J’ai simplement sélectionné le fichier binaire et j’ai cliqué sur « Program ».

PS: petite anecdote… Quand j’ai lancé la programmation du capteur, j’ai eu un message d’erreur disant encore une fois que la mémoire était protégée dû au paramétrage de l’OTP. Je suis resté au moins 2 heures à essayer de comprendre pourquoi il y avait une erreur et comment modifier l’OTP.

En fait, je n’avais pas vu 2 choses:

  • La première, c’est que j’avais coché l’option de vérifier le programme après flashage.
  • La deuxième est que la vitesse de flashage (1000000 baud/s) est tellement rapide que je n’avais pas vu le point précédent.

JN5169_CRP

Du coup, l’écriture se passe bien mais c’était la relecture qui provoquait l’erreur… Normal, on a vu sur mon premier billet que la lecture était protégée…

Bref, tout va bien, j’ai juste perdu un peu de temps avant de comprendre le problème.

Logiciel de « sniffage »

Maintenant que le capteur est en mode « Sniffer », il ne manque plus qu’à installer le programme sur Windows afin de récupérer les trames et les analyser.

En cherchant un petit peu (vraiment pas beaucoup), je suis tombé sur un logiciel d’analyse de trames Zigbee compatible avec le firmware que j’ai intégré dans le capteur Xiaomi.

Ce logiciel s’appelle : Ubiqua Protocol Analyzer.

C’est la société Ubilogix qui l’a développé et se veut être compatible avec le plus de matériels possibles destinés au protocole IEEE 802.15.4 et ces couches supérieures (dont le Zigbee).

Pour obtenir ce logiciel, il faut s’inscrire, s’authentifier et valider une licence de démonstration qui vous permet de l’utiliser pendant 21 jours et 1000 trames sniffées par sessions.

J’ai estimé que c’était largement suffisant pour mon utilisation.

Je suis notamment tombé sur de vieux « posts » sur la communauté NXP qui permettait de pouvoir rendre compatible Wireshark avec le Sniffer Jennic. Ils mettaient (et oui je ne trouve plus le ZIP) à disposition une sorte de passerelle port série / loopback ethernet permettant à Wireshark de récupérer toutes les trames provenant de la COM.

Wireshark ensuite utilise son moteur de décodage et de filtres pour récupérer les données Zigbee. Le gros avantage étant que Wireshark est opensource et gratuit. D’ailleurs, n’hésitez pas à mettre en commentaire si vous avez plus d’informations à ce sujet.

Bref voici à quoi ressemble Ubiqua Protocol Analyzer:

ubiqua_sniffer_1Logiciel ubiqua protocol analyzer

Pour commencer, il faut créer l’appareil qui va permettre de sniffer les trames.

En haut à gauche, il y a le « Device Manager » et c’est ici que ça se passe. Il suffit de cliquer sur « Add Device ».

Normalement un popup apparait avec un port COM ouvert. Il faut le sélectionner. Une fois ajouté, il apparaitra dans la fenêtre. Si vous avez tout réussi (matériellement parlant), en poussant le curseur du « device » sur la droite, votre appareil passe en vert. C’est gagné !!! les deux logiciels se comprennent !!!

Il ne manque plus qu’à faire dialoguer les appareils de Xiaomi Mi SmartHome pour voir ce qu’il se passe.

Résultats

Voici comment j’ai procédé:

  • J’ai démarré le sniffer
  • J’ai installé la passerelle Xiami Mi SmartHome
  • J’ai appairé le capteur d’ouverture de porte
  • J’ai appairé le capteur de détection de mouvement

Voici ce que j’ai obtenu :

ubiqua_sniffer_zigbee_generalTableau général du sniffage

Première chose, les capteurs Xiaomi Mi parle bien avec le protocole Zigbee. (Oui ça aurait pu être un dérivé ou du Jeninet par exemple).

Ensuite, le logiciel à bien détecté le coordinateur (en rouge) et les nœuds (en gris) avec leur identifiant respectif.

Le logiciel arrive bien à décoder les différentes séquences, que ce soit l’appairage, les acquittements, les commandes, les données, les requêtes, etc…

Je trouve que c’est de bonne augure pour apprendre et comprendre le fonctionnement des capteurs.

A droite, nous avons le décodage et la structure de chaque paquet sniffé comprenant les informations du paquets, les entêtes, les données du protocole.

Bref, j’ai désormais tout ce qu’il me faut pour analyser tous les paquets et comprendre le fonctionnement du protocole.

Cependant, j’ai pu m’apercevoir que les données utiles des capteurs restent chiffrés. Il est donc impossible (sans connaître la clef) de développer une passerelle Zigbee / port série compatible avec les capteurs Xiaomi Mi existant (avec le firmware d’origine).

Exemple :

ubiqua_sniffer_encrypted_data

Dommage mais assez logique… (cependant, c’est peut-être possible de cracker la clef en faisant du brute force … en utilisant le même principe que le crack des clefs WEP).

Conclusion

Cette partie de hack des capteurs Xiaomi Mi est en quelque sorte un intermédiaire vers l’aboutissement du projet. Intermédiaire, mais indispensable pour la suite car il permet d’appréhender de manière plus sereine la suite du projet.

L’analyse des autres capteurs de la série ainsi que le développement du capteur tienne une place essentielle. En effet, grâce à ces outils, je vais pouvoir travailler dans de meilleures conditions sans faire trop de bricolages hasardeux.

Le sniffage des trames Zigbee, elles, m’ont permis de valider plusieurs points:

  • Les fonctions d’écriture sur un capteur Xiaomi sont fiables.
  • Le protocole utilisé correspond bien à du Zigbee
  • Les données des capteurs sont chiffrés

Face à ces constats, je pense que je vais développer mes propres binaires afin d’exploiter au maximum le matériel développé par Xiaomi.

Il va falloir désormais, développer le coordinateur (passerelle Zigbee / port série) pour brancher sur une Raspberry Pi. Et Ensuite, développer le code pour chaque type de capteur et ses services.

Pour ceux qui ont déjà des passerelles Zigbee maîtrisées, cela leur permettra de détourner les capteurs Xiaomi Mi pour coller à l’existant.

 

[Total : 41    Moyenne : 3.4/5]

34 comments

  1. Bonjour, c’est la première fois que je tombe sur un site comme le tiens ! C’est un vrai plaisir de te lire, car tes explications sont claires et j’arrive à comprendre ce que tu fais sans avoir de grandes connaissances en électronique, je possède ces capteurs et il est clair que je vais suivre tes avancements…

  2. Super ton article.
    Pourquoi ne pas utiliser un clef USB zigbee pour déchiffrer tous ça ?
    Je suis ton article de près car je risque d’avoir le même objectif avec mes volets roulant zigbee

    1. @ Dams
      Je suis prêt à parier que tes volets roulant sont de marque Profalux , si oui j’ai le même soucis que toi… ces hacks pourrait bien nous éclaircir sur le sujet.

      1. @cyril
        En effet c’est bien des profalux.
        Je suis un autre article à ce sujet. Quelqu’un qui commande déjà les siens avec des commandes en python. Mais ce n’est pas le sujet de cette article. Si besoin d’informations fait moi signe .

    1. Merci. Très bonne remarque. Vu que je suis en tant que sniffer (hors appairage), c’est un chiffrage du protocole zigbee.

      En gros, c’est la négociation entre le capteur et la passerelle qui génère la clef de chiffrement. Du coup eux seuls peuvent se comprendre. Ton lien est en relation directe avec la suite de mes travaux.

      Un peu de patience et je vous dévoilerai mes résultats des que je peux.

  3. super , j’ai hate 🙂
    j’ai un CC2530 en usb , j’arrive a utiliser le sniffer de TI mais je cherche aussi a l’utiliser en coordinateur sur un raspi ^^

  4. Hello,

    Super ton blog, super articles !

    J’utilise la solution mi pour ma domo avec la gateway mi, mais je trouves les plugs dangereuses en particulier avec un adaptateur et j’essaye de les intégrer directement dans la prise

    Plutôt simple a démonter on trouve à l’intérieur le même JN5169 sur une carte fille indépendante de la partie 220V !

    Par contre, particulièrement quand démonté et quand une une charge meme faible est présente sur la sortie, la portée est extrêmement faible comparé aux autres éléments mi, alors que celui-ci est alimenté et devrais faire relais zigbee ?!?

    J’ai donc hâte de voir ton retour sur les prises et du hack que tu trouveras

    Je peux partager un mini tuto démontage si ta pas encore démonté la tienne

    ++
    seb

  5. Bonjour, superbe article 🙂 j’attend la suite avec impatience… j’ai deja commandé 2 capteurs.
    Il doit y avoir une erreur entre ton schema de cablage et la description du jp2, vcc et rst sont inversé mais est ce le schema qui est bon ou la description ?

    1. Non pas du tout. Ce sont des clefs pour la partie WiFi. En mettant la passerelle en mode développeur et utilisant la clef fournie, la passerelle te transmet par UDP le trafic…
      Dans ma partie, c’est les clefs de chiffrage zigbee que je recherchais, mais c’est réglé. Dans les prochains jours je vous partagerai tout ça… Un peu de patience

  6. Bonjour,
    Super ton article, très intéressant. J’ai effectué il y a quelques mois des tests similaires aux tiens de mon coté avec une clef USB Texas Instrument CC2531. En utilisant le logiciel Perytons pour sniffer les trames j’ai eu la surprise de voir qu’il avait réussi à décrypter, tout seul, l’intégralité des trames. Je voyais clairement ouverture de porte, clic interrupteur, etc… Je suis embêté car ce logiciel est sous licence et ne démarre plus chez moi après la période d’essai, va falloir que je le réinstalle sur une VM. Mais j’avais sniffer un appairage et de l’utilisation ensuite et une clé était apparue lors de l’appairage. J’ai encore une sauvegarde de mes fichiers de captures au format perytons si ça peut t’interesser.
    De mémoire j’avais noté une clé ( 1D3EABF4691AD73075B6C32C41126FE8 ) sur ma gateway v1 (celle non compatible avec le mode développeur) mais je n’ai pas réussi à l’exploiter et à aller plus loin dans ma recherche. J’avais l’impression qu’il me manquait autre chose, que c’était pas la bonne clé et est du m’occuper d’autres projets. Depuis la gateway v2 est sorti et je l’ai achetée pour le mode dev et n’ai pas fait le meme test de sniff voir si la même clé ressortait.
    En espérant que ça puisse te servir dans tes recherches car ton travail est sur une bonne voie et si il était possible d’utiliser les capteurs Xiaomi directement sans avoir à les hacker grâce à la clé ça serait super.

    1. Merci pour tes informations. Je suis en ce moment même en train de rédiger un article sur la découverte de la clef. (Dailleurs, je n’ai pas la même que toi). Je devrais publier l’article Lundi et vous annoncer de bonne nouvelles.

      1. Génial j’attends ça avec impatience alors. Je vais repartir sur mes tests je pense avec ma gateway v2 et voir si je peux extraire qqc d’intéressant et comparerait avec ton futur article.

  7. hello,

    vivement lundi 🙂 super article.
    peux tu vérifier le schéma pour flasher ou la description du connecteur jp2, je vois une inversion entre VCC et RST mais je sais pas lequel est correct.
    encore bravo.

    Michael

  8. Super travail, j’adore lire des article qui vont aussi profond dans la technique.
    J’ai une question un peu loin du sujet mais sur ton capteur, je vois un emplacement GND, DI+
    Quelqu’un serait il a quoi correspond le DI+? Je cherche à déporter l’ouverture pour tester sur ma boite aux lettres. Je n’ose pas faire un court circuit pour tester…
    J’ai vu que lunarok l’utilise pour un interrupteur mais bon.

  9. Super article.
    J’ai vraiment hate de recevoir ma Zigate.

    Mais n’aurais-tu pas inversé sur JP2 les sorties 4 et 5 (5 est Reset mais branché sur vcc).

    En tout cas bravo pour tes articles.

  10. Grace à ton article j’ai réussi à transformer mon bouton Xiaomi en sniffer Zigbee.
    Le seul problème que j’ai eu (a part les soudures sur le bouton) était pour démarrer le sniffer :
    Impossible de se connecter au device dans Ubiqua.

    Par défaut le Flow control était à « RequestToSend ».
    Des que je l’ai passé à « None » plus de problèmes.

    Encore une fois merci.

Leave a Reply

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