Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств
Возможность удаленного даунгрейда устройств на базе RouterOS (Mikrotik) ставит под угрозу сотни тысяч сетевых устройств. Уязвимость связана с отравлением DNS-кеша Winbox протокола и позволяет загрузить устаревшую (со сбросом пароля «по-умолчанию») или модифицированную прошивку на устройство.
Детали уязвимости
Терминал RouterOS поддерживает команду разрешения для поиска DNS.
Этот запрос обрабатывается двоичным файлом с именем resolver. Resolver является одним из многих двоичных файлов, которые подключены к протоколу Winbox от RouterOS. На высоком уровне «сообщения», отправляемые на порт Winbox, могут маршрутизироваться в различные двоичные файлы в RouterOS на основе схемы нумерации на основе массива.
По умолчанию в RouterOS отключена функция DNS-сервера.
Однако даже при отключенной функции сервера маршрутизатор поддерживает собственный кэш DNS.
Когда мы делаем запрос, используя winbox_dns_request, например, например, com.com, маршрутизатор будет кэшировать результат.
Поскольку мы можем указать DNS-сервер, через который должен пройти запрос, вводить неверные адреса тривиально. Например, можно настроить реализацию DNS-сервера от Филиппа Клауса, чтобы всегда отвечать записью A, содержащей IP-адрес 192.168.88.250.
def dns_response (данные):
запрос = DNSRecord.parse (данные)
ответ = DNSRecord (DNSHeader (
id = request.header.id, qr = 1, aa = 1, ra = 1), q = request.q)
qname = запрос .q.qname
qn = str (qname)
reply.add_answer (RR (qn, ttl = 30, rdata = A ("192.168.88.250")))
print ("---- Ответить: \ n", ответ)
return reply.pack ()
Теперь если с помощью Winbox поискать example.com то можно увидеть что DNS-кеш маршрутизатора отравлен.
Конечно, отравление example.com не очень полезно, так как маршрутизатор фактически не будет его использовать. Тем не менее, маршрутизатор нуждается в обращении к upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com и download.mikrotik.com. И благодаря еще одной ошибке есть возможность отравить их всех сразу.
def dns_response (данные):
запрос = DNSRecord.parse (данные)
ответ = DNSRecord (DNSHeader (
id = request.header.id, qr = 1, aa = 1, ra = 1), q = request.q)
qname = запрос .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 = А ( "192.168.88.250")))
print ("---- Ответить: \ n", reply)
return reply.pack ()
Маршрутизатор запрашивает одно разрешение, а мы предоставляем пять обратно. Маршрутизатор неправильно кэширует все эти ответы.
Очевидно, что эта атака также полезна, если маршрутизатор действует как DNS-сервер, поскольку он позволяет атаковать клиентов маршрутизатора.
Также, эта атака позволяет проэксплуатировать более серьезную уязвимость: произвести даунгрейд или бэкпортирование версии RouterOS. Атакующий воссоздает логику сервера обновлений, включая changelog и заставляет RouterOS воспринять устаревшую (уязвимую) версию как актуальную. Опасность здесь кроется в том, что при «обновлении» версии пароль администратора сбрасывается в значение «по-умолчанию» — злоумышленник может войти в систему с пустым паролем!
Атака вполне рабочая, несмотря на то что автор реализовывает еще несколько векторов, связанных в том числе и с встраиванием бэкдора в прошивку, но это уже избыточная техника и применение ее в нелигитимных целях противозаконно.
Защита
Простое отключение Winbox позволяет защититься от этих атак. Несмотря на удобство администрирования через Winbox лучше воспользоваться протоколом SSH.