Atualmente estou tentando fazer modificações no firmware de um roteador: Swisscom Centro Grande - também conhecido como Pirelli Vx226N1, versão de firmware: 60200.
Eu decompilei o arquivo com sucesso com o FMK v0.99 e obtive o header.img
, as partes rootfs.img
e footer.img
da imagem.
Esta é a binwalk de rootfs.img:
Squashfs filesystem, little endian, non-standard signature, version 4.0, compression:gzip, size: 2764423 bytes, 1145 inodes, blocksize: 65536 bytes, created: Fri Mar 15 00:33:08 2013
Eu decompilei o rootfs.img com unsquashfs com sucesso e obtive as pastas do sistema. Fiz algumas alterações (habilitei um shell no telnet) e tentei empacotar tudo com as ferramentas fornecidas (o comando ./build-firmware.sh
).
O tamanho final do firmware foi maior que o original.
Tentei piscar, nada aconteceu.
Eu analisei o firmware e especialmente o método de atualização para aprender a construir o firmware corretamente.
Eu encontrei o arquivo update.sh
que lida com o processo de atualização (analisa o arquivo fornecido pelo usuário e pisca somente se tudo estiver correto, a fim de evitar o brick)
Aqui está o link para o pastebin desse arquivo
Tenho certeza de que os arquivos originais do firmware são analisados através da função parse_yaps_image()
, então tentei me adaptar sozinho para verificar os arquivos, mas notei que havia uma verificação externa com um arquivo binário chamado sig_verify
Se os arquivos não existirem outra função é invocada, o problema é que a função fornecida não está correta (ela retorna um erro wrong validation token
mesmo com o firmware original!)
Meu objetivo é analisar o arquivo sig_verify
e procurar o algoritmo, a fim de entender o método de composição e para fazer o flash do meu roteador da maneira correta e finalmente obter o shell de root (e fazer modificações em tudo que eu quer)
Enviei todos os arquivos em uma Pasta Mega para que os caras interessados que quiserem me ajudar possam acessar qualquer arquivo necessário.
Eu incluí na pasta 60208 os dois scripts que usei para verificar os arquivos.
O resultado do script que escrevi (é apenas a adaptação do script no roteador) é este:
denys@denys-pc:~/Documents/router/Vx226N1/images/modified/60208$ ./check_upgrade_yaps.sh
Parsing YAPS format...
16+0 records in
16+0 records out
16 bytes (16 B) copied, 0.000843843 s, 19.0 kB/s
Error: wrong validation token (5b445d3b251d59753031c9d7a94ba4ab, 7d98668859855f1b9459256257fc3262)
E aqui está a binwalk do arquivo sig_verify
.
denys@denys-pc:~/Documents/router/Vx226N1/images/modified/60208$ binwalk sig_verify
DECIMAL HEX DESCRIPTION
-------------------------------------------------------------------------------------------------------
0 0x0 ELF 32-bit MSB executable, MIPS, version 1
1921 0x781 LZMA compressed data, properties: 0x01, dictionary size: 16777216 bytes, uncompressed size: 16777472 bytes
Como você pode perceber, é um executável MIPS .
Eu tentei executá-lo em um ambiente MIPS (máquina virtual, qemu-system-mips
) sem nenhum sucesso.
qemu-system-mips -M mips -kernel ./vmlinux-2.6.18-6-qemu -initrd ./initrd.gz -hda hda.img -append "root=/dev/ram console=ttyS0" -nographic
O kernel e o initrd foram baixados pelo link
Qualquer ajuda seria apreciada. Se algo não estiver claro, me avise:)