Introduction à l’exploitation Hardware (2/3) Port série de debug et communication UART

Kevin Boulom Etude - Recherche, Sécurité IoT

Interfaces de debug

En inspectant un peu plus la carte, on peut apercevoir des connecteurs.

A:\CERT\articles\IoT\HackingHardware\pics\UART.jpg

Ce type de port est appelé port de debug, et plus précisément UART (Universal Asynchronous Receiver Transmitter) dans notre cas. Il en existe également un autre très utilisé le JTAG (Joint Test Action Group), mais lui n’est pas vraiment normé et son exploitation demande beaucoup plus de recherche pour savoir les fonctions de chaque pins.

Pour simplifier un peu, ces ports sont utilisés en usine pour vérifier le bon fonctionnement de la carte électronique. L’UART permet de communiquer avec le système d’exploitation. Le JTAG est lui bien plus puissant et permet de communiquer directement avec le SoC. Seulement, comme je le mentionnais plus haut, le JTAG n’est pas vraiment normé et demande beaucoup plus de temps afin de savoir quelle est la fonction de chaque pin. Heureusement, il y a des cartes faites pour ce genre de travaux et notamment le JTAGulator.

En attendant, nous jouerons avec l’UART de ce routeur wifi.

UART

L’UART est une liaison série permettant l’envoi et la réception de données. Elle a une architecture assez simple, qui se résume à une alimentation (VCC et GND), une pin d’émission (TX) et une pin de réception (RX).

Quand deux appareils tentent de communiquer, on pourrait faire l’analogie humaine de la bouche (TX) et de l’oreille (RX)

L’émetteur parle et la communication va vers l’oreille de son interlocuteur (TX => RX) et l’opération est inversée pour que le récepteur réponde à l’émetteur (TX => RX). Il faudra donc croiser les connexions.

A:\CERT\articles\IoT\HackingHardware\pics\bouche a oreil.jpg

Dans notre cas, les quatre pins de la liaison série UART sont bien rangés les unes à côté des autres. Pour déterminer quel pin correspond à VCC, GND, TX et RX, plusieurs solutions sont possibles, nous en verrons deux ici.

 

 

La première, le multimètre :

Une notion fondamentale en électronique est que sur une carte, toutes les masses (GND) sont interconnectées. Donc si nous pouvons trouver une masse quelque par sur le circuit, nous pourrons faire un test de continuité avec notre multimètre. Celui-ci consiste généralement à mettre le multimètre en mode test de continuité (qui est en faite un ohmmètre) et de tester chaque point de notre liaison série.

Pour trouver une masse sur la carte ce n’est pas très compliqué. Nous avions précédemment pu déterminer les fonctions et références des puces de notre carte. Chaque puce est connectée à la masse. Grâce à la documentation de ces puces, que nous pouvons trouver sur internet, il est facile de déterminer quelle patte est celle de la masse pour ainsi avoir un point de repère. Pour ce genre d’exercice, il sera préférable de prendre un composant avec des pattes assez grosses, donc ici, nous ne prendront ni le WISoC, ni la DRAM. Nous allons plutôt nous intéresser à la puce de mémoire flash GigaDevice GD25G32C.

D’après la documentation :

On peut voir en haut à gauche du schéma un petit rond. C’est un détrompeur qui se retrouve également sur la puce.

D’après la documentation, VSS en patte 4 est notre GND. Il ne nous reste plus qu’à tester chaque patte avec un Ohmmètre afin de déterminer à quoi celle-ci est reliée. Pour faire ce test de continuité, il est inutile d’alimenter le routeur.

Maintenant que notre masse GND est identifiée, nous pouvons déterminer le rôle des autres pins, VSS, TX, RX.

Avec le multimètre il suffira de mesurer la différence de potentiel entre le GND et le reste des pins. Ces tests se feront donc avec le routeur sous tension. Nous travaillons ici avec des tensions faibles. Cependant soyez toujours attentifs, car même si la carte fonctionne avec des tensions faibles, le routeur est tout de même connecté sur du 220V ! Prudence donc !

