
La capacidad de degradar dispositivos remotamente basados en RouterOS (Mikrotik) pone en riesgo cientos de miles de dispositivos de red. La vulnerabilidad está asociada con el envenenamiento de la caché DNS del protocolo Winbox y permite la descarga de firmware obsoleto (con el restablecimiento de la contraseña de forma predeterminada) o modificado en el dispositivo.

Detalles de vulnerabilidad
El terminal RouterOS admite un comando de resolución para búsquedas de DNS.

Esta solicitud es procesada por un solucionador binario llamado. Resolver es uno de los muchos binarios que están conectados al protocolo RouterOS Winbox. A un alto nivel, los "mensajes" enviados al puerto de Winbox se pueden enrutar a varios binarios en RouterOS basados en un esquema de numeración basado en una matriz.
Por defecto, RouterOS tiene la función del servidor DNS deshabilitada.

Sin embargo, incluso con la función del servidor deshabilitada, el enrutador mantiene su propia caché de DNS.

Cuando realizamos una solicitud utilizando winbox_dns_request, por ejemplo, example.com, el enrutador almacenará en caché el resultado.

Como podemos especificar el servidor DNS a través del cual debe pasar la solicitud, ingresar las direcciones incorrectas es trivial. Por ejemplo, puede configurar la implementación del servidor DNS de
Philip Klaus para responder siempre con un registro A que contenga la dirección IP 192.168.88.250.
def dns_response(data): request = DNSRecord.parse(data) reply = DNSRecord(DNSHeader( id=request.header.id, qr=1, aa=1, ra=1), q=request.q) qname = request.q.qname qn = str(qname) reply.add_answer(RR(qn,ttl=30,rdata=A("192.168.88.250"))) print("---- Reply:\n", reply) return reply.pack()
Ahora, si busca example.com con Winbox, puede ver que la memoria caché DNS del enrutador ha sido envenenada.

Por supuesto, el envenenamiento example.com no es muy útil ya que el enrutador no lo usará realmente. Sin embargo, el enrutador necesita acceso a upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com y download.mikrotik.com. Y gracias a otro error, es posible envenenarlos a todos a la vez.
def dns_response(data): request = DNSRecord.parse(data) reply = DNSRecord(DNSHeader( id=request.header.id, qr=1, aa=1, ra=1), q=request.q) qname = request.q.qname qn = str(qname) reply.add_answer(RR(qn,ttl=30,rdata=A("192.168.88.250"))) reply.add_answer(RR("upgrade.mikrotik.com",ttl=604800, rdata=A("192.168.88.250"))) reply.add_answer(RR("cloud.mikrotik.com",ttl=604800, rdata=A("192.168.88.250"))) reply.add_answer(RR("cloud2.mikrotik.com",ttl=604800, rdata=A("192.168.88.250"))) reply.add_answer(RR("download.mikrotik.com",ttl=604800, rdata=A("192.168.88.250"))) print("---- Reply:\n", reply) return reply.pack()
El enrutador solicita un permiso, y le proporcionamos cinco de vuelta. El enrutador almacena en caché todas estas respuestas de forma incorrecta.

Obviamente, este ataque también es útil si el enrutador actúa como un servidor DNS, ya que permite atacar a los clientes del enrutador.
Este ataque también permite explotar una vulnerabilidad más grave: degradar o respaldar la versión de RouterOS. El atacante recrea la lógica del servidor de actualización, incluido el registro de cambios, y obliga a RouterOS a aceptar la versión desactualizada (vulnerable) como actual. El peligro aquí radica en el hecho de que al "actualizar" la versión, la contraseña del administrador se restablece al valor predeterminado: ¡un atacante puede iniciar sesión en el sistema con una contraseña vacía!
El ataque funciona bastante, a pesar del hecho de que el
autor implementa varios vectores más, incluidos los relacionados con la
integración de una puerta trasera en el firmware , pero esta es una técnica redundante y es ilegal usarla para fines ilegítimos.
Protección
Simplemente deshabilitar Winbox protege contra estos ataques. A pesar de la conveniencia de administrar a través de Winbox, es mejor usar el protocolo SSH.