🚌I²C
I squared C
Dernière mise à jour
I squared C
Dernière mise à jour
I2C est un bus série synchrone bidirectionnel half-duplex, où plusieurs équipements, maîtres ou esclaves, peuvent être connectés au bus. Les échanges ont toujours lieu entre un seul maître et un (ou tous les) esclave(s), toujours à l'initiative du maître (jamais de maître à maître ou d'esclave à esclave).
Dans le domaine de l'IoT on retrouve principalement l'I²C dans des appareils type claviers, boutons et capteurs en tout genre. L'I²C est un protocole interessant pour un pirate car il ne communique que par un unique bus facilitant de ce fait le travail à un attaquant pour sniffer ou injecter des données via celui-ci.
I²C n'utilise que deux lignes pour communiquer (sans compter la terre):
SDA (Seial Data Line): Pour transmettre des données.
SCL (Serial Clock Line): Pour déterminer quand les données sont lues.
le protocole I²C prend en charge plusieurs contrôleurs dans le même bus. Ce qui veut dire que en se connectant au bus, on peut agir comme un autre contrôleur, puis lire et envoyer des données au périphériques.
Pour attaquer un bus I²C, on va utiliser un Bus Pirate et ses pins "COPI" correspondant au SDA pour I²C et "CLK" correspondant au SCL pour I²C (ainsi que le pin GND correspondant à la terre pour les deux). Une fois cela fait, on va pouvoir s'y connecter en passant par la vitesse par défaut de 115 200 bauds avec l'utilitaire screen ou minicom ce cette manière par exemple.
$ screen /dev/ttyUSBX 115200
Pour énumérer les appareils connectés au bus, on utilise alors la librairie I²C du Bus Pirate.
Pour cela il faut simplement entrer l'instruction "m" et entrer le numéro correspondant au protocole I²C.
On va ensuite utiliser la macro "adress search" avec la commande "(1)" pour énumérer les appareils connectés au bus.
Cette macro affiche les adresses, suivies de l'adresse 7 bits avec un bit indiquant si l'adresse est en lecture ou en écriture ((R) ou (W)).
Pour sniffer les données transitant par le bus, on va utiliser la seconde macro du Bus Pirate "(2)".
I²C | Bus Pirate |
---|---|
START | [ ou { |
STOP | ] ou } |
ACK | + |
NACK | - |
Afin d'injecter des données maintenant, il suffit simplement de noter la commande souhaité avec la synthaxe du Bus Pirate.
Exemple: