
ESP32/8266 Wi-Fi脆弱性(CVE-2019-12586、CVE-2019-12587、CVE-2019-12588)の概念実証(PoC)
このリポジトリは、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の手順に従う必要があります。これは、生の802.11フレームの注入を可能にするESP8266用のボードサポートパッケージの修正版です。予備のwemos d1 miniボードがある場合に備えて、beacon_frame_crasher/ESP8266Crasher.ino.d1_mini.binにクイックテスト用のバイナリも用意されています。このコードは、ssid=TEST_KRAのアクセスポイント用に構成されたESP8266をクラッシュさせるようにハードコードされていることに注意してください。「ビーコンフレームクラッシャー」デバイスが起動すると、アクセスポイントに接続されている他の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
ESPデバイスSDKがCVE-2019-12587に対して脆弱な場合、hostapdから次のような出力が得られるはずです:

ESPデバイスSDKがCVE-2019-12586に対して脆弱な場合、hostapdから次のような出力が得られるはずです:

この場合、デバイスはhostapdとの接続を試みるたびに再起動するため、再接続を示す多数のログが表示されるはずです。デバイスのシリアルポートを監視している場合、トレースログも受信できます。
デフォルトでは、PoCアクセスポイントは以下のデフォルト設定になっています:
これらのオプションを変更するには、hostapdのルートフォルダにあるhostapd.confファイルを変更します(hostapd-2.8_binary/hostapd.confまたはhostapd-2.8_source/hostapd/hostapd.conf)。Wi-Fi NICに合わせてinterfaceパラメータを変更してください。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の支援を受けています。