
La possibilità di downgradare dispositivi basati su RouterOS (Mikrotik) da remoto mette a rischio centinaia di migliaia di dispositivi di rete. La vulnerabilità è legata all'avvelenamento della cache DNS del protocollo Winbox e consente di caricare un firmware obsoleto (con reset della password "di default") o modificato sul dispositivo.

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

Questa richiesta è gestita da un file binario chiamato resolver. Il resolver è uno dei tanti file binari collegati al protocollo Winbox di RouterOS. A un livello alto, i "messaggi" inviati alla porta Winbox possono essere instradati a vari file binari in RouterOS in base a uno schema di numerazione basato su array.
Per impostazione predefinita, la funzione del server DNS è disabilitata in RouterOS.

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

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

Poiché possiamo specificare il server DNS attraverso il quale deve passare la richiesta, è banale inserire indirizzi errati. Ad esempio, si può 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 cerchiamo example.com tramite Winbox, possiamo vedere che la cache DNS del router è avvelenata.

Certo, l'avvelenamento di example.com non è molto utile, poiché il router non lo utilizzerà effettivamente. Tuttavia, il router necessita di contattare upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com e download.mikrotik.com. E grazie a un'altra vulnerabilità, 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, ma noi ne forniamo cinque in cambio. Il router memorizza nella cache tutte queste risposte in modo errato.

È chiaro che questo attacco è utile anche se il router funge da server DNS, poiché consente di attaccare i clienti del router.
Inoltre, questo attacco consente di sfruttare una vulnerabilità più grave: effettuare un downgrade o un backport della versione di RouterOS. L'attaccante ricrea la logica del server di aggiornamento, incluso il changelog, e costringe RouterOS a considerare una versione obsoleta (vulnerabile) come attuale. Qui il pericolo risiede nel fatto che durante l'"aggiornamento" della versione, la password dell'amministratore viene reimpostata su "predefinita" — un malintenzionato può accedere al sistema con una password vuota!

L'attacco funziona, anche se implementa ulteriori vettori, che includono anche , ma questa è già una tecnica superflua e il suo utilizzo per scopi illeciti è contro la legge.
Protezione
La semplice disattivazione di Winbox consente di proteggersi da questi attacchi. Nonostante la comodità di amministrazione tramite Winbox, è meglio utilizzare il protocollo SSH.
Fonte: habr.com
