
La posibilidad de degradar remotamente dispositivos basados en RouterOS (Mikrotik) pone en riesgo cientos de miles de dispositivos de red. La vulnerabilidad está relacionada con el envenenamiento de la caché DNS del protocolo Winbox y permite cargar un firmware obsoleto (con la contraseña restablecida a 'por defecto') o modificado en el dispositivo.

Detalles de la vulnerabilidad
El terminal de RouterOS admite un comando de resolución para buscar DNS.

Esta solicitud es procesada por un archivo binario llamado resolver. Resolver es uno de los muchos archivos binarios que están conectados al protocolo Winbox de RouterOS. A un alto nivel, los 'mensajes' enviados al puerto de Winbox pueden ser enrutados a diferentes archivos binarios en RouterOS según un esquema de numeración basado en un array.
Por defecto, la función de servidor DNS está desactivada en RouterOS.

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

Cuando hacemos una consulta 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 consulta, ingresar direcciones incorrectas es trivial. Por ejemplo, se puede configurar la implementación del servidor DNS de , 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 buscamos example.com con Winbox, podemos ver que la caché DNS del enrutador está envenenada.

Por supuesto, envenenar example.com no es muy útil, ya que el enrutador en realidad no lo utilizará. Sin embargo, el enrutador necesita hacer consultas a upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com y download.mikrotik.com. Y gracias a otro error, hay posibilidad de 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 nosotros proporcionamos cinco a cambio. El enrutador almacena en caché incorrectamente todas estas respuestas.

Es evidente que este ataque también es útil si el enrutador actúa como servidor DNS, ya que permite atacar a los clientes del enrutador.
Este ataque también permite explotar una vulnerabilidad más grave: hacer un downgrade o backporting de la versión de RouterOS. El atacante recrea la lógica del servidor de actualizaciones, incluyendo el changelog, y engaña a RouterOS para que considere una versión obsoleta (vulnerable) como actual. El peligro aquí radica en que al "actualizar" la versión, la contraseña del administrador se restablece al valor "por defecto" — ¡un atacante puede iniciar sesión con una contraseña vacía!

El ataque es completamente funcional, a pesar de que implementa varios vectores adicionales relacionados, incluyendo , pero esto ya es una técnica excesiva y su uso para fines ilegítimos es ilegal.
Protección
Deshabilitar simplemente Winbox permite protegerse de estos ataques. A pesar de la conveniencia de la administración a través de Winbox, es mejor utilizar el protocolo SSH.
Fuente: habr.com
