Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2023-27216 — Abordagem de iniciante para hacking de firmware | Kitploit
Ferramentas/GitHubGitHub/hoangrealer/cve-2023-27216
Segurança de Sistemas EmbarcadosSegurança IoTAnálise de VulnerabilidadesEngenharia ReversaDepuradoresHacking de HardwareAprendizado e EducaçãoAnálise de FirmwareExploração de Binários
GitHubhoangrealer/cve-2023-27216

CVE-2023-27216

Abordagem de iniciante para hacking de firmware

33há 2 anosAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório

CVE-2023-27216 - Roteador D-Link

Este documento é o relato da minha experiência pessoal como novato em engenharia reversa e exploração de firmware. Firmware onde??

Escopo

Para demonstração, analisaremos e reproduziremos a CVE-2023-27216.

  • Número do CVE: CVE-2023-27216
  • Descrição da vulnerabilidade: Um problema encontrado no D-Link DSL-3782 v.1.03 permite que usuários autenticados remotos executem código arbitrário - como root - por meio da página de configurações de rede.
  • Modelo do equipamento: D-Link DSL-3782
  • Versão do firmware: DSL-3782_A1_EU_1.01
  • Site oficial do fabricante: http://www.dlink.com.cn/
  • Endereço do firmware: https://media.dlink.eu/support/products/dsl/dsl-3782/driver_software/dsl-3782_a1_eu_1.01_07282016.zip

Tarefas

Para explorar qualquer firmware, existem os seguintes passos:

  • Obter os firmwares. Existem 2 maneiras: extraí-los diretamente do hardware (câmera, roteador, impressora, etc.) ou você pode obtê-los no site do fabricante. Isso será discutido em outro documento.
  • Analisar o firmware e encontrar vulnerabilidades
  • Emular o firmware.
  • Compilar gdbserver estaticamente para depurar.

Análise do firmware

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:

  • Binwalk para analisar e extrair o firmware
  • Como emular: https://boschko.ca/qemu-emulating-firmware/ Binwalk verifica assinatura

Extrair arquivos importantes

Extraia o firmware usando o binwalk: binwalk -Me DSL-3782_A1_EU_1.01_07282016.bin Extração com Binwalk

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

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 😅.

Analisar como o firmware funciona

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> Arquitetura do firmware

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 inicia
  • usr/etc/passwd => Este é o arquivo que contém as informações dos usuários
  • userfs/romfile.cfg => Existe uma credencial admin:admin

Verifiquei o arquivo rcS e encontrei um código interessante:

root@kitploit:~
echo "admin:$1$$iC.dUsGpxNNJGeOm1dFio/:0:0:root:/:/bin/sh" > /usr/etc/passwd
  • Este código é usado para gravar as informações do usuário no arquivo passwd
  • Executa um servidor web chamado boa server. O Boa é 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. Inicialização do Boa

Emulação completa do firmware

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:

  • QEMU => Não reinvente a roda 🙏 🛐
  • FAT - Firmware-analysis-toolkit => Funciona, você pode ler o código-fonte para saber o que ele faz.

Persista

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á.

root@kitploit:~
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.

root@kitploit:~
./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. Falha na execução do Fat

Basta executar

root@kitploit:~
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.

Execução do Fat bem-sucedida

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.

Página principal do roteador

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

Login no console

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.

root@kitploit:~
cd firmadyne/scratch/<Image-ID>
./run.sh

Reexecutar a imagem

Depurador

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.

Consulte esta postagem do blog como referência: https://sheran.sg/blog/cross-compile-gdb-for-mips/. O blog foi publicado em 30 de julho de 2024, pouco antes deste projeto, então funciona perfeitamente. Nota: O blog foi feito para MIPS x32 LSB, mas precisamos de MIPS x32 MSB. Precisamos mudar mipsel-linux-gnu para mips-linux-gnu.

Passos de compilação

Precisamos instalar a toolchain para MIPS. Felizmente, o pacote do Debian já a possui.

root@kitploit:~
**apt update && apt upgrade -y
apt install -y build-essential m4 gcc-mips-linux-gnu g++-mips-linux-gnu**

Para compilar gdbserver para MIPS, há alguns pacotes que precisamos compilar e instalar. Aqui está onde obtenho o código-fonte.

  1. gdb 15.1 - https://sourceware.org/pub/gdb/releases/gdb-15.1.tar.xz
  2. GNU GMP lib v6.3.0 - https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz
  3. GNU MPFR lib v4.2.1 - https://www.mpfr.org/mpfr-current/mpfr-4.2.1.tar.xz

