Możliwość zdalnego obniżenia wersji urządzeń opartych na RouterOS (Mikrotik) naraża na ryzyko setki tysięcy urządzeń sieciowych. Luka związana jest z zatruwaniem pamięci podręcznej DNS protokołu Winbox i umożliwia wczytanie na urządzenie przestarzałego (z domyślnym resetem hasła) lub zmodyfikowanego oprogramowania sprzętowego.
Szczegóły luki
Terminal RouterOS obsługuje polecenie Resolve do wyszukiwania DNS.
To żądanie jest obsługiwane przez plik binarny zwany resolwerem. Resolver jest jednym z wielu plików binarnych, które łączą się z protokołem Winbox RouterOS. Na wysokim poziomie „wiadomości” wysyłane do portu Winbox mogą być kierowane do różnych plików binarnych w RouterOS w oparciu o schemat numerowania oparty na tablicach.
Domyślnie RouterOS ma wyłączoną funkcję serwera DNS.
Jednak nawet gdy funkcja serwera jest wyłączona, router utrzymuje własną pamięć podręczną DNS.
Kiedy wysyłamy żądanie za pomocą winbox_dns_request na przykład example.com, router buforuje wynik.
Ponieważ możemy określić serwer DNS, przez który ma przejść żądanie, wpisanie błędnych adresów jest banalne. Na przykład możesz skonfigurować implementację serwera 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()
Teraz, jeśli wyszukasz example.com za pomocą Winbox, zobaczysz, że pamięć podręczna DNS routera jest zatruta.
Oczywiście zatruwanie example.com nie jest zbyt przydatne, ponieważ router tak naprawdę nie będzie z niego korzystał. Jednak router musi uzyskać dostęp do upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com i download.mikrotik.com. A dzięki kolejnemu błędowi możliwe jest otrucie ich wszystkich na raz.
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 żąda jednego pozwolenia, a my udzielamy mu pięciu. Router nie buforuje poprawnie wszystkich tych odpowiedzi.
Oczywiście ten atak jest również przydatny, jeśli router działa jako serwer DNS, ponieważ umożliwia atak na klientów routera.
Atak ten pozwala również wykorzystać poważniejszą lukę: obniżyć wersję lub wykonać kopię zapasową wersji RouterOS. Osoba atakująca odtwarza logikę serwera aktualizacji, w tym dziennik zmian, i zmusza RouterOS do postrzegania przestarzałej (luki) wersji jako aktualnej. Niebezpieczeństwo polega na tym, że po „zaktualizowaniu wersji” hasło administratora zostaje zresetowane do wartości domyślnej – atakujący może zalogować się do systemu z pustym hasłem!
Mimo to atak jest całkiem skuteczny
ochrona
Samo wyłączenie Winboxa pozwala uchronić się przed tymi atakami. Pomimo wygody administrowania poprzez Winbox, lepiej jest skorzystać z protokołu SSH.
Źródło: www.habr.com