Možnost vzdáleně downgradovat zařízení založená na RouterOS (Mikrotik) vystavuje riziku statisíce síťových zařízení. Tato zranitelnost je spojena s otravou mezipaměti DNS protokolu Winbox a umožňuje nahrát do zařízení zastaralý (s výchozím resetováním hesla) nebo upravený firmware.
Podrobnosti o zranitelnosti
Terminál RouterOS podporuje příkaz resolve pro vyhledávání DNS.
Tento požadavek je zpracován binárním programem zvaným resolver. Resolver je jedním z mnoha binárních souborů, které se připojují k protokolu Winbox RouterOS. Na vysoké úrovni mohou být „zprávy“ odeslané na port Winbox směrovány do různých binárních souborů v RouterOS na základě schématu číslování založeného na poli.
Ve výchozím nastavení má RouterOS funkci serveru DNS vypnutou.
I když je funkce serveru zakázána, router si udržuje vlastní mezipaměť DNS.
Když provedeme požadavek pomocí winbox_dns_request například example.com, router uloží výsledek do mezipaměti.
Vzhledem k tomu, že můžeme zadat DNS server, přes který má požadavek projít, je zadání nesprávných adres triviální. Můžete například nakonfigurovat implementaci serveru 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()
Nyní, když hledáte example.com pomocí Winbox, můžete vidět, že mezipaměť DNS routeru je otrávená.
Otrava example.com samozřejmě není příliš užitečná, protože ji router ve skutečnosti nepoužívá. Router však potřebuje přístup k upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com a download.mikrotik.com. A díky další chybě je možné otrávit všechny najednou.
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()
Router požaduje jedno oprávnění a my mu udělujeme pět zpět. Směrovač neukládá všechny tyto odpovědi správně do mezipaměti.
Je zřejmé, že tento útok je také užitečný, pokud router funguje jako DNS server, protože umožňuje napadení klientů routeru.
Tento útok vám také umožňuje využít závažnější zranitelnost: downgrade nebo backportování verze RouterOS. Útočník znovu vytvoří logiku aktualizačního serveru, včetně protokolu změn, a přinutí RouterOS vnímat zastaralou (zranitelnou) verzi jako aktuální. Nebezpečí zde spočívá v tom, že při „aktualizaci verze“ se heslo administrátora resetuje na výchozí hodnotu – útočník se může přihlásit do systému s prázdným heslem!
Útok je docela funkční, navzdory tomu
ochrana
Pouhé vypnutí Winboxu vám umožní chránit se před těmito útoky. I přes pohodlí administrace přes Winbox je lepší používat protokol SSH.
Zdroj: www.habr.com