Obtenha o código-fonte

root@kitploit:~
wget https://sourceware.org/pub/gdb/releases/gdb-15.1.tar.xz
wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz
wget https://www.mpfr.org/mpfr-current/mpfr-4.2.1.tar.xz

Compile as bibliotecas com a toolchain É crucial ter privilégio de root ao compilar essas bibliotecas. Primeiro precisamos compilar a GMP, pois ela é um requisito para compilar a MPFR.

root@kitploit:~
tar xvf gmp-6.3.0.tar.xz && cd gmp-6.3.0
./configure --host=mips-linux-gnu
make -j$((`nproc`+1))
make install
cd ..

Depois compilamos a MPFR:

root@kitploit:~
tar xvf mpfr-4.2.1.tar.xz && cd mpfr-4.2.1
./configure --host=mipsel-linux-gnu --with-gmp-build=<YOUR-FOLDER>/gmp-6.3.0
make -j$((`nproc`+1))
make install
cd ..

Agora podemos finalmente compilar o gdbserver:

root@kitploit:~
tar xvf gdb-15.1.tar.xz && cd gdb-15.1
./configure --host=mipsel-linux-gnu --with-gmp-lib=/usr/local/lib --with-mpfr-lib=/usr/local/lib --with-gmp-include=<YOUR-FOLDER>/gmp-6.3.0 --with-mpfr-include=<YOUR-FOLDER>/mpfr-4.2.1/src
make -j$((`nproc`+1)) LDFLAGS=-static

O binário compilado gdbserver deve estar na pasta gdb-15.1/gdbserver.

Enviar gdbserver para a imagem do firmware

O firmware emulado não possui wget, nc, curl, /dev/tcp, ... Não podemos hospedar um servidor HTTP Python para transferir arquivos. Também não temos ssh. No entanto, ainda podemos colocar nosso gdbserver na máquina emulada montando a imagem.

  • sudo ./scripts/mount.sh 1
  • Copie o gdbserver compilado estaticamente para qualquer lugar na pasta montada.
  • sudo ./scripts/umount.sh 1
  • Reinicie o qemu (execute ./run.sh novamente apenas para garantir).

Enviar gdbserver para a imagem

Testar gdbserver

Encaminhamento de portas

A partir de agora, você pode realizar depuração e hacking dentro da máquina Kali. No entanto, podemos ir além, encaminhando as portas da máquina emulada para nossa máquina host (Windows ou Mac).

Inspecionar nossa rede

Vamos primeiro verificar a rede usando ifconfig. ifconfig

O resultado nos mostra que existem 2 interfaces: eth0 e tap1_0. Pelo que sabemos, a interface eth0 é a rede compartilhada com o host, e tap1_0 é a interface da máquina de firmware emulada.

Para facilitar o entendimento, a rede eth0 é como uma rede pública, onde podemos acessar a máquina Kali a partir do host. A tap1_0 é como uma rede privada, onde só podemos acessar a partir da máquina Kali. Precisamos encaminhar a conexão de eth0 para a porta 192.168.1.1:80 na interface tap1_0.

Permitir encaminhamento de portas

Existem muitas ferramentas que podem nos ajudar com isso. No entanto, iptables parece funcionar melhor, se você souber como configurá-lo, é claro.

Devemos permitir o encaminhamento de portas primeiro. Execute este comando:

root@kitploit:~
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Isso se aplica apenas a uma sessão. Se quiser aplicar permanentemente, modifique o conteúdo de /etc/sysctl.conf.

root@kitploit:~
net.ipv4.ip_forward=1 # Find this line, uncomment it.

Salve e feche o arquivo quando terminar.

Em seguida, aplique as configurações deste arquivo. Execute o seguinte comando:

root@kitploit:~
sudo sysctl -p
sudo sysctl --system

Encaminhamento de portas com iptables

Normalmente, podemos executar vários comandos iptables. Mas seria tedioso demais 😵‍💫. Podemos instalar a ferramenta iptables-persistent. Ela permite gravar um arquivo de configuração, carregá-lo em um arquivo ou extrair chains para um arquivo. Tudo pode ser feito rapidamente.

root@kitploit:~
apt install iptables-persistent

O arquivo de configuração que queremos modificar aqui é /etc/iptables/rules.v4. Alteramos o conteúdo do arquivo para o conteúdo abaixo.

