1) Refourguez le projet impossible à un alternant
Lors d’une magnifique journée de R&D, je travaillais à mon habitude sur l’analyse et la recherche de vulnérabilités dans des produits IKEA (mais chut, c’est secret).
Alors que l’excitation arrivait à son paroxysme, j’entendis au loin la douce voix de PIX me criant “Rémi, j’ai un truc pour toi”. C’est tout naturellement que j’ai tenté de fuir sentant le projet douteux arriver. Malheureusement je n’ai pas trouvé d’endroit où me cacher.
Avec la grâce d’un cygne, celui-ci arrive à mon bureau et m’expose le problème.
PIX ⇒ “Un auditeur a laissé son ancien ordinateur avec le mot de passe BIOS et nous ne pouvons pas le déverrouiller.”
Rémi ⇒ “Mais c’est un boulot pour notre admin-sys préféré Damien”
PIX ⇒ “Malheureusement il a déjà essayé les techniques communes mais il n’a pas réussi à le déverrouiller”
Rémi ⇒ “Mais …”
PIX lâche l’ordinateur et part en courant.
2) Commencez les investigations
Comme je ne doute absolument pas des compétences de mes camarades, j’ai décidé de réessayer les techniques de base afin de bypass le mot de passe du BIOS.
A) Documentez-vous
Ce magnifique ordinateur est un HP OMEN 15-ax225nf. C’est tout naturellement que nous nous dirigeons vers le site officiel du constructeur afin de trouver :
- Un manuel utilisateur relativement vide.
- Une page nous indiquant qu’aucun pilote n’est disponible.
- Un tutoriel de mise à jour du BIOS assez windowsien.
En même temps, pourquoi espérer trouver un schéma de carte mère sur le site officiel du vendeur ou encore un tutoriel expliquant comment supprimer le mot de passe BIOS.
En surfant sur le net, je tombe sur un magnifique site proposant de supprimer le mot de passe en échange d’argent.
Je n’ai aucun doute concernant l’honnêteté de ce vendeur espagnol, mais la facture risque d’être compliquée à faire passer dans les frais d’entreprise.
Malheureusement l’internet est relativement pauvre en documentation concernant notre ordinateur. Il va donc falloir travailler méthodiquement en suivant la méthode appelée dans le milieu “le feeling”.
B) Retirez la PILE CMOS
Première piste, la pile CMOS.
Les ordinateurs modernes contiennent une petite mémoire CMOS (Complementary Metal-Oxide-Semiconductor). Cette mémoire nécessite une faible quantité d’électricité afin de maintenir les données. Cette alimentation est notamment assurée par la pile CMOS.
La logique est donc la suivante : si nous retirons la pile CMOS et coupons l’alimentation, toutes les données de configuration et tous les mots de passe seront réinitialisés.
Nous nous attaquons donc au démontage de l’ordinateur afin de retirer cette fameuse pile.
Au passage, on fait attention à ne pas percer la batterie qui est sur le point d’exploser.
Après moult péripéties et une batterie en moins, nous pouvons enfin retirer la pile et aller boire un café.
Nous attendons une bonne heure et voici venu le temps de rallumer l’ordinateur.
Bien sûr l’ordinateur ne stocke pas le mot de passe BIOS dans le mémoire de la CMOS.
C) Utilisez des mots de passe constructeurs
La seconde méthode qui me vient directement à l’esprit est l’utilisation des mots de passe constructeurs.
En effet, les constructeurs implantent dans les UEFIs des mots de passe générique afin de pouvoir les débloquer. Certains de ces mots de passe sont en libre accès sur internet. Un site bien connu est: https://bios-pw.org/.
Le site demande le code constructeur obtenu après 3 tentatives infructueuses et nous donne les mots de passe afin de pouvoir débloquer notre BIOS. Enfin en théorie…
Après 3 tentatives infructueuses, nous obtenons bien notre code. Nous le renseignons dans le site.
Nous avons deux codes possibles et après les avoir essayés …
Je comprends maintenant que mes collègues ne sont pas si incompétents que cela.
3) Sortez l’artillerie lourde
Relativement frustré, j’ai donc décidé de m’attaquer directement au matériel. Pour ce faire, j’ai cherché dans la réserve d’ACCEIS (aka no man’s land) le même ordinateur mais contenant un BIOS sans mot de passe. L’objectif initial est de comparer les deux UEFIs.
A) Cherchez l’EEPROM contenant l’UEFI
Avant de venir récupérer l’UEFI, il faut localiser la mémoire la contenant. J’ai la chance d’avoir à plusieurs reprise pu réaliser des opérations similaires chez ACCEIS. Je sais donc que ce genre d’informations se trouvent généralement sur une EEPROM externe.
L’EEPROM (Electrically-Erasable Programmable Read-Only Memory) est une mémoire morte électronique reprogrammable et effaçable électroniquement. Le but d’une mémoire morte est le stockage d’informations ne devant pas être perdues lorsque l’appareil qui les contient n’est plus alimenté en électricité (merci Wikipédia). L’avantage d’une EEPROM est qu’il est possible de la reprogrammer sans la retirer de l’appareil électronique la contenant (à l’inverse d’une EPROM).
J’ai à de nombreuses reprises chez ACCEIS, rencontrées des EEPROMs avec la forme suivante :
Il en existe de forme différente, mais pour mes recherches, j’ai décidé de me concentrer sur les plus communes.
J’ai donc commencé un travail minutieux de recherche sur la carte mère de l’ordinateur (rappel ⇒ Aucun schéma électronique disponible sur internet).
Après des minutes intenses de louchage, j’ai enfin trouvé des candidats potentiels : deux puces juste à côté de la pile CMOS. Des candidats idéals jusqu’à ce que j’arrive à lire la référence…
Je n’avais jamais vu des telles références ; mon EEPROM s’est transformée en régulateur de tension. Cela risque d’être compliqué de trouver un UEFI à cet endroit, même en cherchant bien…
J’ai donc repris mes recherches avant de trouver sur un troisième candidat. Les références me semblent familières. Je cherche donc sur internet la Datasheet et … Bingo, une magnifique EEPROM !
B) Lisez attentivement la datasheet
J’ai pris l’habitude de toujours lire la datasheet. Celle-ci est relativement utile pour ne pas brûler la puce en l’alimentant en 5 volts alors qu’elle ne supporte que du 3.3 volts.
Je trouve rapidement la page qui m’intéresse, celle contenant les tensions ainsi que les différents protocoles de communication supportés par notre puce.
Par chance (ou convention) notre puce supporte le SPI.
Le SPI (Serial Peripheral Interface) est un bus de données série synchrone communiquant sous le schéma de maître-esclave. Le périphérique dit maître va communiquer sur le bus de données et envoyer des commandes à un esclave. L’esclave enverra ensuite la réponse au maître.
Le bus SPI utilise 4 canaux différents:
- CLK ⇒ Serial Clock, Horloge (généré par le maître)
- MOSI ⇒ Master Output, Slave Input (généré par le maître)
- MISO ⇒ Master Input, Slave Output (généré par l’esclave)
- CS ⇒ Slave Select, Actif à l’état bas (généré par le maître)
Nous allons donc devoir trouver les pattes correspondantes dans notre datasheet. Heureusement, c’est assez simple. Un magnifique schéma nous montre ce que nous cherchons.
Maintenant que nous avons toutes les informations nécessaires, nous pouvons nous brancher sur les pattes suivantes :
- VCC (5 ou 3.3V)
- CS (Chip select)
- GND (Ground)
- CLK (Clock)
- DI (MOSI)
- DO (MISO)
C) Réalisez le branchement et dumpez
Au vu de la taille relativement petite de l’EEPROM (8x6mm), de la taille encore plus petite des pattes (1mm) et de mon Parkinson grandissant, j’ai décidé d’utiliser des sondes.
Les sondes en question sont des PCBites.
Sur un socle en métal, les sondes viennent se fixer via des aimants. Ces sondes ne sont rien d’autre qu’une pointe très fine reliée à un fil. La structure en acier permet de faire tenir la pointe sur les pattes de notre puce.
Il est ainsi relativement aisé de réaliser le montage suivant :
Bien ! Nous avons maintenant des sondes sur les pattes de notre EEPROM, mais il faut pouvoir brancher ces fils quelque part afin de communiquer en SPI.
C’est maintenant qu’entre en jeu le bus pirate (un raspberry fait aussi l’affaire).
Le Bus Pirate est un dispositif d’interface de bus universel conçu pour la programmation, le débogage et l’analyse des microcontrôleurs. Il permet notamment la communication en SPI.
Tel un jeu d’enfant, nous faisons correspondre les fils avec les inscriptions au dos du bus pirate :
Ce qui donne le montage suivant sur le bus pirate :
Nous branchons le bus pirate à notre ordinateur et nous sommes prêts à dumper notre UEFI.
Comme je suis relativement fainéant et que je n’ai point envie de tout réaliser à la main, j’utilise un projet nommé flashrom.
Le programme réalisera le dump via SPI sous réserve que la puce soit supportée. Une petite vérification sur le site officiel ⇒ https://www.flashrom.org/Supported_hardware.
Champagne ! Je vais pouvoir économiser deux heures de ma vie.
Après avoir compilé flashrom et branché le bus pirate, il est intéressant de lancer une détection de la puce afin de savoir si nos branchements sont corrects.
Pour ce faire, la commande suivante suffit :
sudo ./flashrom -VVVVVVVVVVVVV -p buspirate_spi:dev=/dev/ttyACM0
Notre puce est bien détectée, nous pouvons lancer le dump :
sudo flashrom -VVVVVVVVVVVVV -p buspirate_spi:dev=/dev/ttyACM0 -c "W25Q64.V" -r W25Q64.eeprom
Nous voici en possession de notre UEFI.
D) Injectez le nouvel UEFI
Maintenant que nous sommes en possession d’un UEFI sans mot de passe, il nous suffit d’injecter celui-ci dans l’EEPROM de l’ordinateur verrouillé.
Pour ce faire, rien de plus simple, nous réalisons le même schéma que précédemment sur l’ordinateur que l’on souhaite déverrouiller.
Nous vérifions notre branchement en détectant la puce avec flashrom.
sudo ./flashrom -VVVVVVVVVVVVV -p buspirate_spi:dev=/dev/ttyACM0
Enfin nous pouvons uploader l’UEFI précédemment récupéré sur le nouvel ordinateur en utilisant l’option -w
(write).
sudo flashrom -VVVVVVVVVVVVV -p buspirate_spi:dev=/dev/ttyACM0 -c "W25Q64.V" -w W25Q64.eeprom
Comme nous pouvons l’observer sur l’image, notre UEFI a passé le statut VERIFIED, ce qui signifie qu’il a correctement été injecté.
Il ne reste plus qu’à démarrer, puis aller dans le BIOS et …
Nous venons de débloquer notre BIOS.
Comme vous pouvez le voir, le serial number est identique sur les deux ordinateurs, ce qui veut dire que ces valeurs sont hardcodées dans notre UEFI et que nous pouvons potentiellement les modifier.
Bonus: Modifiez les références de votre ordinateur
Après de longues heures (hum hum) de recherche, j’ai réussi à trouver dans notre UEFI des valeurs hardcodées. Il serait quand même gênant qu’un utilisateur les modifie.
Rien de plus simple, il suffit d’ouvrir notre dump avec Hexeditor, de trouver les valeurs que nous souhaitons modifier et de les remplacer.
On sauvegarde, on réalise les branchements puis on injecte.
Nous nous rendons maintenant dans notre BIOS et les valeurs que nous avons modifiées se trouvent bien à l’endroit souhaité.
Le plus intéressant est la répercussion dans Windows des modifications de notre UEFI, il est par exemple possible de modifier nos valeurs par des formats strings.
Nous les retrouvons bien dans Windows, ouvrant ainsi la possibilité à une multitude d’attaques.
Conclusion
L’analyse de la carte mère et de l’UEFI fut très instructif. Le manque de documentation rend la tâche plus complexe mais avec de la motivation, il est possible de s’y retrouver.
L’accès direct à l’EEPROM (face clapet de l’ordinateur) rend le dump très facile. Il suffit d’ouvrir et nous pouvons directement nous brancher.
Le manque de contrôle sur l’UEFI est une source d’attaque. En effet, n’importe qui peut extraire, modifier et réinjecter dans l’EEPROM. Aucun CRC ni chiffrement n’est en place. De plus, l’authentification est facilement bypassable, l’UEFI n’utilise pas assez à son avantage les composants de la carte mère.
À propos de l’auteur
Article rédigé par Rémi ASSIDI, apprenti auditeur sécurité chez ACCEIS.