
A capacidade de fazer o downgrade remoto de dispositivos baseados no RouterOS (Mikrotik) coloca centenas de milhares de dispositivos de rede em risco. A vulnerabilidade está associada ao envenenamento do cache DNS do protocolo Winbox e permite o download desatualizado (com redefinição da senha por padrão) ou firmware modificado no dispositivo.

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

Esta solicitação é processada por um resolvedor binário chamado. O resolvedor é um dos muitos binários conectados ao protocolo RouterOS Winbox. Em um nível alto, as “mensagens” enviadas à porta Winbox podem ser roteadas para vários binários no RouterOS, com base em um esquema de numeração baseado em matriz.
Por padrão, o RouterOS tem o recurso de servidor DNS desativado.

No entanto, mesmo com a função do 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 armazena em cache o resultado.

Como podemos especificar o servidor DNS pelo qual a solicitação deve passar, inserir os endereços incorretos é trivial. Por exemplo, você pode configurar a implementação do servidor DNS de
Philip Klaus 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("---- Reply:\n", reply) return reply.pack()
Agora, se você procurar example.com usando o Winbox, poderá ver que o cache DNS do roteador foi envenenado.

Obviamente, envenenar example.com não é muito útil, pois o roteador não o utilizará de fato. No entanto, o roteador precisa ter acesso a upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com e download.mikrotik.com. E graças a outro erro, é possível envenená-los todos de uma 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 roteador solicita uma permissão e fornecemos cinco de volta. O roteador armazena em cache todas essas respostas incorretamente.

Obviamente, esse ataque também é útil se o roteador atua como um servidor DNS, pois permite atacar os clientes do roteador.
Esse ataque também permite explorar uma vulnerabilidade mais séria: fazer o downgrade ou o backport da versão do RouterOS. O invasor recria a lógica do servidor de atualizações, incluindo o log de alterações, e força o RouterOS a aceitar a versão desatualizada (vulnerável) como atual. O perigo aqui reside no fato de que, ao "atualizar" a versão, a senha do administrador é redefinida para o valor padrão - um invasor pode fazer login no sistema com uma senha vazia!
O ataque está funcionando, apesar do
autor implementar vários outros vetores, incluindo os relacionados à
incorporação de uma backdoor no firmware , mas essa já é uma técnica redundante e é ilegal usá-lo para fins ilegítimos.
Protecção
Simplesmente desabilitar o Winbox protege contra esses ataques. Apesar da conveniência de administrar através do Winbox, é melhor usar o protocolo SSH.