
Възможността за отдалечен даунгрейд на устройства на база RouterOS (Mikrotik) застрашава стотици хиляди мрежови устройства. Уязвимостта е свързана с отравяне на DNS кеша на протокола Winbox и позволява да се зареди остаряла (с нулиране на паролата «по подразбиране») или модифицирана фърмуер версия на устройството.

Детайли на уязвимостта
Терминалът на RouterOS поддържа команда за разрешение за търсене на DNS.

Този запитване се обработва от двоичен файл с името resolver. Resolver е един от многото двоични файлове, свързани с протокола Winbox на RouterOS. На високо ниво „съобщенията“, изпращани на порта Winbox, могат да бъдат маршрутизирани към различни двоични файлове в RouterOS, на базата на схема на нумерация, основана на масив.
По подразбиране функцията за DNS сървър в RouterOS е изключена.

Но дори и с изключена функция за сървър, маршрутизаторът поддържа собствен DNS кеш.

Когато направим запитване, използвайки winbox_dns_request, например, example.com, маршрутизаторът ще кешира резултата.

Тъй като можем да зададем DNS сървър, през който да мине запитването, е тривиално да се въвеждат неверни адреси. Например, можем да настроим имплементация на DNS сървър от , за да отговаря винаги с A запис, съдържащ 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("---- Reply:n", reply)
return reply.pack()Сега, ако чрез Winbox потърсите example.com, ще можете да видите, че DNS кешът на маршрутизатора е отровен.

Разбира се, отравянето на example.com не е особено полезно, тъй като маршрутизаторът всъщност няма да го използва. Въпреки това, маршрутизаторът трябва да се свързва с upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com и download.mikrotik.com. И благодарение на още една грешка, има възможност да се отровят всички тях наведнъж.
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()Рутерът иска едно разрешение, а ние предоставяме пет обратно. Рутерът неправилно кешира всичките тези отговори.

Очевидно е, че тази атака е полезна и когато рутерът действа като DNS-сервер, тъй като позволява атаката на клиентите на рутера.
Също така, тази атака позволява да се експлоатира по-сериозна уязвимост: да се направи даунгрейд или бэкпорт на версията RouterOS. Атакуващият възпроизвежда логиката на сервера за обновления, включително changelog, и кара RouterOS да възприеме остарялата (уязвима) версия като актуална. Опасността тук е, че при "актуализиране" на версията паролата на администратора се сбрасыра до "по подразбиране" — злоуместен субект може да влезе в системата със зададена парола!

Атаката е напълно работеща, въпреки че реализира още няколко вектора, свързани и с , но това е вече излишна техника и използването ѝ за нелегитимни цели е противозаконно.
Защита
Обикновеното изключване на Winbox позволява защита от тези атаки. Въпреки удобството на администрирането чрез Winbox, по-добре е да се използва протоколът SSH.
Източник: habr.com
