Galimybė nuotoliniu būdu atnaujinti įrenginius, pagrįstus RouterOS (Mikrotik), kelia pavojų šimtams tūkstančių tinklo įrenginių. Pažeidžiamumas yra susijęs su „Winbox“ protokolo DNS talpyklos apsinuodijimu ir leidžia į įrenginį įkelti pasenusią (su numatytuoju slaptažodžio nustatymu iš naujo) arba pakeistą programinę-aparatinę įrangą.
Išsami informacija apie pažeidžiamumą
„RouterOS“ terminalas palaiko DNS paieškos išsprendimo komandą.
Šią užklausą apdoroja dvejetainis failas, vadinamas „resolver“. „Resolver“ yra vienas iš daugelio dvejetainių failų, kurie jungiasi prie „RouterOS“ „Winbox“ protokolo. Esant aukštam lygiui, „pranešimai“, siunčiami į „Winbox“ prievadą, gali būti nukreipti į įvairius RouterOS dvejetainius failus, remiantis masyvo numeravimo schema.
Pagal numatytuosius nustatymus RouterOS DNS serverio funkcija yra išjungta.
Tačiau net ir išjungus serverio funkciją, maršrutizatorius išlaiko savo DNS talpyklą.
Kai pateikiame užklausą naudodami winbox_dns_request, pvz., example.com, maršrutizatorius išsaugos rezultatą talpykloje.
Kadangi galime nurodyti DNS serverį, per kurį turi būti pateikta užklausa, neteisingų adresų įvedimas yra nereikšmingas. Pavyzdžiui, galite sukonfigūruoti DNS serverio diegimą iš
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()
Dabar, jei ieškote example.com naudodami Winbox, pamatysite, kad maršrutizatoriaus DNS talpykla yra užnuodyta.
Žinoma, apsinuodijimas example.com nėra labai naudingas, nes maršruto parinktuvas iš tikrųjų jo nenaudos. Tačiau maršrutizatorius turi pasiekti upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com ir download.mikrotik.com. O dar vienos klaidos dėka galima visus iš karto nunuodyti.
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()
Maršrutizatorius prašo vieno leidimo, o mes grąžiname penkis. Maršrutizatorius netinkamai talpina visus šiuos atsakymus.
Akivaizdu, kad ši ataka taip pat naudinga, jei maršrutizatorius veikia kaip DNS serveris, nes leidžia užpulti maršrutizatoriaus klientus.
Ši ataka taip pat leidžia išnaudoti rimtesnį pažeidžiamumą: grąžinti RouterOS versiją arba grąžinti ją atgal. Užpuolikas atkuria naujinimo serverio logiką, įskaitant pakeitimų žurnalą, ir priverčia RouterOS suvokti pasenusią (pažeidžiamą) versiją kaip naujausią. Pavojus čia slypi tame, kad „atnaujinus“ versiją, administratoriaus slaptažodis iš naujo nustatomas į numatytąją reikšmę - užpuolikas gali prisijungti prie sistemos tuščiu slaptažodžiu!
Nepaisant to, puolimas yra gana veiksmingas
apsauga
Tiesiog išjungę „Winbox“ galite apsisaugoti nuo šių atakų. Nepaisant administravimo per Winbox patogumo, geriau naudoti SSH protokolą.
Šaltinis: www.habr.com