Firmware Analysis
Last updated
Last updated
Impara e pratica l'Hacking su AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
Il firmware è un software essenziale che consente ai dispositivi di funzionare correttamente gestendo e facilitando la comunicazione tra i componenti hardware e il software con cui gli utenti interagiscono. È memorizzato in memoria permanente, garantendo che il dispositivo possa accedere istruzioni vitali dal momento in cui viene acceso, portando al lancio del sistema operativo. Esaminare e potenzialmente modificare il firmware è un passo critico per identificare vulnerabilità di sicurezza.
La raccolta di informazioni è un passo iniziale critico per comprendere la composizione di un dispositivo e le tecnologie che utilizza. Questo processo coinvolge la raccolta di dati su:
L'architettura della CPU e il sistema operativo che esegue
Specifiche del bootloader
Layout hardware e datasheet
Metriche del codice sorgente e posizioni
Librerie esterne e tipi di licenza
Storico degli aggiornamenti e certificazioni regolamentari
Diagrammi architetturali e di flusso
Valutazioni della sicurezza e vulnerabilità identificate
A tale scopo, gli strumenti di intelligence open-source (OSINT) sono preziosi, così come l'analisi di eventuali componenti software open-source disponibili attraverso processi di revisione manuali e automatizzati. Strumenti come Coverity Scan e LGTM di Semmle offrono analisi statica gratuita che può essere sfruttata per individuare potenziali problemi.
L'ottenimento del firmware può essere affrontato attraverso vari mezzi, ognuno con il proprio livello di complessità:
Direttamente dalla fonte (sviluppatori, produttori)
Costruendolo seguendo le istruzioni fornite
Scaricandolo dai siti di supporto ufficiali
Utilizzando query Google dork per trovare file firmware ospitati
Accedendo direttamente allo storage cloud, con strumenti come S3Scanner
Intercettando aggiornamenti tramite tecniche di man-in-the-middle
Estrazione dal dispositivo tramite connessioni come UART, JTAG, o PICit
Sniffing per le richieste di aggiornamento all'interno della comunicazione del dispositivo
Identificare e utilizzare punti finali di aggiornamento codificati
Dumping dal bootloader o dalla rete
Rimuovendo e leggendo il chip di memorizzazione, quando tutto il resto fallisce, utilizzando gli strumenti hardware appropriati
Ora che hai il firmware, devi estrarre informazioni su di esso per sapere come trattarlo. Diversi strumenti che puoi utilizzare per questo:
Se non trovi molto con quegli strumenti, controlla l'entropia dell'immagine con binwalk -E <bin>
, se l'entropia è bassa, allora è improbabile che sia criptata. Se l'entropia è alta, è probabile che sia criptata (o compressa in qualche modo).
Inoltre, puoi utilizzare questi strumenti per estrarre file incorporati nel firmware:
File/Data Carving & Recovery ToolsOppure binvis.io (codice) per ispezionare il file.
Con gli strumenti precedentemente commentati come binwalk -ev <bin>
dovresti essere in grado di estrarre il filesystem.
Di solito, Binwalk lo estrae all'interno di una cartella denominata come il tipo di filesystem, che di solito è uno tra i seguenti: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
A volte, binwalk non avrà il byte magico del filesystem nelle sue firme. In questi casi, utilizza binwalk per trovare l'offset del filesystem e intagliare il filesystem compresso dal binario ed estrarre manualmente il filesystem in base al suo tipo seguendo i passaggi seguenti.
Esegui il seguente comando dd intagliando il filesystem Squashfs.
In alternativa, potrebbe essere eseguito anche il seguente comando.
$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs
Per squashfs (usato nell'esempio sopra)
$ unsquashfs dir.squashfs
I file saranno nella directory "squashfs-root
" successivamente.
File di archivio CPIO
$ cpio -ivd --no-absolute-filenames -F <bin>
Per i filesystem jffs2
$ jefferson rootfsfile.jffs2
Per i filesystem ubifs con flash NAND
$ ubireader_extract_images -u UBI -s <start_offset> <bin>
$ ubidump.py <bin>
Una volta ottenuto il firmware, è essenziale dissezionarlo per comprendere la sua struttura e le potenziali vulnerabilità. Questo processo coinvolge l'utilizzo di vari strumenti per analizzare ed estrarre dati preziosi dall'immagine del firmware.
Viene fornito un insieme di comandi per l'ispezione iniziale del file binario (indicato come <bin>
). Questi comandi aiutano nell'identificare i tipi di file, estrarre stringhe, analizzare dati binari e comprendere i dettagli delle partizioni e dei filesystem:
Per valutare lo stato di crittografia dell'immagine, l'entropia viene verificata con binwalk -E <bin>
. Un'entropia bassa suggerisce una mancanza di crittografia, mentre un'entropia alta indica una possibile crittografia o compressione.
Per estrarre file incorporati, sono consigliati strumenti e risorse come la documentazione di file-data-carving-recovery-tools e binvis.io per l'ispezione dei file.
Utilizzando binwalk -ev <bin>
, di solito è possibile estrarre il file system, spesso in una directory denominata come il tipo di file system (ad esempio, squashfs, ubifs). Tuttavia, quando binwalk non riesce a riconoscere il tipo di file system a causa della mancanza di byte magici, è necessaria un'estrazione manuale. Ciò comporta l'utilizzo di binwalk
per individuare l'offset del file system, seguito dal comando dd
per estrarre il file system:
Con il filesystem estratto, inizia la ricerca di difetti di sicurezza. Si presta attenzione ai daemon di rete non sicuri, alle credenziali codificate, agli endpoint API, alle funzionalità del server di aggiornamento, al codice non compilato, agli script di avvio e ai binari compilati per l'analisi offline.
Posizioni chiave e elementi da ispezionare includono:
etc/shadow e etc/passwd per le credenziali utente
Certificati SSL e chiavi in etc/ssl
File di configurazione e script per potenziali vulnerabilità
Binari incorporati per ulteriori analisi
Comuni server web per dispositivi IoT e binari
Diversi strumenti aiutano a scoprire informazioni sensibili e vulnerabilità all'interno del filesystem:
LinPEAS e Firmwalker per la ricerca di informazioni sensibili
Lo strumento di analisi e confronto del firmware (FACT) per un'analisi completa del firmware
FwAnalyzer, ByteSweep, ByteSweep-go e EMBA per analisi statiche e dinamiche
Sia il codice sorgente che i binari compilati trovati nel filesystem devono essere esaminati per individuare vulnerabilità. Strumenti come checksec.sh per i binari Unix e PESecurity per i binari Windows aiutano a identificare binari non protetti che potrebbero essere sfruttati.
Il processo di emulazione del firmware consente l'analisi dinamica dell'operazione di un dispositivo o di un singolo programma. Questo approccio può incontrare sfide legate alle dipendenze hardware o architetturali, ma il trasferimento del filesystem radice o di binari specifici su un dispositivo con architettura e endianness corrispondenti, come un Raspberry Pi, o su una macchina virtuale pre-costruita, può facilitare ulteriori test.
Per esaminare singoli programmi, è cruciale identificare l'endianness e l'architettura della CPU del programma.
Per emulare un binario con architettura MIPS, è possibile utilizzare il comando:
E per installare gli strumenti di emulazione necessari:
Per i binari ARM, il processo è simile, con l'emulatore qemu-arm
utilizzato per l'emulazione.
Strumenti come Firmadyne, Firmware Analysis Toolkit e altri facilitano l'emulazione completa del firmware, automatizzando il processo e aiutando nell'analisi dinamica.
In questa fase, viene utilizzato un ambiente dispositivo reale o emulato per l'analisi. È essenziale mantenere l'accesso alla shell del sistema operativo e al filesystem. L'emulazione potrebbe non replicare perfettamente le interazioni hardware, rendendo necessari riavvii occasionali dell'emulazione. L'analisi dovrebbe esaminare nuovamente il filesystem, sfruttare le pagine web esposte e i servizi di rete, ed esplorare le vulnerabilità del bootloader. I test di integrità del firmware sono fondamentali per identificare potenziali vulnerabilità backdoor.
L'analisi in esecuzione coinvolge l'interazione con un processo o un binario nel suo ambiente operativo, utilizzando strumenti come gdb-multiarch, Frida e Ghidra per impostare i punti di interruzione e identificare vulnerabilità attraverso fuzzing e altre tecniche.
Lo sviluppo di un PoC per le vulnerabilità identificate richiede una profonda comprensione dell'architettura di destinazione e della programmazione in linguaggi di basso livello. Le protezioni di runtime binario nei sistemi embedded sono rare, ma quando presenti, potrebbero essere necessarie tecniche come Return Oriented Programming (ROP).
Sistemi operativi come AttifyOS e EmbedOS forniscono ambienti preconfigurati per i test di sicurezza del firmware, dotati degli strumenti necessari.
AttifyOS: AttifyOS è una distribuzione progettata per aiutarti a eseguire valutazioni di sicurezza e test di penetrazione dei dispositivi Internet of Things (IoT). Ti fa risparmiare molto tempo fornendo un ambiente preconfigurato con tutti gli strumenti necessari caricati.
EmbedOS: Sistema operativo per test di sicurezza embedded basato su Ubuntu 18.04 pre-caricato con strumenti di test di sicurezza del firmware.
Per esercitarsi nella scoperta di vulnerabilità nel firmware, utilizzare i seguenti progetti di firmware vulnerabili come punto di partenza.
OWASP IoTGoat
The Damn Vulnerable Router Firmware Project
Damn Vulnerable ARM Router (DVAR)
ARM-X
Azeria Labs VM 2.0
Damn Vulnerable IoT Device (DVID)