Присоединяйся к обсуждению

Больше материалов, обсуждений и эксклюзивного контента — на нашем форуме.

MiWiFi уязвимости прошивки: как взламывают роутеры Xiaomi

Уязвимости MiWiFi: взлом и эксплуатация роутеров Xiaomi

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

Почему роутеры — привлекательная цель для атак

Домашние и корпоративные роутеры давно стали неотъемлемой частью любой локальной сети — без маршрутизатора невозможна ни одна сеть, будь то дом или офис. Помимо основной функции маршрутизации, роутеры часто выполняют роль межсетевого экрана, NAT-шлюза, VPN-сервера и DHCP-сервера.

Именно поэтому роутеры представляют привлекательную цель для атакующих: эксплуатация уязвимостей MiWiFi и других прошивок позволяет получить полный контроль над трафиком, всеми DNS-запросами, а также надёжно закрепиться в локальной сети или корпоративной инфраструктуре.

Уязвимости прошивок: откуда они берутся

Прошивки маршрутизаторов зачастую пишутся с минимальным приоритетом к безопасности. Разработчики используют устаревшие версии библиотек, редко выпускают обновления, а пользователи почти никогда их устанавливают. В итоге даже массовые популярные модели годами содержат непатченные уязвимости.

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

Один успешный эксплойт под популярную модель роутера может означать компрометацию миллионов устройств по всему миру. Прошивки обычно основаны на Linux-ядре, скомпилированном под архитектуру MIPS или ARM, и нередко представляют собой старый проприетарный код, написанный с прицелом на функциональность, а не на безопасность — особенно в бюджетных и китайских моделях.

Точки входа для эксплуатации MiWiFi

Предположим, вы обнаружили роутер с белым IP-адресом в открытом доступе, либо находитесь с ним в одной локальной сети. В этом случае возможны следующие точки входа.

SSH и Dropbear — брутфорс дефолтных креденшлов

Если на роутере запущен SSH-сервер (обычно это Dropbear) на 22 порту, можно попробовать подобрать слабые или дефолтные учётные данные.

Telnet и BusyBox — доступ без пароля

Если на 21 порту работает демон telnetd (как правило, в составе BusyBox), доступ к нему нередко открыт вообще без пароля. В остальных случаях можно попытаться подобрать учётные данные брутфорсом.

RCE через веб-интерфейс — самый популярный вектор

Это самая интересная и распространённая точка входа. SSH и Telnet редко включены по умолчанию на домашних роутерах, а вот веб-интерфейс (обычно на базе Nginx, порты 80 или 443) присутствует практически у всех устройств.

Уязвимости удалённого выполнения кода (RCE) в веб-интерфейсе позволяют выполнить произвольный код через shell-оболочку роутера (ash в составе BusyBox), загрузить собственный маяк (beacon) или билд IoT-ботнета, написанный на C и скомпилированный под архитектуру MIPS или ARM. Именно про такие RCE-уязвимости прошивки MiWiFi пойдёт речь в этой статье.

MiWiFi и OpenWrt: архитектура прошивки Xiaomi

Почти все маршрутизаторы Xiaomi работают на фирменной прошивке MiWiFi, которая основана на OpenWrt. Это легко определить по наличию API LuCI в запросах — характерного признака использования OpenWrt в качестве базовой платформы.

image 8

Файловая система MiniFS: точка входа для LPE

Xiaomi использует собственную файловую систему MiniFS. Она была реверс-инжинирена независимыми исследователями, в результате чего были обнаружены приватные ключи и отсутствие полноценной криптографической защиты внутри файловой системы. Это иногда позволяет получить локальное повышение привилегий (LPE), но эта тема заслуживает отдельного разбора.

API загрузки конфигурации: уязвимость c_upload

В прошивке некоторых роутеров Xiaomi присутствует API для загрузки конфигурационных файлов — эндпоинт вида:

http://192.168.31.1/cgi-bin/luci/;stok=STOK_TOKEN/api/misystem/c_upload

Если отправить на этот эндпоинт POST-запрос с архивом .tar.gz, роутер сохраняет его и распаковывает командой, аналогичной tar zxf, в рабочий каталог — без строгой проверки содержимого архива. Таким образом в директории /tmp оказывается файл speedtest_urls.xml.

Этот XML-файл содержит список ссылок, через которые роутер проверяет соединение с WAN (интернетом). Проблема в том, что обработка происходит через bash-команду, подставляющую строки напрямую в конструкцию вида:

wget "$url" -O /tmp/speedtest_temp_file

Это открывает возможность command injection: вместо обычного URL можно подставить в файл строку, закрытую символом ; (точка с запятой), а после дописать произвольную bash-команду — например, для загрузки собственного бикона, написанного на C и скомпилированного под архитектуру MIPS.

Уязвимые версии прошивок MiWiFi

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

