Présentation effectuée à la DevCon 12 (16 décembre 2021) par Christophe Villeneuve sur "Pentest Bus Pirate".
Une occasion de voir comment effectuer des pentests sur de l'IoT
5. @hellosct1
Qu’est ce ? Le bus pirate
●
Multi-outil
– open source
– Open Hardware
●
But
– Tester qui parle aux appareils électroniques.
●
Nombreuses fonctionnalités
– Vérifier la sécurité d’un nouveau produit
●
Interface de terminal simple
– Disponible sur Linux et Windows
6. @hellosct1
Le bus pirate
●
Outil
– Proposé par Dangerous prototypes
– Développé par Ian Lesnet.
●
Permet le dialogue entre un PC et une cible
1-wire, 2-wire, 3-wire, UART, I2C, SPI, et HD44780
●
Permet de fournir des alimentations 5V ou 3.3V
●
Lire des tensions (0-6V)
●
Générer un PWM
●
Mesurer des fréquences jusqu’à 40MHz
●
Activer des résistances de pull-up…
Un compagnon idéal
de l’ingénieur en
phase de
prototypage ou du
hacker.
7. @hellosct1
La carte peut faire
●
Protocoles de base avec le firmware officiel :
– 1-Wire
– I2C
– SPI
– Asynchronous serial
– MIDI
– HD44780 LCD
– 2 et 3-wire
– mode "raw binary" sur les modes
●
bitbang, 1-Wire, I2C, SPI, et UART
8. @hellosct1
Idée
●
Besoin de dialoguer
– Avec un nouveau composant
– De sniffer un réseau I2C
●
Interface USB-série
– Permet d’envoyer des commandes depuis un PC
●
via un simple terminal (type PuTTY ou terminal)
– Les commandes reçues seront analysées syntaxiquement
(parsing) par le logiciel du bus pirate
●
Et traduites en instructions machines (opcodes)
●
Afin de programmer les périphériques concernés
– timers, I/O, ADC, …
●
Transparents pour l’utilisateur
9. @hellosct1
Prise en main
●
Pour pouvoir
commencer
A utiliser le bus pirate
●
Il faut le relier
– Port USB
●
à l’aide d’un câble
mini USB type B mâle
/ USB type A mâle.
●
Sur Windows :
– Télécharger un driver
FTDI et un émulateur
de terminal.
– Prise en main du bus
pirate sur Windows.
●
Sur Linux :
– pas besoin
●
De driver FTDI
●
Emulateur de terminal
10. @hellosct1
En pratique
●
Voir le tampon des messages du noyau.
$ dmesg | tail
[243117.786653] usb 1-3: Product: FT232R USB UART
[243117.786658] usb 1-3: Manufacturer: FTDI
[243117.786662] usb 1-3: SerialNumber: A906H8YA
[243117.898706] usbcore: registered new interface driver usbserial_generic
[243117.898717] usbserial: USB Serial support registered for generic
[243117.909313] usbcore: registered new interface driver ftdi_sio
[243117.909327] usbserial: USB Serial support registered for FTDI USB Serial Device
[243117.909376] ftdi_sio 1-3:1.0: FTDI USB Serial Device converter detected
[243117.909411] usb 1-3: Detected FT232RL
[243117.909985] usb 1-3: FTDI USB Serial Device converter now attached to ttyUSB0
11. @hellosct1
Flashrom (1/2)
●
Utilitaire pour
– Identifier
– Lire
– Ecrire
– Vérifier
– Effacer les puces
flash.
●
Conçu pour flasher les
images BIOS
– EFI
– Coreboot
– Firmware
– optionROM
●
sur
– Les cartes mères,
– Les cartes de contrôleur
réseau/graphique/stockage
12. @hellosct1
Flashrom (2/2)
●
Prend en charge plus
– 476 puces flash,
– 291 chipsets
– 500 cartes mères,
– 79 périphériques PCI
– 17 périphériques USB
14. @hellosct1
Comment l’utilisé ?
●
Pour discuter avec un module
●
Faire une analyse de signaux
●
Faire du « Reverse engineering » sur une carte
inconnu
Ce qui faut savoir :
« bus pirate » est bootloadé
Possible
Mettre à jour
Changer de firmware, etc …
via le port usb
sans aucun autre matériel.
19. @hellosct1
Matériels
●
un lecteur de carte
RFID série de
parallax
●
un tag RFID
compatible avec le
lecteur ci dessus
➢
UART
➢
I2C
➢
SPI
➢
LCD
➢
Analogique (ADC)
20. @hellosct1
Session 2
●
Pour la partie I2C :
– un module RTC
(horloge)
de sparkfun
➢
I2C
➢
UART
➢
SPI
➢
LCD
➢
Analogique (ADC)
21. @hellosct1
Session 3
●
Pour la partie SPI :
●
Serial Peripheral Interface
●
Modèle 74HC595
●
Composé
– 8 leds
– 8 résistances de
330ohms
➢
SPI
➢
UART
➢
I2C
➢
LCD
➢
Analogique (ADC)
22. @hellosct1
Session 4
●
Pour la partie LCD
– un adaptateur lcd
●
« bus pirate »
de seeedstudio
– un écran lcd 2×16
➢
LCD
➢
UART
➢
I2C
➢
SPI
➢
Analogique (ADC)
23. @hellosct1
Session 5
●
Pour la partie analogique
– un potentiomètre
– un joystick
➢
Analogique (ADC)
➢
UART
➢
I2C
➢
SPI
➢
LCD
24. @hellosct1
Mode UART
●
Un lecteur RFID
●
Fonctionne en 2400 bauds
●
Câblage notre lecteur RFID
– lecteur RFID -> Bus pirate
– SOUT -> MISO
– ENABLE -> AUX
– VCC -> +5v
– GND -> GND
25. @hellosct1
Tester si le connecteur est ouvert ?
HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
9. DIO
x. exit(without change)
(1)>3
Set serial port speed: (bps)
1. 300
2. 1200
3. 2400
4. 4800
5. 9600
6. 19200
7. 38400
8. 57600
9. 115200
10. BRG raw value
(1)>3 (2400 bauds)
Data bits and parity:
1. 8, NONE *default
2. 8, EVEN
3. 8, ODD
4. 9, NONE
(1)>1
Stop bits:
1. 1 *default
2. 2
(1)>1
Receive polarity:
1. Idle 1 *default
2. Idle 0
(1)>1
Select output type:
1. Open drain
(H=Hi-Z, L=GND)
2. Normal (H=3.3V,
L=GND)
(1)>1
Ready
UART>
●
Connexion : Hiz
26. @hellosct1
Tester si le connecteur est ouvert ?
●
Résultat :
– La led « mode » est allumé
→ Câblage notre lecteur RFID… Succès
27. @hellosct1
Etape 2 : Allumer notre bus pirate
●
Commande « W »
●
La led « vreg » doit s’allumer
– Le circuit en cours de test est alimenté
Le lecteur RFID est allumé
La led est verte
mode sleep
28. @hellosct1
Etape 3
●
Pour utiliser le lecteur RFID
– Sleep → ON
●
Placer la broche AUX à l’état BAS.
Le lecteur RFID est
désormais prêt à être
utilisé
29. @hellosct1
Récupérer les octets du tag lecteur RFID
●
Test 1
r:10
→ Lire 10 octets
UART>r:10
READ: -f 0x00 FAILED, NO DATA0x00 FAILED, NO DATA0x00 FAILED, NO
DATA0x00 FAILED, NO DATA0x00 FAILED, NO DATA0x00 FAILED, NO DATA0x00
FAILED, NO DATA0x00 FAILED, NO DATA0x00 FAILED, NO DATA0x00
UART>
→ Probléme
Nous ne savons pas quand le lecteur RFID envoie quelque chose,
→ Obligation :
Placer le bus pirate en mode lecture continu pour avoir un affichage en continu des données reçu.
30. @hellosct1
Récupérer les octets du Tag lecteur RFID
●
Test N°2
(2)
UART>(2)
Raw UART input
Any key to exit
Le mode lecture continu est en marche
Les octets correspondant à l’identifiant du tag RFID
2600D6F1A8
32. @hellosct1
Mode Analogique (ADC)
●
Un Joystick
●
Alimenté en 0/5v le bus pirate
●
Câblage :
– joystick -> bus pirate
– GND -> GND
– VCC -> +5v
– VERT -> ADC
33. @hellosct1
Tester si le connecteur est ouvert ? (1/2)
HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
9. DIO
x. exit(without change)
(1)>9 (mode DIO)
Ready
DIO>
DIO>W
Power supplies ON
DIO>
●
Connexion : Dio
Pour allumer :
34. @hellosct1
Pour mesurer une tension (1/
●
Plusieurs options :
– d
●
pour faire une mesure seul
– v
●
pour afficher les tensions global de la carte bus pirate
en faisant une mesure
– D
●
pour passer en mode voltmètre.
35. @hellosct1
DIO>d
VOLTAGE
PROBE: 2.06V
DIO>v
Pinstates:
1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL) 7.
(PU) 8.(GR) 9.(WT) 0.(Blk)
GND 3.3V 5.0V ADC VPU AUX CLK MOSI CS
MISO
P P P I I I I I I I
GND 3.32V 5.02V 2.06V 0.00V H H H H H
DIO>D
VOLTMETER MODE
Any key to exit
VOLTAGE PROBE: 2.06V
37. @hellosct1
Mode I2C
●
module RTC (real time clock)
– Ex DS1307
●
On connaît le datasheet mais pas son adresse I2C
●
Câblage :
– DS1307 -> bus pirate
– GND -> GND
– 5V -> +5V
– SDA -> MOSI
– SCL -> CLK
38. @hellosct1
Trouver l’heure actuelle stocké dans le module RTC
HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
9. DIO
x. exit(without change)
(1)>4
Set speed:
1. ~5KHz
2. ~50KHz
3. ~100KHz
4. ~400KHz
(1)>3
Ready
I2C>W
Power supplies ON
I2C>(0)
0.Macro menu
1.7bit address search
2.I2C sniffer
I2C>
●
Connexion : Hiz
39. @hellosct1
Trouver l’heure actuelle stocké dans le module RTC
2C>W
Power supplies ON
I2C>P
Pull-up resistors ON
I2C>v
Pinstates:
1.(BR) 2.(RD) 3.(OR) 4.(YW) 5.(GN) 6.(BL)
7.(PU) 8.(GR) 9.(WT) 0.(Blk)
GND 3.3V 5.0V ADC VPU AUX SCL SDA - -
P P P I I I I I I I
GND 3.32V 5.02V 0.00V 5.03V L H H H H
I2C>
Mise sous tension « vpu »
I2C>(1)
Searching I2C address space.
Found devices at:
0xD0(0x68 W) 0xD1(0x68 R)
I2C>
module RTC
trouvé
41. @hellosct1
●
Pour demander l’heure, plusieurs étapes :
– Envoyé 0 à l’adresse 0xD0
– puis demander 8 octets à l’adresse 0xD1
●
C’est à dire
– [
– ]
– r:8
bit de start
bit de stop
demande de 8 octets
42. @hellosct1
Au niveau du code
I2C>[0xd0 0 [0xd1 r:8]
I2C START BIT
WRITE: 0xD0 ACK
WRITE: 0x00 ACK
I2C START BIT
WRITE: 0xD1 ACK
READ: 0x28 ACK 0x47 ACK 0x14 ACK
0x02 ACK 0x25 ACK 0x10 ACK 0x11 ACK 0x00
NACK
I2C STOP BIT
I2C>
envoyé un bit de start
pour dire aux périphériques du bus I2C
J’envoie ensuite à 0xD0 l’octet 0
puis sans fermé la communication
Je renvois un bit de start
pour demander à 0xD1
cette fois si 8 octets
une fois les huits octets recu
je coupe la communication
43. @hellosct1
Résultat
0x28 – 28 secondes
0x47 – 47 minutes
0x14 – 14 heures
0x02 – 2 (mardi)
0x25 – 25 (jours)
0x10 – 10 (octobre)
0x11 – 2020 (années)
E n français
Le mardi 25 octobre 2020
et il est 14 heures, 47 minutes, 28 secondes.
45. @hellosct1
Mode SPI
●
CI 74HC595 qui est un registre à décalage 8 bits
– Chaque sortie une led, soit un total de 8 led
– Valeur transmise sous la forme d’un octet via le bus SPI
●
Câblage :
– 74HC595 -> bus pirate
– DS -> MOSI
– ST_CP -> CS
– SH_CP -> TCK
– GND -> GND
– VCC -> +5v
– OE -> GND
– MR -> +5v
Chaque led est cablé ainsi : IO -> led -> résistance (330ohms) -> GND
46. @hellosct1
Tester si le connecteur est ouvert ? (1/2)
HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
9. DIO
x. exit(without change)
(1)>7
Set speed:
1. ~5KHz
2. ~50KHz
3. ~100KHz
4. ~400KHz
(1)>1
CS:
1. CS
2. /CS *default
(2)>2
Select output type:
1. Open drain
(H=Hi-Z, L=GND)
2. Normal (H=3.3V,
L=GND)
(1)>2
Ready
3WIRE>
●
Connexion : Hiz
47. @hellosct1
3WIRE>W
Power supplies ON
3WIRE>[
/CS ENABLED
3WIRE>0][
WRITE: 0x00
/CS DISABLED
/CS ENABLED
3WIRE>255][
WRITE: 0xFF
/CS DISABLED
/CS ENABLED
3WIRE>
Comment ça marche ?
* On allume l’alimentation avec « W »
A partir de là le 74HC595 est alimenté.
* On exécute la commande « [ »
pour mettre CS à LOW,
se qui active le 74HC595
qui attend alors un octet.
* On envoi nos données sous la forme d’un
octet.
* Puis on dit au 74HC595
de placer ses sorties
selon l’octet qu’on vient de lui envoyer
* Plaçant CS à HIGH puis à LOW
* On dit au 74HC595 que l’envoi est terminé
* Selon ce qu’on lui a demandé
puis avec le second « [ »
on lui dit d’attendre le prochain octet
48. @hellosct1
Mode LCD
●
Un écran LCD
●
brancher le câble sur l’adaptateur LCD
– l’autre bout au bus pirate
●
Câblage
– N/A
49. @hellosct1
Tester si le connecteur est ouvert ? (1/2)
HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
9. DIO
x. exit(without change)
(1)>8
This mode requires an
adapter
Ready
LCD>W
Power supplies ON
●
Connexion : Hiz
50. @hellosct1
LCD>(0)
0.Macro menu
1.LCD Reset
2.Init LCD
3.Clear LCD
4.Cursor position ex:(4) 0
6.Write test numbers ex:(6) 80
7.Write test characters ex:(7) 80
LCD>(1)
RESET
LCD>(2)
RESET
Display lines:
1. 1
2. Multiple
(2)>2
INIT
LCD>(3)
CLEAR
LCD>"Hello World !"
WRITE: "Hello World !"
LCD>
52. @hellosct1
Alternatif
Ds projets de firmware alternatif on vu le jour,
●
programmateur de fpga,
●
d’avr,
●
analyseur logique
●
mini oscilloscope
●
module jtag