
스마트폰이 Wi-Fi 연결을 찾기 위해 전송하는 PROBE REQUEST 패킷을 스니핑하여 다양한 유형의 정보를 추출하는 ESP32 펌웨어
이 프로젝트는 Espressif IoT Development Framework(ESP-IDF)를 사용하며, ESP-WROOM-32 모듈과 esp-idf v3.2에서 테스트되었습니다.
전체 프로젝트(즉, ESP32 펌웨어, 서버 및 GUI)에 대한 개요는 여기에서 확인할 수 있습니다.
이 펌웨어는 Wi-Fi 연결을 찾고 있는 스마트폰이 전송하는 Probe Request 패킷을 스니핑할 목적으로 작성되었습니다. 스마트폰에서 Wi-Fi 연결이 활성화되면, 사용 가능한 Wi-Fi가 있는지 또는 알려진 Wi-Fi(즉, 스마트폰이 해당 Wi-Fi의 비밀번호를 알고 있는 경우)가 있는지 묻는 probe request 메시지를 브로드캐스트(모든 채널 주파수)로 전송합니다. ESP32는 이를 스니핑하여 다양한 유형의 정보를 추출합니다.
스니핑된 각 패킷에서 다음 정보가 추출됩니다:
매 1분마다 이 정보들은 서버로 전송되어 처리됩니다. 마지막으로, 처리된 정보(스마트폰 실시간 위치, 스마트폰 빈도 등)는 GUI를 통해 확인할 수 있습니다.
펌웨어는 두 개의 주요 스레드/태스크로 구성됩니다:
스니퍼 태스크
Wi-Fi 태스크
lock이 사용됩니다.ESP32는 WIFI_MODE_APSTA 모드로 구성됩니다: 즉, "soft-AP and station control block"을 생성하고 "soft-AP and station"을 시작합니다. 이를 통해 ESP32는 데이터를 전송하는 동안 패킷 정보를 잃지 않으면서 동시에 스니핑하고 서버로 정보를 전송할 수 있습니다.
다음은 Probe Request에 포함될 수 있는 정보 필드의 전체 목록입니다(출처: IEEE 802.11-2012):

그리고 아래는 Wireshark로 스니핑한 패킷으로, 각 필드에 대해 비트 수와 패킷 내에서의 위치를 확인할 수 있습니다:

이 섹션은 오래되었을 수 있습니다. 자세한 정보와 ESP-IDF 시작에 대한 최신 가이드는 공식 사이트를 확인하세요.
툴체인 설정
ESP-IDF 받기
애플리케이션을 컴파일하고 빌드하는 프로그램이 포함된 툴체인 외에도, ESP32 전용 API / 라이브러리가 필요합니다.
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
v3.x 버전으로 체크아웃
cd esp-idf
git checkout release/v3.2
ESP-IDF 경로 설정
툴체인 프로그램은 IDF_PATH 환경 변수를 사용하여 ESP-IDF에 접근합니다.
이 변수는 PC에 설정되어 있어야 하며, 그렇지 않으면 프로젝트가 빌드되지 않습니다.
필요한 Python 패키지 설치
python -m pip install --user -r $IDF_PATH/requirements.txt
경로를 export했는지 확인하세요
export IDF_PATH=~/esp/esp-idf
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
저장소 복제
git clone https://github.com/ETS-PoliTO/esp32-sniffer.git
cd esp32-sniffer
ESP32와 PC 사이에 시리얼 연결 설정
make menuconfig
Serial flasher config로 이동한 다음 Default serial port로 가서 ESP32가 연결된 포트를 설정하세요
브리지를 사용하는 경우, 아마도 몇 가지 드라이버를 다운로드해야 할 수 있습니다:
이 문서는 ESP32와 PC 사이에 시리얼 연결을 설정하는 방법에 대한 가이드를 제공합니다.
코드 빌드 및 ESP32 플래시
make all && make flash
로그 확인
make monitor
/main/Kconfig.projbuild 파일에는 두 개의 서로 다른 메뉴가 있습니다:
SPIFFS (SPI Flash File System)
SPIFFS 파티션에 대한 몇 가지 중요한 정보가 포함되어 있습니다:
SPIFFS는 웨어 레벨링, 파일 시스템 일관성 검사 등을 지원하는 파일 시스템입니다.
구성
여러 가지 변수가 포함되어 있습니다:
ESP32_ID: ESP32의 IDWIFI_SSID: WiFi의 SSID (네트워크 이름)WIFI_PASS: WiFi 비밀번호 (WPA 또는 WPA2)BROKER_ADDR: MQTT 브로커의 IPBROKER_PSW: MQTT 브로커의 비밀번호BROKER_PORT: MQTT 브로커의 포트CHANNEL: ESP32가 PROBE REQUEST를 스니핑할 채널SNIFFING_TIME: 스니핑 시간위의 변수를 구성하려면:
프로젝트 폴더 내에서 터미널을 열고 실행하세요
make menuconfig
수정하려는 메뉴를 선택하세요
원하는 대로 변수를 편집하세요
서로 다른 변수를 가진 다른 메뉴를 추가할 수도 있습니다:
Kconfig.projbuild를 여세요
새 메뉴를 시작하세요
menu YOUR_MENU_NAME
필요한 변수를 추가하세요
메뉴를 종료하세요
endmenu
SPIFFS
파티션 테이블을 생성해야 합니다.
ESP32 MQTT
ESP32 MQTT 라이브러리가 사용되었습니다.
MD5
고유 식별자를 얻기 위해 스니핑된 패킷에 사용되는 해시 함수입니다.
ESP32가 어떻게 작동하는지 보려면 이 데모 비디오도 확인해 보세요.
가르침을 통한 길은 길고, 모범을 통한 길은 짧고 효과적이다