
Toolkit per emulare firmware e analizzarlo per vulnerabilità di sicurezza
FAT è un toolkit creato per aiutare i ricercatori di sicurezza ad analizzare e identificare vulnerabilità nel firmware di dispositivi IoT e embedded. Viene anche utilizzato nel corso di formazione "Offensive IoT Exploitation" tenuto da Attify.
Nota:
Ad oggi, è semplicemente uno script per automatizzare Firmadyne, uno strumento utilizzato per l'emulazione del firmware. In caso di problemi con l'emulazione vera e propria, segnala i tuoi problemi nel repository di Firmadyne.
Se riscontri problemi, puoi provare AttifyOS che ha il Firmware Analysis Toolkit e altri strumenti preinstallati e pronti all'uso.
Firmware Analysis Toolkit (d'ora in poi FAT) si basa su Firmadyne con alcune modifiche. Firmadyne utilizza un database PostgreSQL per memorizzare informazioni sulle immagini emulate. Tuttavia, per la funzionalità principale, ovvero l'emulazione del firmware, PostgreSQL non è realmente necessario. Quindi FAT non lo usa.
FAT è sviluppato in Python 3. Tuttavia è necessario avere sia Python 3 che Python 2 installati poiché parti di Firmadyne e delle sue dipendenze usano Python 2. Si consiglia vivamente di installare FAT all'interno di una macchina virtuale.
Per installare, basta clonare il repository ed eseguire lo script ./setup.sh.
git clone https://github.com/attify/firmware-analysis-toolkit
cd firmware-analysis-toolkit
./setup.sh
Dopo aver completato l'installazione, modifica il file fat.config e fornisci la password di sudo come mostrato qui sotto. Firmadyne richiede privilegi di sudo per alcune delle sue operazioni. La password di sudo viene fornita per automatizzare il processo.
[DEFAULT]
sudo_password=attify123
firmadyne_path=/home/attify/firmadyne
$ ./fat.py <file del firmware>
Fornisci il nome del file del firmware come argomento dello script.
Lo script mostrerà gli indirizzi IP assegnati alle interfacce di rete create. Prendine nota.
Alla fine, dirà che sta eseguendo il firmware. Premi INVIO e attendi che il firmware si avvii. Fai ping all'IP mostrato nel passaggio precedente, oppure aprilo nel browser.
Congratulazioni! Il firmware è finalmente emulato.
Per rimuovere tutte le immagini del firmware analizzate, esegui
$ ./reset.py
$ ./fat.py DIR-601_REVB_FIRMWARE_2.01.BIN
__ _
/ _| | |
| |_ __ _ | |_
| _| / _` | | __|
| | | (_| | | |_
|_| \__,_| \__|
Benvenuti in Firmware Analysis Toolkit - v0.3
Offensive IoT Exploitation Training http://bit.do/offensiveiotexploitation
By Attify - https://attify.com | @attifyme
[+] Firmware: DIR-601_REVB_FIRMWARE_2.01.BIN
[+] Estrazione del firmware in corso...
[+] ID immagine: 1
[+] Identificazione architettura in corso...
[+] Architettura: mipseb
[+] Creazione dell'immagine del disco QEMU in corso...
[+] Impostazione della connessione di rete, attendere prego...
[+] Interfacce di rete: [('br0', '192.168.0.1')]
[+] Tutto pronto! Premi INVIO per eseguire il firmware...
[+] Durante l'esecuzione, premi Ctrl + A X per terminare qemu
Asciicast
$ ./fat.py DIR890A1_FW103b07.bin --qemu 2.5.0
__ _
/ _| | |
| |_ __ _ | |_
| _| / _` | | __|
| | | (_| | | |_
|_| \__,_| \__|
Benvenuti in Firmware Analysis Toolkit - v0.3
Offensive IoT Exploitation Training http://bit.do/offensiveiotexploitation
By Attify - https://attify.com | @attifyme
[+] Firmware: DIR890A1_FW103b07.bin
[+] Estrazione del firmware in corso...
[+] ID immagine: 2
[+] Identificazione architettura in corso...
[+] Architettura: armel
[+] Creazione dell'immagine del disco QEMU in corso...
[+] Impostazione della connessione di rete, attendere prego...
[+] Interfacce di rete: [('br0', '192.168.0.1'), ('br1', '192.168.7.1')]
[+] Utilizzo di qemu-system-arm da /home/attify/firmware-analysis-toolkit/qemu-builds/2.5.0
[+] Tutto pronto! Premi INVIO per eseguire il firmware...
[+] Durante l'esecuzione, premi Ctrl + A X per terminare qemu
Al momento, il kernel Firmadyne per ARM non funziona con l'ultima versione di Qemu (2.11.1) disponibile nel repository ufficiale di Ubuntu 18.04. Tuttavia, Qemu (2.5.0) su Ubuntu 16.04 funziona. In alternativa, puoi anche utilizzare il Qemu (2.5.0) incluso fornito con Firmadyne come mostrato nell'esempio 2.
Se non vengono rilevate interfacce di rete, prova ad aumentare il valore di timeout da 60 in scripts/inferNetwork.sh come mostrato qui sotto
echo "Esecuzione del firmware ${IID}: terminazione dopo 60 secondi..."
timeout --preserve-status --signal SIGINT 60 "${SCRIPT_DIR}/run.${ARCH}.sh" "${IID}"
Il repository include già build statiche di qemu 2.0.0, 2.5.0 e 3.0.0 (nei rilasci), ma se vuoi crearne una tua segui i passaggi qui sotto.
Su una Ubuntu 16.04 pulita esegui. (È importante usare la 16.04, le versioni successive hanno problemi con la compilazione statica).
sudo apt update && sudo apt build-dep qemu -y
wget https://download.qemu.org/qemu-2.0.0.tar.bz2
tar xf qemu-2.0.0.tar.bz2
mkdir qemu-2.0.0-build
cd qemu-2.0.0
./configure --prefix=$(realpath ../qemu-2.0.0-build) --static --target-list=arm-softmmu,mips-softmmu,mipsel-softmmu --disable-smartcard-nss --disable-spice --disable-libusb --disable-usb-redir
make
make install
I binari compilati si trovano nella directory qemu-2.0.0-build.
sudo apt update && sudo apt build-dep qemu -y
wget https://download.qemu.org/qemu-2.5.0.tar.bz2
tar xf qemu-2.5.0.tar.bz2
mkdir qemu-2.5.0-build
cd qemu-2.5.0
./configure --prefix=$(realpath ../qemu-2.5.0-build) --static --target-list=arm-softmmu,mips-softmmu,mipsel-softmmu --disable-smartcard --disable-libusb --disable-usb-redir
make
make install
I binari compilati si trovano nella directory qemu-2.5.0-build.
sudo apt update && sudo apt build-dep qemu -y
wget https://download.qemu.org/qemu-3.0.0.tar.bz2
tar xf qemu-3.0.0.tar.bz2
mkdir qemu-3.0.0-build
cd qemu-3.0.0
./configure --prefix=$(realpath ../qemu-3.0.0-build) --static --target-list=arm-softmmu,mips-softmmu,mipsel-softmmu --disable-smartcard --disable-libusb --disable-usb-redir
make
make install
I binari compilati si trovano nella directory qemu-3.0.0-build.
Nota: Dovrebbe essere possibile compilare qemu staticamente anche su un sistema Alpine, ma non è stato testato. In generale, la compilazione su Alpine è preferita rispetto a Ubuntu poiché il primo utilizza musl libc che è migliore per il collegamento statico rispetto a glibc su Ubuntu.