
La possibilità di effettuare il downgrade remoto dei dispositivi basati su RouterOS (Mikrotik) mette a rischio centinaia di migliaia di dispositivi di rete. La vulnerabilità è legata al poisoning della cache DNS del protocollo Winbox e consente di caricare un firmware obsoleto (con reset della password a quella predefinita) o modificato sul dispositivo.

Dettagli sulla vulnerabilità
Il terminale RouterOS supporta il comando di risoluzione per cercare DNS.

Questa richiesta è gestita da un file binario chiamato resolver. Il resolver è uno dei molti file binari collegati al protocollo Winbox di RouterOS. A un livello alto, i 'messaggi' inviati alla porta Winbox possono essere instradati in diversi file binari in RouterOS basandosi su uno schema di numerazione array.
Per default, la funzione del server DNS è disabilitata in RouterOS.

Tuttavia, anche con la funzione del server disabilitata, il router mantiene la propria cache DNS.

Quando facciamo una richiesta, utilizzando winbox_dns_request, ad esempio, example.com, il router memorizzerà il risultato nella cache.

Poiché possiamo specificare il server DNS attraverso cui deve passare la richiesta, inserire indirizzi errati è banale. Ad esempio, è possibile configurare un'implementazione del server DNS di , per rispondere sempre con un record A contenente l'indirizzo 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()Ora, se cerchi example.com usando Winbox, puoi vedere che la cache DNS del router è stata avvelenata.

Certo, l'avvelenamento di example.com non è molto utile, poiché il router non lo utilizzerà effettivamente. Tuttavia, il router deve fare riferimento a upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com e download.mikrotik.com. E grazie a un altro errore, c'è la possibilità di avvelenarli tutti contemporaneamente.
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()Il router richiede un'autorizzazione e noi forniamo cinque risposte. Il router memorizza nella cache in modo errato tutte queste risposte.

È evidente che questo attacco è utile anche se il router funge da server DNS, poiché consente di attaccare i clienti del router.
Questo attacco permette anche di sfruttare una vulnerabilità più grave: eseguire il downgrade o il backporting della versione di RouterOS. L'attaccante ricrea la logica del server di aggiornamenti, incluso il changelog, e costringe RouterOS a percepire una versione obsoleta (vulnerabile) come attuale. Il pericolo qui è che durante l'"aggiornamento" della versione, la password dell'amministratore viene reimpostata sul valore "predefinito" — l'attaccante può accedere con una password vuota!

L'attacco funziona perfettamente, nonostante implementi anche altri vettori, compresi , ma questa è già una tecnica eccessiva e il suo utilizzo per scopi illegittimi è contro la legge.
Sicurezza
Disattivare Winbox è una semplice misura di protezione contro questi attacchi. Nonostante la facilità di gestione tramite Winbox, è consigliabile usare il protocollo SSH.
Fonte: habr.com
