09
déc.
'20

Attaquer du ZigBee pour moins de 10€ ? Yes we can !

Publié le 09 décembre 2020

to (Killer)bee or not to (Killer)bee

Je me suis récemment attaqué à la rétro-ingénierie du Ninja Badge de la DEFCON 18, et il se trouve que ce badge communique avec d'autres badges similaires via la couche MAC du protocole ZigBee (IEEE 802.15.4). Disposant d'un HackRF One, j'ai réussi à décoder les messages envoyés à l'aide de Gnuradio Companion, mais il m'était très difficile de coder un outil permettant de faire de l'envoi et de la réception en simultané, le HackRF One n'étant pas full-duplex. Il m'a donc fallu trouver un plan B.

Quand il s'agit de recevoir et de transmettre des paquets ZigBee, le framework Killerbee sauve pas mal la vie. Ce framework écrit en Python s'interface avec des équipements adaptés, et est en mesure de sniffer et injecter des paquets ZigBee. Enfin, quand on l'utilise avec des équipements qui le permettent. En effet, le seul device abordable qui était compatible avec ce framework est le RZ Raven d'ATMEL, dont la production a été arrêtée et qui est actuellement introuvable. Les équipements restants sont plus coûteux, comme l'ApiMote d'Attify (150$), le TelosB Mote, ou encore des cartes Silicon Labs compatibles (~300€). Par ailleurs, il existe bien un second équipement pas cher, une clé USB à base de TI CC2531, mais cette dernière ne supporte que le sniffing, ce qui ne me suffisait pas.

Une clé TI CC2531

J'ai donc commandé une de ces clés USB à base de TI CC2531, et j'ai réussi à capturer des paquets ZigBee et à débuter l'analyse du protocole de communication du badge. Cependant, impossible d'envoyer de manière fiable des paquets, et donc d'interagir avec ce dernier. Je commençais sérieusement à douter du framework, et songeais à trouver une solution alternative. Il était clair à ce moment que personne n'avait implémenté le support de l'injection de paquet pour cette clé USB, malgré plusieurs demandes faites via des issues sur leur repository Github. La réponse apportée ? "Do it yourself", si je résume le propos. Eh bien faisons ça alors.

Création d'un firmware pour le TI CC2531

Ayant déjà développé sur des puces gérant des communications radio dans le cadre de mes recherches sur le protocole Bluetooth Low Energy, développer un firmware spécifique pour la puce TI CC2531 ne me faisait pas tellement peur. Par contre, si je pouvais éviter d'y passer trois semaines, ça m'arrangerait passablement. J'ai donc commencé à scruter le web à la recherche de kits de développement permettant de développer pour cette puce, avec potentiellement le support de la couche radio déjà disponible. Je suis assez rapidement tombé sur le code de Contiki, un micro-système d'exploitation qui supporte notamment la puce en question. Et pour lequel la couche radio est déjà implémentée, yippie !

Je me suis donc lancé dans le développement de ce firmware, en ajoutant une couche de communication par port série (exposé via la connectique USB) afin de piloter la puce à partir d'un ordinateur qui communique avec le code gérant la radio. La structure de Contiki, qui propose un semblant de processus, permet d'implémenter cela de manière très simple. Le premier test a pu être rapidement effectué, et s'est montré très concluant: j'arrivais à sniffer et transmettre des paquets ZigBee, autrement dit j'avais une bonne base de travail. J'ai bouclé le développement du firmware en moins d'une semaine, et mis le code à disposition (ainsi qu'une release pré-compilée) sur mon repository Github associé.

Ajout d'un driver à Killerbee

