
Kit de ferramentas para emular firmware e analisá-lo em busca de vulnerabilidades de segurança.
FAT é um kit de ferramentas construído para ajudar pesquisadores de segurança a analisar e identificar vulnerabilidades em firmware de dispositivos IoT e embarcados. Também é usado no treinamento "Offensive IoT Exploitation" conduzido pela Attify.
Nota:
Atualmente, é apenas um script para automatizar o Firmadyne, que é uma ferramenta usada para emulação de firmware. Em caso de problemas com a emulação propriamente dita, por favor, poste suas questões no firmadyne issues.
Se estiver enfrentando problemas, você pode tentar o AttifyOS, que possui o Firmware analysis toolkit e outras ferramentas pré-instaladas e prontas para uso.
Firmware Analysis Toolkit (FAT, daqui em diante) é baseado no Firmadyne com algumas alterações. O Firmadyne usa um banco de dados PostgreSQL para armazenar informações sobre as imagens emuladas. No entanto, apenas para a funcionalidade principal, ou seja, emular firmware, o PostgreSQL não é realmente necessário. Portanto, o FAT não o utiliza.
FAT é desenvolvido em Python 3. No entanto, você precisa ter tanto Python 3 quanto Python 2 instalados, pois partes do Firmadyne e suas dependências usam Python 2. É altamente recomendável instalar o FAT dentro de uma Máquina Virtual.
Para instalar, basta clonar o repositório e executar o script ./setup.sh.
git clone https://github.com/attify/firmware-analysis-toolkit
cd firmware-analysis-toolkit
./setup.sh
Após a instalação, edite o arquivo fat.config e forneça a senha do sudo conforme mostrado abaixo. O Firmadyne requer privilégios sudo para algumas de suas operações. A senha do sudo é fornecida para automatizar o processo.
[DEFAULT]
sudo_password=attify123
firmadyne_path=/home/attify/firmadyne
$ ./fat.py <firmware file>
Forneça o nome do arquivo de firmware como argumento para o script.
O script exibirá os endereços IP atribuídos às interfaces de rede criadas. Anote-os.
Finalmente, ele dirá que está executando o firmware. Pressione ENTER e aguarde até que o firmware inicialize. Pingue o IP que foi mostrado no passo anterior, ou abra no navegador.
Parabéns! O firmware foi finalmente emulado.
Para remover todas as imagens de firmware analisadas, execute
$ ./reset.py
$ ./fat.py DIR-601_REVB_FIRMWARE_2.01.BIN
__ _
/ _| | |
| |_ __ _ | |_
| _| / _` | | __|
| | | (_| | | |_
|_| \__,_| \__|
Welcome to the 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
[+] Extracting the firmware...
[+] Image ID: 1
[+] Identifying architecture...
[+] Architecture: mipseb
[+] Building QEMU disk image...
[+] Setting up the network connection, please standby...
[+] Network interfaces: [('br0', '192.168.0.1')]
[+] All set! Press ENTER to run the firmware...
[+] When running, press Ctrl + A X to terminate qemu
Asciicast
$ ./fat.py DIR890A1_FW103b07.bin --qemu 2.5.0
__ _
/ _| | |
| |_ __ _ | |_
| _| / _` | | __|
| | | (_| | | |_
|_| \__,_| \__|
Welcome to the Firmware Analysis Toolkit - v0.3
Offensive IoT Exploitation Training http://bit.do/offensiveiotexploitation
By Attify - https://attify.com | @attifyme
[+] Firmware: DIR890A1_FW103b07.bin
[+] Extracting the firmware...
[+] Image ID: 2
[+] Identifying architecture...
[+] Architecture: armel
[+] Building QEMU disk image...
[+] Setting up the network connection, please standby...
[+] Network interfaces: [('br0', '192.168.0.1'), ('br1', '192.168.7.1')]
[+] Using qemu-system-arm from /home/attify/firmware-analysis-toolkit/qemu-builds/2.5.0
[+] All set! Press ENTER to run the firmware...
[+] When running, press Ctrl + A X to terminate qemu
Atualmente, o kernel ARM do firmadyne não funciona com a versão mais recente do Qemu (2.11.1) disponível no repositório oficial do Ubuntu 18.04. No entanto, o Qemu (2.5.0) no Ubuntu 16.04 funciona. Alternativamente, você também pode usar o Qemu (2.5.0) empacotado fornecido com o firmadyne, conforme mostrado no exemplo 2.
Se nenhuma interface de rede for detectada, tente aumentar o valor do timeout de 60 em scripts/inferNetwork.sh conforme mostrado abaixo
echo "Running firmware ${IID}: terminating after 60 secs..."
timeout --preserve-status --signal SIGINT 60 "${SCRIPT_DIR}/run.${ARCH}.sh" "${IID}"
O repositório já inclui compilações estáticas do qemu 2.0.0, 2.5.0 e 3.0.0 (nos releases), mas se você quiser compilar a sua própria, siga os passos abaixo.
Em uma VM limpa do Ubuntu 16.04 execute. (É importante usar o 16.04, versões posteriores têm problemas com compilação estática).
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
Os binários compilados podem ser encontrados no diretório 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
Os binários compilados podem ser encontrados no diretório 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
Os binários compilados podem ser encontrados no diretório qemu-3.0.0-build.
Nota: Também deve ser possível compilar o qemu estaticamente em um sistema alpine, mas isso não foi testado. Em geral, compilar no alpine é preferível ao Ubuntu, pois o primeiro vem com musl libc, que é melhor para ligação estática do que o glibc no Ubuntu.