La capacidad de degradar de forma remota dispositivos basados en RouterOS (Mikrotik) pone en riesgo cientos de miles de dispositivos de red. La vulnerabilidad está asociada con el envenenamiento del caché DNS del protocolo Winbox y le permite cargar firmware desactualizado (con un restablecimiento de contraseña predeterminado) o modificado en el dispositivo.
Detalles de vulnerabilidad
El terminal RouterOS admite el comando de resolución para la búsqueda de DNS.
Esta solicitud es manejada por un binario llamado resolutor. Resolver es uno de los muchos binarios que se conectan al protocolo Winbox de RouterOS. En un nivel alto, los "mensajes" enviados al puerto de Winbox se pueden enrutar a varios archivos binarios en RouterOS según un esquema de numeración basado en matrices.
De forma predeterminada, RouterOS tiene la función del servidor DNS deshabilitada.
Sin embargo, incluso cuando la función del servidor está desactivada, el enrutador mantiene su propia caché DNS.
Cuando realizamos una solicitud usando winbox_dns_request, por ejemplo, example.com, el enrutador almacenará en caché el resultado.
Dado que podemos especificar el servidor DNS a través del cual debe pasar la solicitud, ingresar direcciones incorrectas es trivial. Por ejemplo, puede configurar una implementación de servidor DNS desde
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 ejemplo.com usando Winbox, puede ver que la caché DNS del enrutador está envenenada.
Por supuesto, envenenar example.com no es muy útil ya que el enrutador realmente no lo usará. Sin embargo, el enrutador necesita acceder a update.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 concedemos cinco. El enrutador no almacena en caché todas estas respuestas correctamente.
Evidentemente, este ataque también es útil si el router actúa como servidor DNS, ya que permite atacar a los clientes del router.
Este ataque también le permite explotar una vulnerabilidad más grave: degradar o actualizar 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 percibir la versión obsoleta (vulnerable) como actual. El peligro aquí radica en el hecho de que cuando se "actualiza" 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 de que
Защита
Simplemente deshabilitar Winbox le permite protegerse de estos ataques. A pesar de la comodidad de la administración a través de Winbox, es mejor utilizar el protocolo SSH.
Fuente: habr.com