
Análise e PoC para CVE-2018-14847, vulnerabilidade de divulgação de informações do MikroTik RouterOS Winbox permitindo acesso de leitura não autenticado ao banco de credenciais.
Path traversal não autenticado no protocolo Winbox da MikroTik que vaza credenciais de administrador de /flash/rw/store/user.dat
CVE-2018-14847 é uma vulnerabilidade de path traversal no MikroTik RouterOS que afeta o protocolo de gerenciamento Winbox (porta TCP 8291). Um atacante remoto não autenticado pode ler arquivos arbitrários do sistema de arquivos do roteador, incluindo o banco de dados de credenciais de usuário /flash/rw/store/user.dat, que armazena senhas criptografadas com uma chave XOR estática fraca.
A vulnerabilidade foi divulgada originalmente por Jacob Baines (Tenable) em julho de 2018 através do exploit By the Way. Este repositório contém uma reimplementação Python3 independente com documentação completa do protocolo.
| Canal | Versões |
|---|
| Longterm | 6.30.1 - 6.40.7 |
| Stable | 6.29 - 6.42 |
| Beta | 6.29rc1 - 6.43rc3 |
A MikroTik corrigiu esta vulnerabilidade em abril de 2018. Dispositivos executando RouterOS mais antigo que as versões corrigidas permanecem vulneráveis.
Winbox é o protocolo de gerenciamento binário proprietário da MikroTik executado na porta TCP 8291. Os quadros (frames) são estruturados como:
[total_len - 2][0x01][0x00][total_len - 4]["M2"][campos...]
O cabeçalho de 4 bytes codifica o tamanho total do quadro. Não é um u16 little-endian padrão - cada byte codifica total_length - 2 e total_length - 4 independentemente.
Codificação de campos dentro de cada quadro:
| Byte de tipo | Significado | Valor |
|---|---|---|
| 0xff | Marcador de campo estendido | seguido por field_id e valor |
| 0x09 | Inteiro u8 | 1 byte |
| 0x21 | String | prefixo de comprimento 1 byte + dados |
| 0x88 | Marcador de resposta esperada | sem valor |
| 0xfe | Id de campo estendido | id de 3 bytes + tipo + valor |
O manipulador do sistema de arquivos reside no endpoint (sys=5, handler=0) e expõe três comandos relevantes:
O manipulador do sistema de arquivos do Winbox não sanitiza o caminho passado ao comando de abrir arquivo. Ao incorporar sequências '/////./../', um atacante escapa do limite da sandbox e alcança o sistema de arquivos raiz:
/////./..//////./..//////./../flash/rw/store/user.dat
Cada segmento '/////./../' (10 bytes) sobe um nível de diretório. Três segmentos alcançam a raiz, após o qual flash/rw/store/user.dat é o banco de dados de credenciais de usuário do RouterOS. A requisição não requer autenticação.
O exploit envia dois quadros:
user.dat é uma sequência de registros nv::message. Cada registro é precedido por um campo de comprimento de 2 bytes LE e começa com os bytes mágicos M2. Campos dentro de cada registro usam um id de campo de 3 bytes LE:
| Id de campo | Tipo | Significado |
|---|
| 0x01 | string | nome de usuário |
| 0x02 | u8 | grupo - 3 = acesso total de administrador |
| 0x11 | string | senha criptografada (vazia se não definida) |
As senhas são criptografadas com uma chave XOR estática derivada de um salt hardcoded compilado no RouterOS:
chave = MD5(nome_de_usuário + "283i4jfkai3389")
senha = XOR(encrypted_pass[i], chave[i % len(chave)]) até byte nulo
Isso significa que qualquer user.dat extraído de qualquer dispositivo afetado pode ser descriptografado offline sem força bruta.
Após obter a senha do administrador, o atacante pode autenticar via Winbox e usar o comando de criar arquivo para escrever dois arquivos que ativam o login oculto de desenvolvedor:
/pckg/option ativa o pacote de opções
/flash/nova/etc/devel-login habilita o usuário devel
Uma vez que esses arquivos existam, o roteador expõe um shell BusyBox root via Telnet e SSH sob o usuário devel, usando a senha do administrador.
O Telnet deve ser conectado primeiro para que o SSH funcione em algumas versões do RouterOS.
Exploit_CVE_2018_14847.py é um exploit Python3 autossuficiente com zero dependências externas. Ele implementa o protocolo binário Winbox do zero e realiza:
# Porta padrão 8291
python3 Exploit_CVE_2018_14847.py 192.168.1.10
# Porta personalizada
python3 Exploit_CVE_2018_14847.py 192.168.1.10 8291
Pós-exploração - shell do backdoor do desenvolvedor:
# Telnet (deve conectar primeiro)
telnet -l devel 192.168.1.10
# SSH (após sessão Telnet)
ssh -oHostKeyAlgorithms=+ssh-dss [email protected]