
Abordagem de iniciante para hacking de firmware
Este documento é o relato da minha experiência pessoal como novato em engenharia reversa e exploração de firmware.

Para demonstração, analisaremos e reproduziremos a CVE-2023-27216.
Para explorar qualquer firmware, existem os seguintes passos:
gdbserver estaticamente para depurar.Normalmente, um arquivo binário de firmware contém um bootloader (uBoot), um arquivo de kernel, um cabeçalho de kernel para o bootloader (uImage), um sistema de arquivos compactado (geralmente no formato SquashFS), uma tabela CRC/MD5 (para verificar a integridade dos arquivos) e outros arquivos diversos.
Primeiro, encontre uma maneira de analisar o firmware, faça algumas pesquisas e reúna alguns recursos:

Extraia o firmware usando o binwalk: binwalk -Me DSL-3782_A1_EU_1.01_07282016.bin

Obtive a pasta squashfs-root extraída e alguns arquivos estranhos.

Bônus: Se você não vir a pasta squashfs-root, use unsquashfs em qualquer arquivo ".squashfs" que encontrar. Eles são como arquivos zip 😅.
Verifique a arquitetura e o endianness do firmware. Isso pode ser verificado analisando alguns binários extraídos do firmware. Verifique a arquitetura e o firmware: file <binary>

Aqui podemos quase confirmar que o firmware roda na arquitetura MIPS de 32 bits MSB. O motivo do "quase" é que alguns firmwares podem rodar em uma arquitetura diferente com MIPS Compatible, como Lexra.
Verifiquei a pasta squashfs-root e encontrei alguns arquivos interessantes:
usr/etc/init.d/rcS => Este é o script que executa quando o firmware iniciausr/etc/passwd => Este é o arquivo que contém as informações dos usuáriosuserfs/romfile.cfg => Existe uma credencial admin:adminVerifiquei o arquivo rcS e encontrei um código interessante:
echo "admin:$1$$iC.dUsGpxNNJGeOm1dFio/:0:0:root:/:/bin/sh" > /usr/etc/passwd
passwdBoa é um servidor web antigo, usado principalmente em dispositivos embarcados como roteadores nos anos 2000. No entanto, o servidor Boa interrompeu seu desenvolvimento em 2005! Mesmo estando morto há quase 20 anos, ele ainda vive até hoje graças ao nosso fornecedor.

Recomendo usar um sistema operacional baseado em Debian para o processo de emulação, como Ubuntu ou Kali. Existe outro sistema operacional focado em hacking de firmware chamado AttifyOS. Neste documento, usei Kali Linux. Começando pelo processo de emulação, existem 2 ferramentas:

Vamos ver como usar o FAT para emular completamente um firmware. Primeiro, clonamos o repositório do GitHub para sua máquina Kali. E passamos pelo processo de configuração. Você também precisa alterar o arquivo fat.config, caso contrário não funcionará.
git clone https://github.com/attify/firmware-analysis-toolkit.git
cd firmware-analysis-toolkit
./setup.sh
vi fat.config # Modify to your sudo password.
Em seguida, copiamos o binário do firmware (o que baixamos do fabricante) para a pasta do FAT em nossa máquina Kali e o executamos.
./fat.py DSL-3782_A1_EU_1.01_07282016.bin
Nota: Durante o processo de configuração do FAT, podemos encontrar erros. Ele pode dizer que não há libmagic.

Basta executar
pip unistall python-magic
pip install python-magic
Isso deve resolver o seu problema; em seguida, executamos o comando de compilação novamente. Agora deve funcionar perfeitamente.

Pressione Enter para executar. O processo de emulação deve funcionar bem, e você pode acessar http://192.168.1.1 (na máquina Kali) para verificar se funciona.

Você também pode fazer login no console se tiver as credenciais. Aqui está admin:admin.

Se você decidir desligar o firmware emulado, basta pressionar Ctrl+A X. Quando precisar executar novamente, não rode fat.py outra vez, pois o firmware já foi transformado em uma imagem. Você só precisa executar o script que já foi gerado.
cd firmadyne/scratch/<Image-ID>
./run.sh

Compile gdbserver para fins de depuração. Existem muitas maneiras de compilar gdbserver. Você também pode baixar um servidor compilado estaticamente. Há um repositório que armazena alguns binários compilados estaticamente. No entanto, prefiro compilar o gdbserver eu mesmo, pois os do repositório do GitHub são bastante antigos e podem apresentar problemas de compatibilidade.