La possibilità di effettuare il downgrade da remoto dei dispositivi basati su RouterOS (Mikrotik) mette a rischio centinaia di migliaia di dispositivi di rete. La vulnerabilità è associata all'avvelenamento della cache DNS del protocollo Winbox e consente di caricare sul dispositivo firmware obsoleti (con reimpostazione della password predefinita) o modificati.
Dettagli sulla vulnerabilità
Il terminale RouterOS supporta il comando di risoluzione per la ricerca DNS.
Questa richiesta è gestita da un binario chiamato risolutore. Resolver è uno dei tanti binari che si collegano al protocollo Winbox di RouterOS. Ad alto livello, i "messaggi" inviati alla porta Winbox possono essere instradati a vari binari in RouterOS in base a uno schema di numerazione basato su array.
Per impostazione predefinita, RouterOS ha la funzionalità del server DNS disabilitata.
Tuttavia, anche quando la funzione server è disattivata, il router mantiene la propria cache DNS.
Quando effettuiamo una richiesta utilizzando winbox_dns_request per esempio example.com, il router memorizzerà nella cache il risultato.
Poiché possiamo specificare il server DNS attraverso il quale deve passare la richiesta, inserire indirizzi errati è banale. Ad esempio, puoi configurare l'implementazione di un server DNS da
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 utilizzando Winbox, puoi vedere che la cache DNS del router è avvelenata.
Naturalmente, avvelenare example.com non è molto utile poiché il router non lo utilizzerà effettivamente. Tuttavia, il router deve accedere a upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com e download.mikrotik.com. E grazie a un altro errore è possibile avvelenarli tutti in una volta.
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 ne concediamo cinque. Il router non memorizza correttamente nella cache tutte queste risposte.
Ovviamente questo attacco è utile anche se il router funge da server DNS, poiché consente di attaccare i client del router.
Questo attacco permette anche di sfruttare una vulnerabilità più grave: effettuare il downgrade o il backport della versione di RouterOS. L'aggressore ricrea la logica del server di aggiornamento, incluso il registro delle modifiche, e costringe RouterOS a percepire la versione obsoleta (vulnerabile) come attuale. Il pericolo qui sta nel fatto che quando la versione viene "aggiornata", la password dell'amministratore viene ripristinata al valore predefinito: un utente malintenzionato può accedere al sistema con una password vuota!
L'attacco funziona abbastanza, nonostante ciò
protezione
La semplice disattivazione di Winbox ti consente di proteggerti da questi attacchi. Nonostante la comodità dell'amministrazione tramite Winbox, è preferibile utilizzare il protocollo SSH.
Fonte: habr.com