Développer un firmware c'est bien, mais faire en sorte que Killerbee puisse communiquer avec est encore mieux. En parallèle, j'ai donc implémenté un driver spécifique dans le framework Killerbee, capable de communiquer avec le firmware en question et qui supporte ainsi le sniffing et l'injection de paquets. Ce développement a été effectué sur la branche py3 du projet, qui n'est pas encore la version 3.0 officielle de Killerbee mais qui devrait l'être une fois que le portage sur Python 3.0 sera terminé, grâce à la réactivité de RiverLoopSec qui a poussé des modifications en attente quand je les ai sollicité sur Twitter (encore merci à eux !).

Ce driver est ainsi capable de sniffer des paquets ZigBee, avec pour seule limitation que ces paquets doivent avoir un FCS (une somme de contrôle) valide (il est possible d'ajouter le support des paquets invalides, mais je ne l'ai pas encore fait). Il est par ailleurs capable d'envoyer des paquets, là encore sans possibilité de contrôler le FCS. Mais c'est bien suffisant pour ce que j'ai à faire sur ce matériel. Il a d'ailleurs fallu trouver un petit nom à ce firmware, et celui proposé par tartofraise lors d'un live Twitch a été retenu: Bumblebee.

Le code du driver est intégré dans mon fork de Killerbee, disponible en suivant ce lien.

Comment installer et utiliser Bumblebee ?

Le code source et une version pré-compilée du firmware ont été rendus publics sur mon dépôt Github associé, qui détaille par ailleurs plusieurs méthodes permettant d'installer ce dernier sur une clé TI CC2531. Basiquement, il vous faudra un programmateur CC-Debugger, ou un Raspberry Pi voire un Arduino. Une fois le firmware installé sur la clé, cette dernière est prête à l'emploi.

Sur l'ordinateur, installer killerbee à l'aide de l'outillage Python:

$ git clone --branch py3 https://github.com/virtualabs/killerbee.git
$ cd killerbee
$ python3 setup.py sdist
$ sudo pip3 install dist/killerbee-2.7.1.tgz

Killerbee est installé et prêt à l'emploi, y compris le support de Bumblebee. Vous pouvez désormais utiliser tous les outils classiques de Killerbee avec cette clé USB !

Si vous trouvez des bugs, ou souhaitez des améliorations, n'hésitez pas à soumettre des issues ou des feature requests, et pourquoi pas des pull requests !

22
sept.
'16

Super Minitel: suite et fin

Publié le 22 septembre 2016

J'en parlais récemment, j'ai profité de mon temps libre de ces dernières semaines pour apporter la touche finale à mon Super Minitel. Le résultat est plutôt probant, bien qu'il y ait des améliorations à apporter, à mon humble avis.

Ajout d'un support pour Raspberry Pi

J'ai ressorti mon bon vieux OpenScad afin de concevoir un support pour tenir le Raspberry Pi et sa carte d'adaptation vidéo/clavier dans le Minitel. J'ai opté pour une fixation par collage sur le Minitel, avec un espace pour laisser passer le connecteur de clavier. Le Raspberry Pi est fixé avec un vis, tandis qu'un ergot vient se loger dans le second emplacement de vis et empêcher tout mouvement.

Je l'ai ensuite imprimé sur ma Prusa i3, puis testé à blanc avec le Raspberry Pi. J'ai enfin monté le tout dans le Minitel, en prenant soin de maintenir l'ensemble avec des pinces serrantes. C'est franchement pratique ces pinces, j'ai découvert leur utilité grâce à Babozor et ses conseils de la Grotte du Barbu !

Après une nuit de séchage, j'ai pu fixer le Raspberry Pi dessus et tester le bon fonctionnement du clavier rétractable (qui passe du coup en dessous du Rasp).

Intégration du son

Après avoir commandé tout un lot de composants pour ajouter un ampli audio dans le minitel et les avoir soudé, j'ai pu tester le rendu. C'est pas trop mal, mais il y a un shhh de fond qui est plutôt gênant, ça doit être du au fait que mon ampli n'intègre pas de filtre ... Ceci dit en ajustant correctement le volume, on ne l'entend quasimment plus.