root@kitploit:~
*filter
:INPUT ACCEPT [37:22880]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [35:2330]
# Forward HTTP Port
-A FORWARD -i eth0 -o tap1_0 -p tcp --dport 80 -d 192.168.1.1 -j ACCEPT
-A FORWARD -i tap1_0 -o eth0 -p tcp --sport 80 -s 192.168.1.1 -j ACCEPT
# Forward Debugger port
-A FORWARD -i eth0 -o tap1_0 -p tcp --dport 31337 -d 192.168.1.1 -j ACCEPT
-A FORWARD -i tap1_0 -o eth0 -p tcp --sport 31337 -s 192.168.1.1 -j ACCEPT

COMMIT
# Completed on Wed Aug  7 09:32:11 2024
# Generated by iptables-save v1.8.10 (nf_tables) on Wed Aug  7 09:32:11 2024
*nat
:PREROUTING ACCEPT [60:5405]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [1096:50947]
-A PREROUTING -i eth0 -p tcp -j DNAT --to-destination 192.168.1.1
-A POSTROUTING -o tap1_0 -p tcp -d 192.168.1.1 -j MASQUERADE

Atenção: Permitir todas as portas gera uma série de problemas de segurança. Recomenda-se DROP em todas as portas e depois apenas FORWARD para algumas, de acordo com sua necessidade.

Salve e renove a chain do iptables.

root@kitploit:~
service netfilter-persistent reload

Agora você pode acessá-lo de fora do host. Acesso externo ao host

Vulnerabilidades

Existem vários endpoints para explorar. Dois deles estão dentro do binário cfg_manager. Vou demonstrar apenas um deles; o outro deixo para você descobrir sozinho.

Jogue o binário no seu decompilador favorito, procure por todos os comandos system, e você pode ver isto. O comando executa um arquivo chamado /etc/lanconfig.sh.

Comando system executa um arquivo

Procurando outros lugares que possam usar esse arquivo, encontrei um lugar onde podemos gravá-lo.

Gravação de arquivo

Explicando o que ele faz:

  • A função abre /etc/lanconfig.sh
  • Ela chama uma função mxmlElementGetAttr, que eu suponho que encontra um atributo de um objeto, podendo ser direta ou indiretamente de uma requisição HTTP, possivelmente XML.
  • Ela usa sprintf para criar uma string a partir dos atributos obtidos de mxmlElementGetAttr.
  • Em seguida, usa fputs para gravar no arquivo.

Imediatamente, procurei por qualquer coisa na pasta web boaroot relacionada a IP, netmask e encontrei isto. A documentação do servidor web Boa é extremamente limitada; só posso supor que ele coloca o parâmetro POST lan_ip1 nos parâmetros IP de um XML que é chamado pelo binário.

Ponto de entrada do bug

Na interface, podemos encontrar a requisição que aciona o bug. Ela está em Settings > Network.

Localização da configuração de rede Interface de configuração de rede

Intercepte a requisição com o Burpsuite quando pressionarmos Save.

Interceptação e ataque com Burp

O payload 192.168.1.1;utelnetd -p 8090 -l /bin/sh; é um reverse shell. Podemos executá-lo e nos conectar a ele.

alt text

Bônus

Semelhante, pode ser melhor que o FAT, ainda não testei -> FirmAE.

O Binary Ninja custa apenas 74$ se você tiver status de estudante. A licença pode ser compartilhada com qualquer pessoa.

Outros bugs relacionados ao CVE:

CVE

Isso também pode levar a RCE; deixarei você fazer isso sozinho. A memória nesse local data_4c0160 pode ser injetada em algum lugar 🫡.

CVE2

Obrigado

Referências

  • https://bbs.kanxue.com/thread-278413.htm
  • https://secnigma.wordpress.com/2022/01/18/a-beginners-guide-into-router-hacking-and-firmware-emulation/
  • https://www.ringzerolabs.com/2018/03/the-wonderful-world-of-mips.html
  • https://sheran.sg/blog/cross-compile-gdb-for-mips/
  • https://boschko.ca/qemu-emulating-firmware/
  • https://wiki.bi0s.in/hardware/firmware/firmware-re/
  • https://www.digitalocean.com/community/tutorials/how-to-forward-ports-through-a-linux-gateway-with-iptables
  • https://www.youtube.com/watch?v=7W5YC8kenZE
Baixar ferramenta