
Доказательство концепции уязвимостей Wi-Fi для ESP32/8266 (CVE-2019-12586, CVE-2019-12587, CVE-2019-12588)
Этот репозиторий является частью исследовательского результата ASSET Research Group.

Этот репозиторий демонстрирует 3 Wi-Fi атаки на популярные IoT-устройства ESP32/8266:
Перейдите по ссылкам на каждую уязвимость для получения дополнительных сведений и патчей от Espressif.
Эти уязвимости были обнаружены в SDK ESP32 и ESP8266. На момент обнаружения их версиями были ESP-IDF v4.0-dev-459-gba1ff1692 и NONOS-SDK v3.0-103-g7a31cb7 соответственно.
Хотя для тестирования первых двух уязвимостей предоставляется пользовательская версия hostapd, для последней используется ESP8266 для внедрения поддельных beacon-кадров 802.11 с целью вызвать сбой других устройств этого же типа (каламбур не предназначен!).
Если вы используете Debian или Ubuntu, вы можете запустить уже скомпилированный hostapd в папке hostapd-2.8_binary. Просто выполните hostapd-2.8_binary/run_hostapd_exploit.sh, чтобы запустить точку доступа для тестирования уязвимости, или hostapd-2.8_binary/run_zero_pmk_EAP.sh для запуска без этого теста. Имейте в виду, что вам нужно остановить сетевые службы с помощью service network-manager stop, чтобы ваш Wi-Fi интерфейс был свободен.
service network-manager stop
./run_zero_pmk_EAP.sh # to test against CVE-2019-12587 (remember to restart ESP first)
./run_crash_esp_EAP.sh # to test against CVE-2019-12586
Если по какой-то причине бинарный файл не работает в вашей системе, вы можете скомпилировать проект hostapd-2.8_source, запустив скрипт ./buid.sh. Скрипт устанавливает следующие зависимости перед запуском инструмента: build-essential pkg-config git libnl-genl-3-dev libssl-dev libnl-route-3-dev.
После успешной сборки вы можете запустить скрипт ./run_zero_pmk_EAP.sh, чтобы запустить точку доступа для тестирования уязвимости, или ./run_hostapd_normal.sh для запуска без теста.
./build
./run_zero_pmk_EAP.sh # to test against CVE-2019-12587 (remember to restart ESP first)
./run_crash_esp_EAP.sh # to test against CVE-2019-12586
Для компиляции кода для esp8266 в папке beacon_frame_crasher необходимо выполнить шаги, описанные в ESP8266 Deauther. Это модифицированная версия пакета поддержки платы для ESP8266, которая позволяет внедрять необработанные кадры 802.11. Также предоставляется бинарный файл для быстрого тестирования в beacon_frame_crasher/ESP8266Crasher.ino.d1_mini.bin, если у вас есть запасная плата wemos d1 mini. Обратите внимание, что этот код жёстко запрограммирован на вызов сбоя ESP8266, настроенного на точку доступа с ssid=TEST_KRA. Как только устройство "beacon frame crasher" запускается, другие устройства ESP8266, подключенные к точке доступа, должны периодически перезагружаться.
Альтернативно, если ваше Wi-Fi оборудование поддерживает мониторинг и внедрение, вы можете запустить Python-скрипт:
sudo apt-get install -y aircrack-ng
sudo airmon-ng check kill
sudo airmon-ng wlan0 start # wlan0 is your wifi interface name
pip install scapy
python beacon_frame_crasher/ESP8266Crasher.py
Если SDK вашего устройства ESP уязвим к CVE-2019-12587, вы должны получить от hostapd вывод, подобный этому:

Если SDK вашего устройства ESP уязвим к CVE-2019-12586, вы должны получить от hostapd вывод, подобный этому:

В этом случае, так как устройство перезагружается каждый раз при попытке подключения к hostapd, вы должны получить много логов, указывающих на повторное подключение. Если вы отслеживаете последовательный порт устройства, вы также можете получить трассировочные логи.
По умолчанию точка доступа PoC имеет следующую конфигурацию:
Чтобы изменить эти параметры, измените файл hostapd.conf в корневой папке hostapd (hostapd-2.8_binary/hostapd.conf или hostapd-2.8_source/hostapd/hostapd.conf). Пожалуйста, измените параметр interface в соответствии с вашим Wi-Fi NIC; рекомендуется оставить другие параметры по умолчанию, если вы хотите тестировать клиентские тестовые коды ESP32/8266. Корректные сертификаты также включены (те же, что и в репозитории ESP-IDF), поэтому нет необходимости изменять их в папке hostapd.
Если вы хотите изменить методы EAP или учётные данные пользователя, просто измените hostapd.eap_user
Проверьте, позволяет ли ваша библиотека openssl использовать TLS версии 1.0. Обычно эту конфигурацию можно изменить в /etc/ssl/openssl.cnf, изменив последние строки на:
[system_default_sect]
MinProtocol = TLSv1.0
CipherString = DEFAULT@SECLEVEL=1
Коды, используемые для тестирования уязвимых устройств, находятся в папке esp_client_test_codes.
ESP32_Arduino_EAP_Client и ESP8266_Arduino_EAP_Client можно скомпилировать, используя соответствующие пакеты поддержки плат Arduino (arduino-esp32 и arduino-esp8266). Что касается не-Arduino кодов, для компиляции ESP8266_EAP_Client и ESP32_EAP_Client требуются ESP-IDF и ESP8266_NONOS_SDK. Обратите внимание, что для воспроизведения всех описанных уязвимостей необходимо использовать те же или более ранние SDK, чем указано здесь.
Это исследование было частично поддержано Keysight Technologies.