🚌I²C

I squared C

Description

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.

Composition d'un message

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.

Attaque

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

Détecter les systèmes connectés au bus

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.

>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
9. DIO
x. exit(without change)

On va ensuite utiliser la macro "adress search" avec la commande "(1)" pour énumérer les appareils connectés au bus.

I2C>(1)
Searching I2C address space. Found devices at:
0x00(0x00 W) 0xFF(0x7F R)

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

Sniffing et injection de données

Pour sniffer les données transitant par le bus, on va utiliser la seconde macro du Bus Pirate "(2)".

I2C>(2)
Sniffer
Any key to exit
[0x12][0x12+0x63+]][0x12+0x63+0xFF+0xC4+][0x12+0x63+]][0x12+0x63+]]
[0x12+0x63+]][0x12+0x63+]][0x12+0x63+0xFF+0xC4+][0x12+0x63+0xFF+0xC4+]
[0x12+0xC6-0xFD-][0x12+0x63+0xFF+]]

Conversion synthaxe

I²CBus 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:

I2C>[0x12+0x63+0xFF+0xC4+]
I2C START BIT
WRITE: 0x12 NACK
WRITE: 0x63 NACK
WRITE: 0xFF NACK
WRITE: 0xC4 NACK
I2C STOP BIT

Dernière mise à jour