Pour la fixation, même recette que précédemment: j'ai conçu un support adapté au PCB (avec une seule vis pour la fixation, j'ai été radin), je l'ai imprimé et collé dans le Minitel.

Le rendu son n'est pas merveilleux, mais ça donne un bon vieux son old school, j'aime bien :). Pour terminer, j'ai conçu et imprimé un guide de perçage afin de faire des petits trous sur le côté du Minitel à l'endroit où se trouve le haut-parleur afin de laisser le son se diffuser.

Je l'ai imprimé, et je m'en suis servi de guide pour percer les trous sur le Minitel. Le rendu est très propre, et n'a nécessité aucun tracé particulier, juste la fixation du guide avec une pince auto-serrante.

Déco finale

S'il y a bien un domaine dans lequel je suis une quiche, c'est la déco. Je suis une bille en peinture, pochoirs, dessin, etc. Mais je ne voyais qu'une seule manière de décorer ce super Minitel: repeindre la carcasse en blanc cassé, et peindre un sigle «Super Minitel» au pochoir.

J'ai donc commencé par concevoir un pochoir sur Inkscape. En reprenant des polices de Nintendo et en bidouillant un peu, j'ai réussi à imprimer un motif noir sur blanc sur du papier photo. Après un petit tour chez Cultura pour acheter de la peinture en bombe et à pochoir, quelques babioles et de la colle repositionnable en spray, j'ai entamé à la main la découpe des caractères. Un bon gros fail. Peu de précision malgré l'utilisation d'un cutter très fin, et l'encre bavait sur mes mains. Il fallait trouver autre chose.

Je me suis rabattu sur l'impression 3D: en effet, quoi de mieux que d'imprimer un pochoir en 3D et de s'en servir pour peindre le motif ! C'était sans compter deux éléments importants pour des pochoirs. Le premier, c'est que lorsque l'on crée des pochoirs, on ne peut pas raisonnablement réaliser de belles lettres possédant des vides, comme les lettres P ou R. On est obligé de laisser une liaison pour que la partie masquant l'intérieur "tienne". Le rendu en est forcément moins bon. Second point, il doit être assez fin pour masquer et tenir correctement sur le support. Avec l'imprimante 3D, imprimer fin c'est imprimer pour rien. Lorsque l'on décolle le motif imprimé, il se plie et généralement cette déformation reste. C'est du plastique (PLA dans mon cas), donc assez difficile à reformer, et la colle repositionnable n'y a rien fait. Il ne me restait qu'à tester mon pochoir épais (1mm) afin de voir si le rendu serait correct.

Ma dernière erreur avec les pochoirs a été de penser que la colle repositionnable c'était LA solution. En réalité, elle a créé des petits points de colle sous le pochoir, et l'encre s'est enfournée sous le pochoir à cause de l'irrégularité de celui-ci et de l'espace vacant laissé par la colle en spray. Merci les tutos Youtube, mais cette fois-ci ça ne m'a pas aidé. heureusement que j'avais fait des tests sur carton et papier avant de me lancer sur le Minitel...

J'étais pas loin d'abandonner quand j'ai eu une idée toute simple: pourquoi ne pas imprimer les lettres avec l'imprimante 3D et les coller de façon jolie sur la carcasse du Minitel ? De cette façon, on obtient un effet de relief et un beau contraste blanc cassé/noir qui est du plus bel effet (enfin je crois). J'ai donc modélisé les lettres en convertissant le modèle SVG en SCAD (merci paths2openscad !) et les ai imprimé à l'envers pour que le côté lisse corresponde à la partie visible (de face) et donne un rendu moins "imprimante 3D". Le résultat est très probant je trouve.

j'ai ensuite placé les lettres, les ai collé et ai attendu que cela sèche. J'ai fait l'erreur de marquer l'alignement au crayon papier, et cela se voit encore un peu de très près, c'est dommage. Je prendrais une équerre pour le prochain exemplaire et ne tracerai aucun trait, cela sera plus propre.

Résultat final

Au final, j'ai un Super Minitel qui ressemble exactement à ce que je voulais, qui accepte jusqu'à deux manettes Super NES en USB (pratique pour Street Fighter, mais on peut aussi jouer grâce au clavier), et qui attire la curiosité avec son aspect "presque" Super Nintendo.

Je vais le beta-tester à la maison afin de déceler de potentiels défauts de conception avant de le donner à un généreux soutien du projet OpenIt, et d'en faire deux autres pour les deux autres soutiens ayant choisi cette récompense.

Il me reste encore quelques Minitels un brin différents à la maison, certainement l'occasion de me faire la main sur la soudure CMS à air chaud ;). Il me faut absolument un exemplaire à la maison, et les minis-moi auront obligation d'y jouer (vous en conviendrez: Super Mario World, Street Fighter II, Bomberman 3 et Worms sont des jeux formidables o/).

Ah et si vous voulez tenter de reproduire ce hack, j'ai mis des ressources à disposition (majoritairement les PCBs, les fichiers de conception 3D ainsi que le software permettant d'interfacer le clavier). Il manque encore des éléments (comme la liste des composants pour les PCBs, mais ça viendra -- il y aura peut-être des modifications suite au beta-test).

29
août
'16

Super Minitel Entertainement System: bientôt un premier exemplaire !

Publié le 29 août 2016

Cela fait bientôt 3 ans que ce projet de Super Minitel Entertainement System traîne (enfin, surtout la prise en charge du clavier), et que je dois fournir 3 exemplaires aux soutiens du projet OpenIt. La conception a été laborieuse, mais est sur le point d'aboutir au premier exemplaire.

Des erreurs à la chaîne

La conception de la version 3 du circuit électronique d'adaptation pour Raspberry Pi a pris plus de temps que prévu, et ce à cause d'erreurs successives lors de la phase de prototypage et de réalisation.

Le circuit de départ qui m'a servi à la rédaction de l'article sur le Super Minitel Entertainement System a permis de valider le montage réalisant la conversion du signal vidéo produit en sortie par le Raspberry PI (S-Video) vers les signaux attendus par la carte vidéo du Minitel. La conception de ce circuit m'a permis de reprendre en main les outils de conception électronique assisté par ordinateur, et a été réalisée avec EagleCAD. L'outil n'est pas libre mais gratuit, et le résultat rudimentaire: le circuit était imposant, mono-couche et coûteux. Le coût de fabrication d'un circuit imprimé dépend du nombre de couches et de sa surface (grosso-modo). Le délai entre la commande d'un circuit imprimé et la réception dudit circuit dans ma boîte aux lettres est d'environ trois semaines, au mieux. Gardez cela en tête pour la suite.

Premier circuit imprimé d'adaptation vidéo

Lorsque j'ai démarré la conception de la version suivante, j'ai décidé d'y intégrer le support du clavier du Minitel. J'ai choisi de supporter le clavier via un driver logiciel et un interfaçage I2C, ce qui évite d'avoir un micro-contrôleur et la phase de programmation qui va avec. J'ai donc intégré le tout sur le circuit intégré, grâce à des composants permettant d'étendre le nombre de GPIOs du Raspberry Pi, et ait fait en sorte que le circuit puisse se brancher sur le port d'extension du Raspberry en respectant les dimensions. Autrement dit, j'ai du tout serrer pour que cela rentre dans l'espace requis. Et j'ai envoyé en fabrication. La conception n'a pas été réalisée avec EagleCAD mais avec gEDA, une suite de conception électronique libre et opensource.

A la réception du premier circuit, je soude l'ensemble des composants sur celui-ci (il faut compter une bonne heure de concentration afin de limiter les erreurs), et le teste en conditions réelles sur le Minitel. Echec lamentable, le rendu est désastreux. Il s'avère que les empreintes des transistors utilisées pour concevoir le circuit imprimé n'étaient pas correctes (merci gEDA), et ceux-ci étaient montés à l'envers ! De plus, plusieurs pistes n'étaient pas correctement placées (on parle alors d'erreur de routage), et il m'a fallu en couper certaines et en ajouter d'autres à l'aide de fils ("straps"). Enfin, les trous pour placer le connecteur du clavier du Minitel étaient trop petits. Bref, deux ou trois jours de débogage de circuit et de nuits passées à identifier la cause de problèmes, pour enfin arriver à une version fonctionnelle. Victoire !

Version corrigée du circuit imprimé pour Raspberry Pi

Je reporte ensuite les corrections sur le logiciel de conception, et envoi en fabrication une version normalement corrigée. Sauf que non, les trous du connecteur de clavier sont encore trop petits (mauvaise mesure), et quelques corrections n'ont pas été transposées correctement. Je corrige le tout sur le logiciel, et repasse commande. Je reçois la dernière version des circuits et en suis fier: le connecteur de clavier entre parfaitement en place, et tout se soude sans encombre.

Circuit imprimé final tout juste reçu

Saleté de condensateur

Cependant, malgré tous mes efforts, le rendu est encore moyen. En particulier, des "bavures" apparaissent en fin de ligne ou de caractères affichés, ce qui n'est pas trop dérangeant lorsque l'on joue mais agaçant lors de lecture de texte. Il me fallait trouver l'origine du problème.

Encore une fois, une erreur était à la source de ce problème: le marquage de polarité du condensateur indiqué sur le circuit était inversé (encore une fois à cause d'une mauvaise empreinte), et en changeant de sens le condensateur l'image finale est bien plus belle. Je ne m'en étais pas rendu compte sur le prototype intermédiaire car le condensateur que j'utilisais était prévu pour 100 Volts, et ne bronchait pas trop lorsqu'il était alimenté en inverse. Mes derniers tests ayant été réalisés avec un condensateur prévu pour 50 Volts, le comportement de celui-ci en était sévèrement altéré. Merci les composants en stock.

L'erreur de marquage est toujours présente sur le circuit imprimé, mais est bien moins grave qu'une erreur de piste ou de placement de composant. J'ai tout de même eu de la chance que le condensateur n'explose pas, les dommages pouvant être importants dans ce cas de figure.

Le montage final en place sur le Raspberry Pi

Ce qu'il me reste à faire

Le circuit d'adaptation final fonctionne à merveille, tout comme le support du clavier via un pilote écrit en Python. Je dois encore ajouter l'audio (j'ai conçu et fait fabriquer un petit circuit complémentaire d'amplification audio, histoire d'avoir du son) et concevoir via de l'impression 3D un support pour fixer le Raspberry Pi, le circuit audio annexe ainsi qu'un haut-parleur. L'ajout d'un ventilateur pourrait être un plus si l'ensemble chauffe trop, à voir à l'usage.

Prototype fonctionnel sans son (à venir)

Viendra ensuite la décoration, à l'aide de bombes de peinture et de pochoirs faits maison. Je ne suis pas un pro en ce qui concerne cette partie, mais je compte trouver de bons conseils auprès de personnes ayant l'habitude de ce genre de choses.

L'amplification audio devrait être terminée en fin de semaine, il faut juste que je commande les composants et que je prenne le temps de les souder. Je pourrais bientôt fournir les exemplaires (trois pour être précis) à leurs destinataires, et publier les fichiers de conception bien sûr.



Les contenus disponibles sur ce blog sont publiés sous licence Creative Commons BY-NC-SA.
Vous pouvez réutiliser tout ou partie de ces contenus à condition de citer l'auteur et l'origine, vous ne pouvez en faire une utilisation commerciale, et enfin vous devez partager tout travail ou œuvre dérivée sous les mêmes conditions — c'est-à-dire avec la même licence d'utilisation Creative Commons.