
Vamos nos divertir explorando um firmware de roteador Zyxel e a MIPS Arch
Os tutoriais são apenas para fins informativos e educacionais. Acredito que hacking ético, segurança da informação e cibersegurança devem ser temas familiares a qualquer pessoa que utilize informações digitais e computadores. Acredito que é impossível se defender de hackers sem saber como o hacking é feito.
$ IDA Pro +7.0 (pode usar o Radar2, já que o IDA é bastante caro)
$ Roteador executando Rompager 4.07 : há uma quantidade imensa deles, como TP-Link TD-W8951*, ZyXEL P-660R, Billion BiPAC 51**/52**
$ UART para USB
A vulnerabilidade Misfortune Cookie existe há algum tempo, mas ainda faltam análises públicas que ilustrem os detalhes técnicos da vulnerabilidade. De acordo com a Check Point, o software afetado é o servidor web embarcado RomPager da AllegroSoft. Varreduras em toda a Internet sugerem que o RomPager é provavelmente o software de servidor web mais popular do mundo em número de endpoints disponíveis. O RomPager é tipicamente embutido no firmware que acompanha o dispositivo. Essa vulnerabilidade específica foi introduzida na base de código em 2002. Além disso, os dispositivos expostos são aqueles que usam serviços RomPager com versões anteriores à 4.34 (e especificamente 4.07).
Para este tutorial, usarei um ZXHN H108L que utiliza Rompager 4.07
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="ZXHN H108L"
Content-Type: text/html
Transfer-Encoding: chunked
Server: RomPager/4.07 UPnP/1.0
EXT:
Agora vamos usar a porta serial. Primeiro, precisamos determinar a taxa de baud.
$ sudo stty -F /dev/ttyUSB0
SAÍDA :
speed 115200 baud; line = 0;
-brkint -imaxbel
device
Eu uso o minicom; você pode usar qualquer coisa, desde screen até HyperTerminal, mas prefiro este pela sua estabilidade ;)
$ sudo minicom -s
+-----------------------------------------------------------------------+
| A - Dispositivo Serial : /dev/modem |
| B - Local do Arquivo de Bloqueio : /var/lock |
| C - Programa de Chamada : |
| D - Programa de Chamada a Cobrar : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Controle de Fluxo por Hardware : Não |
| G - Controle de Fluxo por Software : Não |
| |
| Alterar qual configuração? |
+-----------------------------------------------------------------------+
| Tela e teclado |
| Salvar configuração como dfl |
| Salvar configuração como.. |
| Sair |
| Sair do Minicom |
+--------------------------+
Agora estamos prontos:
$ sudo minicom -D /dev/ttyUSB0 -b 115200
Bootbase Version: VTC_SPI1.26 | 2012/12/26 16:00:00
RAM: Size = 8192 Kbytes
Found SPI Flash 2MiB GD25Q16 at 0xbfc00000
SPI Flash Quad Enable
Turn off Quad Mode
RAS Version: ZXHN H108LV4.0.0a_ZRQ_MA
System ID: $2.12.162.0(G94.BY.2)3.20.19.0| 2014/03/21 20140321_v006 | 2014
Press any key to enter debug mode within 3 seconds.
..........
Para mostrar os comandos possíveis:
$ ATHE
======= Lista de Comandos de Depuração =======
AT apenas responder OK
ATHE exibir ajuda
ATBAx alterar baudrate. 1:38.4k, 2:19.2k, 3:9.6k 4:57.6k 5:115.2k
ATENx,(y) definir BootExtension Debug Flag (y=senha)
ATSE mostrar a seed do gerador de senhas
ATTI(h,m,s) alterar hora do sistema para hora:min:seg ou mostrar hora atual
ATDA(y,m,d) alterar data do sistema para ano/mês/dia ou mostrar data atual
ATDS despejar pilha RAS
ATDT despejar Área Comum do Módulo de Inicialização
ATDUx,y despejar conteúdo da memória do endereço x pelo comprimento y
ATRBx exibir o valor de 8 bits do endereço x
ATRWx exibir o valor de 16 bits do endereço x
ATRLx exibir o valor de 32 bits do endereço x
ATGO(x) executar programa no endereço x ou iniciar roteador
ATGR iniciar roteador
ATGT executar Programa de Teste de Hardware
ATRTw,x,y(,z) teste de RAM nível w, do endereço x até y (z iterações)
ATSH despejar dados relacionados ao fabricante na ROM
ATDOx,y baixar do endereço x pelo comprimento y para o PC via XMODEM
ATTD baixar configuração do roteador para o PC via XMODEM
ATUR enviar firmware do roteador para a flash ROM
< pressione qualquer tecla para continuar >
Este firmware possui um conjunto de comandos ocultos muito úteis para nossa análise dinâmica. O problema é que não podemos ver os registradores nem definir pontos de interrupção, mas, com sorte, com esses comandos ocultos teremos esses recursos. Para vê-los e usá-los, precisamos usar o ATEN. No entanto, este comando requer uma senha. O que podemos fazer agora? Vamos fazer engenharia reversa do firmware para encontrar o algoritmo do gerador de senhas.
(Análise estática) Vamos primeiro ver o arquivo do firmware:
$ binwalk ras
binwalk1
$ dd if=ras of=rom1.lzma bs=1 skip=85043 count=66696
$ dd if=ras of=rom2.lzma bs=1 skip=350259 count=3350556
$ lzma -d <rom1.lzma> rom1
$ lzma -d <rom2.lzma> rom2
Vamos ver agora a assinatura nos arquivos extraídos:
$ binwalk -Y rom1
DECIMAL HEXADECIMAL DESCRIÇÃO
--------------------------------------------------------------------------------
0 0x0 Código executável MIPS, 32/64 bits, big endian, pelo menos 1250 instruções válidas
string é uma ótima ferramenta para ter uma ideia do que é um arquivo binário ou o que ele contém. Vamos ver se conseguimos encontrar o algoritmo da senha:
$ strings rom1 | grep -i aten
$ strings rom2 | grep -i aten
Aparentemente, não conseguimos vê-lo porque o firmware ainda está comprimido, o que significa que devemos extraí-lo do roteador usando o modo de depuração:
$ ATDO bfc00000, 1f0000
xmodem
A primeira coisa que vem à mente é começar a procurar uma tabela de despacho. Por quê? Apenas intuição; a única alternativa é if-elif, mas seria um conjunto longo deles para verificar a validade da senha fornecida pelo usuário. E aqui está o que encontrei:
ROM:800158A0 CmdTable: .word unk_80015C20 # DATA XREF: sub_8000E3D8+4Co
ROM:800158A0 # sub_8000E3D8+90o ...
ROM:800158A4 .word sub_8000E6D0
ROM:800158A8 .byte 0
ROM:800158A9 .byte 0
ROM:800158AA .byte 0
ROM:800158AB .byte 0
ROM:800158AC .word aJustAnswerOk # " just answer OK"
ROM:800158B0 .word aAthe # "ATHE"
ROM:800158B4 .word CMD_SHOW_HELP_ATHE
ROM:800158B8 .byte 0
ROM:800158B9 .byte 0
ROM:800158BA .byte 0
ROM:800158BB .byte 0
ROM:800158BC .word aPrintHelp # " print help"
ROM:800158C0 .word aAtba # "ATBA"
ROM:800158C4 .word CMD_ATBA
...
ROM:800158D0 .word aAten # "ATEN"
ROM:800158D4 .word CMD_ATEN
Lembre-se de que a palavra MIPS tem 4 bytes. Agora vamos ver o CMD_ATEN:
ROM:8000FF84 lw $a0, 8($s0)
ROM:8000FF88 jal sub_80013654
ROM:8000FF8C li $a1, 0
ROM:8000FF90 jal passwd_generator
e agora: passwd_generator