RouterOSలో బ్యాక్‌పోర్ట్ దుర్బలత్వం వందల వేల పరికరాలను ప్రమాదంలో పడేస్తుంది

RouterOSలో బ్యాక్‌పోర్ట్ దుర్బలత్వం వందల వేల పరికరాలను ప్రమాదంలో పడేస్తుంది

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

RouterOSలో బ్యాక్‌పోర్ట్ దుర్బలత్వం వందల వేల పరికరాలను ప్రమాదంలో పడేస్తుంది

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

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

RouterOSలో బ్యాక్‌పోర్ట్ దుర్బలత్వం వందల వేల పరికరాలను ప్రమాదంలో పడేస్తుంది

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

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

RouterOSలో బ్యాక్‌పోర్ట్ దుర్బలత్వం వందల వేల పరికరాలను ప్రమాదంలో పడేస్తుంది

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

RouterOSలో బ్యాక్‌పోర్ట్ దుర్బలత్వం వందల వేల పరికరాలను ప్రమాదంలో పడేస్తుంది

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

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

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()

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

RouterOSలో బ్యాక్‌పోర్ట్ దుర్బలత్వం వందల వేల పరికరాలను ప్రమాదంలో పడేస్తుంది

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

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


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

రక్షణ

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

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి