Možnosť vzdialene downgradovať zariadenia založené na RouterOS (Mikrotik) vystavuje riziku státisíce sieťových zariadení. Zraniteľnosť súvisí s otravou vyrovnávacej pamäte DNS protokolu Winbox a umožňuje vám načítať zastaraný (s predvoleným resetovaním hesla) alebo upravený firmvér do zariadenia.
Podrobnosti o zraniteľnosti
Terminál RouterOS podporuje príkaz resolve pre vyhľadávanie DNS.
Túto požiadavku spracuje binárny program nazývaný resolver. Resolver je jedným z mnohých binárnych súborov, ktoré sa pripájajú k protokolu Winbox RouterOS. Na vysokej úrovni môžu byť „správy“ odoslané na port Winbox smerované do rôznych binárnych súborov v RouterOS na základe schémy číslovania založenej na poli.
V predvolenom nastavení má RouterOS funkciu servera DNS zakázanú.
Avšak aj keď je funkcia servera zakázaná, router si udržiava svoju vlastnú vyrovnávaciu pamäť DNS.
Keď zadáme požiadavku pomocou winbox_dns_request napríklad example.com, router uloží výsledok do vyrovnávacej pamäte.
Keďže vieme určiť DNS server, cez ktorý má požiadavka prejsť, zadanie nesprávnych adries je triviálne. Môžete napríklad nakonfigurovať implementáciu servera DNS z
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()
Ak teraz hľadáte example.com pomocou Winbox, môžete vidieť, že vyrovnávacia pamäť DNS smerovača je otrávená.
Samozrejme, otrava example.com nie je veľmi užitočná, pretože smerovač ju v skutočnosti nepoužije. Router však potrebuje prístup na upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com a download.mikrotik.com. A vďaka ďalšej chybe je možné otráviť ich všetky naraz.
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()
Smerovač požaduje jedno povolenie a my mu ich udeľujeme späť. Smerovač neukladá všetky tieto odpovede správne do vyrovnávacej pamäte.
Je zrejmé, že tento útok je užitočný aj vtedy, ak smerovač funguje ako server DNS, pretože umožňuje napadnutie klientov smerovača.
Tento útok vám tiež umožňuje zneužiť závažnejšiu zraniteľnosť: downgrade alebo backportovanie verzie RouterOS. Útočník znovu vytvorí logiku aktualizačného servera vrátane protokolu zmien a prinúti RouterOS vnímať zastaranú (zraniteľnú) verziu ako aktuálnu. Nebezpečenstvo tu spočíva v tom, že pri „aktualizácii verzie“ sa heslo správcu nastaví na predvolenú hodnotu - útočník sa môže prihlásiť do systému s prázdnym heslom!
Útok je celkom funkčný, napriek tomu
ochrana
Jednoduché vypnutie Winboxu vám umožní chrániť sa pred týmito útokmi. Napriek pohodlnosti administrácie cez Winbox je lepšie použiť protokol SSH.
Zdroj: hab.com