Модель роутераУязвимые версии прошивки
Mi Router 4A Gigabit2.28.62, 2.28.65, 2.28.132, 3.0.10, 3.0.24, 3.0.27, 3.2.30, 3.10.18
Mi Router 4A 100M2.18.51, 2.18.58, 3.0.12
Mi Router 4C2.14.81, 2.14.87, 2.14.92
Mi Router 3Gv22.28.8
Mi Router 4Q (R4C)2.28.48
MiWiFi 3C2.8.51_INT, 2.9.217, 2.14.45
Mi Router 42.18.62, 2.26.175
Xiaomi Mi R3Pработает с Dev-прошивкой

Получение stok-токена для доступа к веб-интерфейсу

Для эксплуатации сначала потребуется пройти аутентификацию в веб-интерфейсе роутера — точнее, получить stok-токен, который клиент получает после успешного входа. Рассмотрим два способа: брутфорс пароля и эксплуатацию отдельной уязвимости path traversal.

Брутфорс админ-панели

Атака облегчается несколькими факторами конфигурации по умолчанию:

  • По умолчанию установлены дефолтные пароли, например admin
  • Форма входа содержит только одно поле — пароль, без логина
  • Отсутствуют тайм-ауты на попытки входа — единственное ограничение — не создать DoS для админ-панели самого роутера

Например, в Burp Suite можно включить в Resource Pool функцию Automatic Throttling, чтобы контролировать частоту запросов и не перегружать устройство.

Для генерации anti-relay токена может понадобиться Turbo Intruder — в отличие от стандартного Intruder, он поддерживает Python-скрипты и динамическую генерацию значений на лету.

image 9

Процесс брутфорса: два запроса

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

Сам процесс брутфорса состоит из двух последовательных запросов:

  1. Сначала выполняется GET-запрос для получения nonce — индикатора уникальности запроса, который служит защитой от relay-атак.
  2. Затем отправляется POST-запрос на эндпоинт логина, в котором передаются хеш пароля и полученный nonce.

Сам POST-запрос на логин в админ-панель выглядит следующим образом:

image 10

Здесь nonce -это просто уникальная строка, собранная из фиксированного префикса, MAC-адреса роутера, текущего времени и случайного числа.
Чтобы узнать мак адрес роутера достаточно один раз спарсить ответ на get запрос к /cgi-bin/luci/web

image 11

В ответе прошивка отдаёт вои переменные, среди которых deviceId = »

Поле password=d6534819a32a2cd80c300ebffa9652fb14a83d2d — это sha-1 хеш пароля
для превращения строк из словаря в хеш — в burp suite идем в payload processing:
1)В intruder нужно выбрать режим «cluster bomb attack». Ставим опострофы вокруг значений password и nonce. В payload position сначала выбираем поле password
2)В payload processing нажимаем add
3) выбирает тип «Hash»
4) в типе хеша выбираем SHA-1
5) нажимаем ok

image 12

Добавляем в расширения кастомноый аддон (нужно установить jython.
Сохраняем код ниже как .py файл и добавляем

image 13
image 14
image 15

Запускаем брут и смотрим на длину ответов. В зависимости от сложности пароля может занять некоторое время. По умолчанию стоит пароль admin и с rockyou брутиться моментально. Сортируем по длине — ответ на валидный логин будет длиннее остальных

image 16
image 17

Второй способ: обход аутентификации через directory-traversal в nginx админке (CVE-2019-18371)
код эксплоита для получения stok есть на форуме Дюти-Фри.

Тоесть вам нужно скомпилировать elf бинарь (написанный на C) под linux mips32 архитектуру, и захостить на вашем домене или голой vps, и изменить хост в коде команды на свой. Пейлоадом может быть что угодно, билд ботнета или beacon Cobalt Strike страйка, все зависит от ваших целей

Я захостил билд моего простенького ботнета на C с функцией реверс прокси, который при запуске создает на роутере процесс и стучит на мой C2 сервер, и передает информацию об системе и процессоре (читает и отправляет cat /proc/cpuinfo и cat /proc/meminfo)

Запускаем эксплоит python exploit.py , он попросит нас ввеси ip роутера для атаки, если мы в одной локальной сети можем просто нажать enter — miwifi.com маршрутизируется роутером через dhcp как 192.168.31.1

А в панельке появился новый бот

image 18

Заключение

Уязвимости прошивки MiWiFi наглядно показывают типичную проблему IoT-устройств: приоритет функциональности над безопасностью, отсутствие строгой валидации входных данных и годами не патчащиеся баги в популярных моделях роутеров. Один эндпоинт загрузки конфигурации и подстановка команды в bash-скрипт без экранирования — и злоумышленник получает удалённое выполнение кода на устройстве, через которое проходит весь трафик жертвы.

Если эта статья найдёт отклик у читателей, в планах разобрать аналогичные уязвимости в прошивках других популярных производителей — TP-Link, Asus, MikroTik и китайских Tenda. У каждого из них своя специфика, и там тоже есть на что посмотреть.

Спасибо за внимание. Всем удачи и успехов.