Pour reconnaître la fonction de chaque pin, il faut savoir que :

  • VCC devrait avoir une valeur stable à 3,3V,
  • TX devrait avoir une valeur instable, car de l’information transite sur cette pin
  • RX devrait être à 0.

Le multimètre devra être en position DC (Direct current, mode tension continue). Il ne nous reste plus qu’a faire les mesures de différence de potentiel entre une pin et le GND.

 

 

La deuxième méthode, l’analyseur logique :

Comme précédemment, il faudra déterminer quel pin correspond à la pin GND et la relier correctement à l’analyseur logique.

A:\CERT\articles\IoT\HackingHardware\pics\IMG_20171006_111737906.jpg

Il ne nous reste plus qu’à relier les 3 autres pins aux channels de l’analyseur.

A:\CERT\articles\IoT\HackingHardware\pics\UART_SALEAE.png

Les résultats sont :

Les conclusions sont :

  • Le channel 1 est toujours à 1
  • Le channel 2 est toujours à 0
  • De l’information nous est transmise via le channel 3

 

 

Une fois le travail terminé, nous pouvons faire ce schéma.

A:\CERT\articles\IoT\HackingHardware\pics\UART_pins.png

Cependant, nous pouvons constater que la patte RX est coupée. C’est une manière de « sécuriser » l’accès à l’UART en empêchant toute transmission d’informations (Utilisateur => carte).

A:\CERT\articles\IoT\HackingHardware\pics\UART_pateCoupée.jpg

Cette sécurité se contourne assez facilement en soudant ces deux points afin qu’ils fassent contact. Cette opération, due à la précision qu’elle demande n’est cependant pas une tâche aisée. Une autre solution serait donc de souder un fil directement entre la pin et la résistance. Ce qui nous laisse plus de place, et on en profitera pour souder un cavalier, afin de pouvoir brancher des câbles directement sur celui-ci.

A:\CERT\articles\IoT\HackingHardware\pics\171005-151225.jpg

Connexion à la console

Afin de nous connecter à la carte électronique via l’UART, il nous faudra une interface. C’est ici que nous sortirons notre buspirate. (Ces opérations doivent se faire avec l’alimentation coupée !)

Pour ce faire, il faudra dans un premier temps connecter les masses (GND) des deux cartes. Ensuite, il faudra relier le TX de la carte à l’entrée RX (MISO, Master-in slave-out) du buspirate, ainsi que le RX de la carte au TX (MOSI, Master-out slave-in) du buspirate.

Carte
Buspirate
GND GND
TX MISO
RX MOSI

A:\CERT\articles\IoT\HackingHardware\pics\IMG_20171009_114559154.jpg

Si vous utilisez Windows, il faudra au préalable installer un driver pour pouvoir utiliser le buspirate. Je vous laisse suivre la doc du site buspirate si vous ne l’avez pas déjà fait : http://dangerousprototypes.com/blog/2009/07/23/bus-pirate-101/

Une fois le bus pirate câblé avec la carte et branché en USB, nous nous servirons de tera term, comme conseillé sur le site dangerous prototypes, en sélectionnant le bon port série. Chose également importante, il faudra configurer l’outil Setup -> Serial Port -> BaudRate 115200.

Une fois fait, si vous n’avez toujours rien sur le terminal, faites simplement [ENTER].

Il faudra configurer le buspirate afin de le mettre en mode UART. Dans notre cas, la configuration sera :

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

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

Ready
UART>

 

Il faudra ensuite configurer le buspirate pour se mettre en mode « Transparent bridge » (vous pouvez lister tous les modes avec la commande « (0) »). Répondez « y » à la question. Une fois fait, vous pouvez mettre le routeur sous tension.

D’après les informations qui nous sont affichées durant la séquence de boot, il s’agit bien d’un linux version 2.6.31, avec 32Mo de Ram et une mémoire flash de 4Mo.

Une fois la séquence de boot terminée, il nous est présenté un prompt afin de saisir un login / mot de passe. Après quelques essais de routine (admin/admin, admin/password, root/toor, …) rien ne fonctionne. Nous allons donc devoir trouver un moyen pour connaître le mot de passe.

Dans la prochaine partie, nous dumperons la mémoire flash afin de chercher le mot de passe root.