
Proof of Concept of ESP32/8266 Wi-Fi vulnerabilties (CVE-2019-12586, CVE-2019-12587, CVE-2019-12588) ESP32/8266 Wi-Fi 취약점(CVE-2019-12586, CVE-2019-12587, CVE-2019-12588)의 개념 증명
이 저장소는 ASSET Research Group의 연구 결과물의 일부입니다.

이 저장소는 널리 사용되는 ESP32/8266 IoT 기기를 대상으로 한 3가지 Wi-Fi 공격을 시연합니다:
각 취약점에 대한 자세한 내용과 Espressif의 패치는 각 취약점의 링크를 참조하세요.
이 취약점들은 ESP32와 ESP8266의 SDK에서 발견되었습니다. 발견 당시 각각의 버전은 ESP-IDF v4.0-dev-459-gba1ff1692와 NONOS-SDK v3.0-103-g7a31cb7였습니다.
처음 2개의 취약점을 테스트하기 위해 커스텀 버전의 hostapd가 제공되는 반면, 마지막 취약점의 경우 ESP8266을 사용하여 가짜 802.11 비콘 프레임을 주입함으로써 다른 ESP8266 기기들을 크래시시킵니다(말장난이 아닙니다!).
debian이나 ubuntu를 사용 중이라면 `hostapd-2.8_binary` 폴더에 있는 이미 컴파일된 hostapd를 실행할 수 있습니다. 취약점을 테스트하기 위한 액세스 포인트를 시작하려면 `hostapd-2.8_binary/run_hostapd_exploit.sh`를 실행하고, 이 테스트 없이 시작하려면 `hostapd-2.8_binary/run_zero_pmk_EAP.sh`를 실행하세요. Wi-Fi 인터페이스를 사용하려면 `service network-manager stop`으로 네트워크 서비스를 중지해야 합니다.
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
어떤 이유로 바이너리가 시스템에서 작동하지 않는 경우, `./buid.sh` 스크립트를 실행하여 `hostapd-2.8_source` 프로젝트를 컴파일할 수 있습니다. 이 스크립트는 도구를 실행하기 전에 다음 의존성을 설치합니다: `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
beacon_frame_crasher 폴더의 esp8266 코드를 컴파일하려면 ESP8266 Deauther의 단계를 따라야 합니다. 이는 ESP8266용 보드 지원 패키지의 수정된 버전으로, 원시 802.11 프레임의 주입을 허용합니다. 여분의 wemos d1 mini 보드가 있다면 빠른 테스트를 위해 beacon_frame_crasher/ESP8266Crasher.ino.d1_mini.bin 바이너리도 제공됩니다. 이 코드는 ssid=TEST_KRA인 액세스 포인트로 설정된 ESP8266을 크래시시키도록 하드코딩되어 있습니다. "beacon frame crasher" 기기가 시작되는 즉시 액세스 포인트에 연결된 다른 ESP8266 기기들이 간헐적으로 재시작해야 합니다.
또는 Wi-Fi 하드웨어가 모니터링과 주입을 지원한다면 다음 파이썬 스크립트를 실행할 수 있습니다:
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
ESP 기기 SDK가 CVE-2019-12587에 취약하다면 hostapd에서 다음과 같은 출력을 받아야 합니다:

ESP 기기 SDK가 CVE-2019-12586에 취약하다면 hostapd에서 다음과 같은 출력을 받아야 합니다:

이 경우 기기가 hostapd와 연결을 시도할 때마다 재시작하므로 재연결을 나타내는 많은 로그를 받게 됩니다. 기기의 시리얼 포트를 모니터링하고 있다면 추적(trace) 로그도 받을 수 있습니다.
기본적으로 PoC 액세스 포인트는 다음과 같은 기본 구성을 가집니다:
이 옵션을 변경하려면 hostapd의 루트 폴더에 있는 hostapd.conf 파일을 변경하세요 (hostapd-2.8_binary/hostapd.conf 또는 hostapd-2.8_source/hostapd/hostapd.conf). 인터페이스 파라미터를 사용자의 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와 동일하거나 이전 버전의 SDK를 사용해야 합니다.
이 연구는 Keysight Technologies의 일부 지원을 받았습니다.