
Análisis y PoC para CVE-2018-14847, vulnerabilidad de divulgación de información en Winbox de MikroTik RouterOS que permite acceso de lectura no autenticado a la base de datos de credenciales.
Recorrido de ruta no autenticado en el protocolo Winbox de MikroTik que filtra credenciales de administrador de /flash/rw/store/user.dat
CVE-2018-14847 es una vulnerabilidad de recorrido de ruta en MikroTik RouterOS que afecta al protocolo de gestión Winbox (puerto TCP 8291). Un atacante remoto no autenticado puede leer archivos arbitrarios del sistema de archivos del router, incluyendo la base de datos de credenciales de usuario /flash/rw/store/user.dat, que almacena contraseñas cifradas con una clave XOR estática débil.
La vulnerabilidad fue revelada originalmente por Jacob Baines (Tenable) en julio de 2018 a través del exploit By the Way. Este repositorio contiene una reimplementación independiente en Python3 con documentación completa del protocolo.
| Canal | Versiones |
|---|
| Largo plazo | 6.30.1 - 6.40.7 |
| Estable | 6.29 - 6.42 |
| Beta | 6.29rc1 - 6.43rc3 |
MikroTik parcheó esta vulnerabilidad en abril de 2018. Los dispositivos que ejecutan RouterOS anteriores a las versiones corregidas siguen siendo vulnerables.
Winbox es el protocolo de gestión binario propietario de MikroTik que se ejecuta en el puerto TCP 8291. Las tramas se estructuran como:
[total_len - 2][0x01][0x00][total_len - 4]["M2"][fields...]
El encabezado de 4 bytes codifica el tamaño total de la trama. No es un u16 estándar little-endian: cada byte codifica total_length - 2 y total_length - 4 de forma independiente.
Codificación de campos dentro de cada trama:
| Byte de tipo | Significado | Valor |
|---|---|---|
| 0xff | Marcador de campo extendido | seguido de field_id y valor |
| 0x09 | Entero u8 | 1 byte |
| 0x21 | Cadena | Prefijo de longitud de 1 byte + datos |
| 0x88 | Marcador de respuesta esperada | sin valor |
| 0xfe | ID de campo extendido | ID de 3 bytes + tipo + valor |
El manejador del sistema de archivos reside en el endpoint (sys=5, handler=0) y expone tres comandos relevantes:
El manejador del sistema de archivos de Winbox no desinfecta la ruta pasada al comando de abrir archivo. Al incrustar secuencias '/////./../', un atacante escapa del límite del sandbox y alcanza el sistema de archivos raíz:
/////./..//////./..//////./../flash/rw/store/user.dat
Cada segmento '/////./../' (10 bytes) sube un nivel de directorio. Tres segmentos alcanzan la raíz, después de lo cual flash/rw/store/user.dat es la base de datos de credenciales de usuario de RouterOS. La solicitud no requiere autenticación.
El exploit envía dos tramas:
user.dat es una secuencia de registros nv::message. Cada registro está precedido por un campo de longitud LE de 2 bytes y comienza con los bytes mágicos M2. Los campos dentro de cada registro usan un ID de campo LE de 3 bytes:
| ID de campo | Tipo | Significado |
|---|
| 0x01 | cadena | nombre de usuario |
| 0x02 | u8 | grupo - 3 = acceso completo de administrador |
| 0x11 | cadena | contraseña cifrada (vacía si no se establece) |
Las contraseñas se cifran con una clave XOR estática derivada de un salt hardcodeado compilado en RouterOS:
key = MD5(username + "283i4jfkai3389")
password = XOR(encrypted_pass[i], key[i % len(key)]) hasta el byte nulo
Esto significa que cualquier user.dat extraído de cualquier dispositivo afectado puede descifrarse sin conexión sin fuerza bruta.
Después de obtener la contraseña de administrador, el atacante puede autenticarse a través de Winbox y usar el comando de crear archivo para escribir dos archivos que activan el inicio de sesión de desarrollador oculto:
/pckg/option activa el paquete option
/flash/nova/etc/devel-login habilita el usuario devel
Una vez que estos archivos existen, el router expone un shell root BusyBox a través de Telnet y SSH bajo el usuario devel, usando la contraseña del administrador.
Telnet debe conectarse primero para que SSH funcione en algunas versiones de RouterOS.
Exploit_CVE_2018_14847.py es un exploit Python3 autónomo con cero dependencias externas. Implementa el protocolo binario Winbox desde cero y realiza:
# Default port 8291
python3 Exploit_CVE_2018_14847.py 192.168.1.10
# Custom port
python3 Exploit_CVE_2018_14847.py 192.168.1.10 8291
Post-explotación - shell de puerta trasera de desarrollador:
# Telnet (must connect first)
telnet -l devel 192.168.1.10
# SSH (after Telnet session)
ssh -oHostKeyAlgorithms=+ssh-dss [email protected]
Aviso de seguridad de MikroTik