Уязвимости 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 в качестве базовой платформы.

Файловая система 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 Gigabit | 2.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 100M | 2.18.51, 2.18.58, 3.0.12 |
| Mi Router 4C | 2.14.81, 2.14.87, 2.14.92 |
| Mi Router 3Gv2 | 2.28.8 |
| Mi Router 4Q (R4C) | 2.28.48 |
| MiWiFi 3C | 2.8.51_INT, 2.9.217, 2.14.45 |
| Mi Router 4 | 2.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-скрипты и динамическую генерацию значений на лету.

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

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

В ответе прошивка отдаёт вои переменные, среди которых 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

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



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


Второй способ: обход аутентификации через 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
А в панельке появился новый бот

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