Можливість віддаленого даунгрейду пристроїв на базі RouterOS (Mikrotik) ставить під загрозу сотні тисяч мережевих пристроїв. Вразливість пов'язана з отруєнням DNS-кешу Winbox протоколу і дозволяє завантажити застарілу (зі скиданням пароля «за замовчуванням») або модифіковану прошивку на пристрій.
Деталі вразливості
Термінал RouterOS підтримує команду дозволу для пошуку DNS.
Цей запит обробляється бінарним файлом з ім'ям resolver. 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()
Тепер якщо за допомогою 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