
Możliwość zdalnego downgrade'u urządzeń opartych na RouterOS (Mikrotik) zagraża setkom tysięcy urządzeń sieciowych. Wrażliwość jest związana z zatruciem pamięci podręcznej DNS protokołu Winbox i pozwala na załadowanie przestarzałego (z przywróceniem hasła do ustawień fabrycznych) lub zmodyfikowanego firmware'u na urządzenie.

Szczegóły wrażliwości
Terminal RouterOS obsługuje polecenie rozwiązywania dla wyszukiwania DNS.

To żądanie jest przetwarzane przez plik binarny o nazwie resolver. Resolver jest jednym z wielu plików binarnych połączonych z protokołem Winbox od RouterOS. Na wysokim poziomie "wiadomości", wysyłane na port Winbox, mogą być kierowane do różnych plików binarnych w RouterOS na podstawie schematu numeracji opartego na tablicy.
Domyślnie w RouterOS funkcja serwera DNS jest wyłączona.

Jednakże, nawet przy wyłączonej funkcji serwera, router utrzymuje własną pamięć podręczną DNS.

Kiedy wykonujemy zapytanie, używając winbox_dns_request, na przykład example.com, router będzie przechowywał wynik w pamięci podręcznej.

Ponieważ możemy wskazać serwer DNS, przez który powinno przejść zapytanie, wprowadzenie nieprawidłowych adresów jest trywialne. Na przykład, można skonfigurować implementację serwera DNS od , aby zawsze odpowiadał rekordem A zawierającym adres IP 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("---- Odpowiedź:n", reply)
return reply.pack()Teraz, jeśli za pomocą Winboxa poszukamy example.com, można zobaczyć, że pamięć podręczna DNS routera jest zatruta.

Oczywiście, zatrucie example.com nie jest zbyt użyteczne, ponieważ router faktycznie nie będzie go używał. Niemniej jednak, router musi komunikować się z upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com i download.mikrotik.com. I dzięki jeszcze jeden błąd istnieje możliwość zatrucia ich wszystkich jednocześnie.
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("---- Odpowiedź:n", reply)
return reply.pack()Router żąda jednego uprawnienia, a my zwracamy pięć. Router niewłaściwie buforuje wszystkie te odpowiedzi.

Oczywiście ta atak jest również przydatny, jeśli router działa jako serwer DNS, ponieważ pozwala atakować klientów routera.
Ten atak pozwala także wykorzystać poważniejszą lukę: przeprowadzić downgrade lub backport wersji RouterOS. Atakujący odtwarza logikę serwera aktualizacji, w tym changelog, i sprawia, że RouterOS postrzega przestarzałą (wrażliwą) wersję jako aktualną. Niebezpieczeństwo polega na tym, że podczas 'aktualizacji' wersji hasło administratora jest resetowane do wartości 'domyślnej' — napastnik może zalogować się na konto z pustym hasłem!

Atak jest całkowicie skuteczny, mimo że wdraża jeszcze kilka wektorów, związanych między innymi z , ale to już nadmiarowa technika, a jej zastosowanie w nielegalnych celach jest niezgodne z prawem.
Ochrona
Proste wyłączenie Winboxa pozwala chronić się przed tymi atakami. Mimo wygody zarządzania za pomocą Winboxa lepiej skorzystać z protokołu SSH.
Źródło: habr.com
