| name | iot-firmware-analysis |
| title | Analyse de Firmware IoT |
| description | Guide complet pour l'extraction, l'analyse statique/dynamique, la modification et le reconditionnement de firmware de dispositifs IoT. Couvre les formats binaires, le reverse engineering, l'extraction par flash, OTA et debug, et la détection de backdoors/vulnérabilités. |
| category | cybersecurite |
Analyse de Firmware IoT
Vue d'Ensemble
L'analyse de firmware IoT consiste à extraire le logiciel embarqué d'un dispositif, l'analyser pour y trouver des vulnérabilités, des secrets, des backdoors, ou comprendre son fonctionnement interne. C'est la première étape de tout pentest IoT sérieux.
Objectifs
- Extraire le firmware (flash physique, OTA, debug interface)
- Analyser statiquement (strings, binwalk, Ghidra)
- Analyser dynamiquement (émulation QEMU, exécution partielle)
- Modifier et reflasher (persistance, backdoor)
- Détecter : hardcoded credentials, API endpoints, protocoles propriétaires
Outils Essentiels
Extraction
| Outil | Usage |
|---|
binwalk | Analyse d'empreintes, extraction de systèmes de fichiers |
dd / flashrom | Dump raw de flash SPI |
openocd | Extraction via JTAG/SWD |
esptool | ESP8266/ESP32 extraction |
chipsec | Extraction SPI firmware x86 |
adb | Extraction depuis Android Things / Linux embarqué |
Analyse Statique
| Outil | Usage |
|---|
strings | Extraction de chaînes (credentials, paths, URLs) |
file / binwalk -E | Identification du type de fichier, entropie |
Ghidra | Reverse engineering complet (MIPS, ARM, Xtensa, RISC-V) |
radare2 / rizin | Reverse engineering en CLI |
firmwalker | Scan automatisé de firmware |
FACT (Firmware Analysis and Comparison Tool) | Framework complet d'analyse |
sasquatch | Extraction SquashFS non-standard |
Émulation
| Outil | Usage |
|---|
QEMU (user + system mode) | Émulation de binaires cross-arch |
Firmadyne | Émulation complète de firmware Linux embarqué |
FirmAE | Fork amélioré de Firmadyne avec instrumentation |
Avatar² | Framework d'analyse hybride (émulation + hardware) |
Modification & Reflash
| Outil | Usage |
|---|
mksquashfs / mkfs.jffs2 | Reconstruction de filesystem |
ubinize / mkfs.ubifs | Images UBIFS |
fastboot / heimdall | Flash via bootloader |
flashrom | Flash SPI hardware |
Méthodologie
Phase 1 : Collecte et Extraction
file firmware.bin
binwalk -E firmware.bin
binwalk -Me firmware.bin
dd if=firmware.bin bs=1 skip=$OFFSET | unsquashfs -d ./extracted -
jefferson -d ./extracted firmware.bin
cramfsck -x ./extracted firmware.bin
ubireader_extract_images -w ./extracted firmware.bin
strings -n 6 firmware.bin | grep -iE '(pass|key|secret|token|http|api|admin|root|ssh|telnet)'
Phase 2 : Analyse Statique
binwalk -Y firmware.bin | head -20
strings firmware.bin | grep -E 'https?://' | sort -u
extractcert firmware.bin
./firmwalker.sh extracted/
Phase 3 : Reverse Engineering (Ghidra)
- Charger le binaire dans Ghidra
- Sélectionner l'architecture (ARM/MIPS/Xtensa/RISC-V)
- Analyse automatique (auto-analysis)
- Rechercher :
main() et init() du firmware
system(), popen(), exec() — injection commande
strcpy(), sprintf(), gets() — buffer overflow
malloc() sans free() — fuites mémoire
hardcoded credentials en strings
- Cross-reference sur les endpoints réseau (bind(), listen(), accept())
Phase 4 : Émulation
sudo ./scripts/makeImage.sh $ID firmware.bin
sudo ./scripts/run.sh $ID
qemu-arm-static -L ./extracted/ ./extracted/bin/busybox
qemu-system-arm -M virt -kernel vmlinuz -drive file=rootfs.ext2,format=raw \
-append "root=/dev/sda console=ttyAMA0" -nographic
Phase 5 : Analyse de Sécurité
- Hardcoded secrets : clés API, tokens OAuth, mots de passe root
- Services exposés : telnet, SSH, HTTP sans auth, UPnP, CoAP
- Version des bibliothèques : vieux OpenSSL/Kernel (CVE connues)
- Permissions : binaires setuid root, world-writable files
- Bootloader : pas de Secure Boot, console UART exposée
- Update OTA : signature non vérifiée, clé publique embarquée
Techniques Avancées
Détection de Firmware Chiffré
- Entropie élevée uniforme sur tout le fichier → probablement chiffré
- Analyser le bootloader pour trouver la clé de déchiffrement
- Méthode : extraire le bootloader, trouver la routine de déchiffrement
Firmware OTA
mitmproxy -p 8080 --mode transparent
Hooking Dynamique
gcc -shared -fPIC -o myhook.so hook.c
LD_PRELOAD=./myhook.so qemu-arm-static ./bin/httpd
Attaque sur Update
- Downgrade attack : forcer le device à accepter une ancienne version vulnérable
- Man-in-the-middle : intercepter la mise à jour, injecter un firmware backdooré
- Rollback protection bypass : trouver le compteur de version dans la flash
Pièges & ASTUCES
⚠️ Entropie ≠ chiffrement : compression haute (xz, lzma) donne aussi une entropie élevée
⚠️ binwalk peut rater : certains firmwares ont des signatures non standard (vérifier hexdump manuellement)
⚠️ Endianness : ARM est bi-endian, bien configurer Ghidra
⚠️ Chargement décalé : les firmwares ont souvent un header avant le code exécutable (utiliser la base address correcte)
⚠️ Squashfs non standard : sasquatch supporte plus de variantes que unsquashfs
⚠️ Bootloader protégé : certains bootloaders verrouillent la flash après le boot (nécessite glitching)
Check-list de Sécurité Rapide
binwalk -E firmware.bin
strings firmware.bin | grep -iE '(password|secret|key|token|admin)' | grep -v '^\.'
find extracted/ -perm -4000 -type f
nmap -sT -p- 192.168.0.100
strings extracted/boot/vmlinuz | grep 'Linux version'
openssl x509 -in extracted/etc/ssl/certs/ca.pem -text
Références