Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

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

Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

Детали уязвимости

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

Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

Этот запрос обрабатывается двоичным файлом с именем resolver. Resolver является одним из многих двоичных файлов, которые подключены к протоколу Winbox от RouterOS. На высоком уровне «сообщения», отправляемые на порт Winbox, могут маршрутизироваться в различные двоичные файлы в RouterOS на основе схемы нумерации на основе массива.

По умолчанию в RouterOS отключена функция DNS-сервера.

Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

Однако даже при отключенной функции сервера маршрутизатор поддерживает собственный кэш DNS.

Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

Когда мы делаем запрос, используя winbox_dns_request, например, example.com, маршрутизатор будет кэшировать результат.

Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

Поскольку мы можем указать 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-кеш маршрутизатора отравлен.

Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

Конечно, отравление 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()

Маршрутизатор запрашивает одно разрешение, а мы предоставляем пять обратно. Маршрутизатор неправильно кэширует все эти ответы.

Backport уязвимость в RouterOS ставит под угрозу сотни тысяч устройств

Очевидно, что эта атака также полезна, если маршрутизатор действует как DNS-сервер, поскольку он позволяет атаковать клиентов маршрутизатора.

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


Атака вполне рабочая, несмотря на то что автор реализовывает еще несколько векторов, связанных в том числе и с встраиванием бэкдора в прошивку, но это уже избыточная техника и применение ее в нелигитимных целях противозаконно.

Защита

Простое отключение Winbox позволяет защититься от этих атак. Несмотря на удобство администрирования через Winbox лучше воспользоваться протоколом SSH.

Источник: habr.com