
값싼 ESP32 보드로 가능한 수준의 저렴한 가격에 구현한 능동형 Bluetooth BR/EDR 스니퍼/인젝터. Scapy와 함께 동작합니다 ;-)
Bluetooth Classic용 간단한 "모니터 모드". ESP32 BT 연결에서 BR/EDR Baseband 패킷을 스니핑하거나 주입합니다.
이것은 리버스 엔지니어링된 능동형(active) BR/EDR 스니퍼이자 ESP32 패치 프레임워크로, ESP32 컨트롤러와 원격 대상 간의 Bluetooth(BT) BR/EDR 상호작용을 탐구하는 데 사용할 수 있습니다.
BT 네트워크(피코넷)와 상호작용하지 않는 수동형(passive) 스니퍼와 달리, 능동형(active) 스니퍼는 원격 BT 장치(BR/EDR 대상)에 스스로 연결하여 **blue-kitchen**과 같은 BT 호스트 스택의 안내를 받으며 Baseband 계층까지 BT 프로토콜을 테스트할 수 있습니다. BrakTooth 스니퍼는 ESP32-DOIT ($4) 또는 ESP32-DevKitC ($10)과 같은 저렴한 보드를 지원합니다.
git clone https://github.com/Matheus-Garbelini/esp32_bluetooth_classic_sniffer
cd esp32_bluetooth_classic_sniffer
./requirements.sh # (sudo required) Installs latest wireshark and standalone python3 runtime
./build.sh # Build BT Host programs and Wireshark h4bcm dissector
BrakTooth 스니퍼를 사용하기 전에 ESP32 보드에 커스텀 펌웨어를 업로드해야 합니다:
sudo chown $USER:$USER /dev/ttyUSB0 # Give user permission to serial port to avoid using sudo
./firmware.py flash /dev/ttyUSB0 # Change ttyUSB0 to match your port name
# Note: ESP-WROVER-KIT or ESP-ETHERNET-KIT uses /dev/ttyUSB1 instead as the first port is for the FTDI JTAG circuit.
중요: 일부 보드는 ESP32를 플래시 모드로 제대로 전환하려면 BOOT 버튼을 누르고 있어야 합니다.
Usage: BTSnifferBREDR.py [OPTIONS]
Options:
--port TEXT Serial port name (/dev/ttyUSBx for Linux)
--host TEXT BDAddress of local host (default: E0:D4:E8:19:C7:68)
--target TEXT BDAddress of remote target (ex: a8:96:75:25:c2:ac)
--live-wireshark Opens Wireshark live session
--live-terminal Show a summary of each packet on terminal
--bridge-only Starts the HCI bridge without connecting any BT Host stack
--help Show this message and exit.
스니퍼를 마스터 또는 슬레이브 역할로 시작할 수 있습니다. --target 인수를 추가하면 스니퍼가 원격 대상에 연결을 시도합니다. 그렇지 않으면 누군가 연결하기를 기다립니다.
마지막으로, --bridge-only는 HCI 의사 터미널(/dev/pts/x)만 생성하므로 ESP32가 표준 HCI BT 컨트롤러로 작동할 수 있습니다. 이 기능을 사용하여 다른 BT 호스트 스택을 ESP32에 연결할 수 있습니다.
./BTSnifferBREDR.py --port=/dev/ttyUSB0 --target=E0:D4:E8:19:C7:69 --live-terminal --live-wireshark
./BTSnifferBREDR.py --port=/dev/ttyUSB0 --live-terminal --live-wireshark
./BTSnifferBREDR.py --port=/dev/ttyUSB0 --bridge-only --live-terminal --live-wireshark
소스 코드는 ESP32 Firmware Patching Framework 저장소에서 직접 빌드할 수 있습니다:
cd firmware
./build_from_source.sh # clone submodule & build firmware with platformio environment 'sniffer-serial'
./firmware.py flash <serial port> # flash built firmware to ESP32 via serial port
빌드가 성공하면 ESP32 펌웨어 바이너리(firmware.bin, bootloader.bin, partitions.bin)가 firmware 폴더에 복사됩니다. 그런 다음 1.B 단계)에 설명된 대로 펌웨어를 플래시하면 됩니다.
BrakTooth 스니퍼는 연결을 안내하기 위해 BT 호스트 스택을 사용하므로, 다음의 수정된 BlueKitchen 예제가 사용됩니다:
*BlueKitchen*의 공식 문서를 따라 현재 프로그램에 BT 프로필을 수정하거나 추가할 수 있습니다. 참고: host_stack/bluekitchen/example/ 폴더에는 이미 몇 가지 프로필 예제가 포함되어 있습니다.
커스텀 ESP32 BR/EDR 스니퍼/인젝터 펌웨어는 USB 시리얼 포트를 통해 호스트 시스템과 통신하며 커스텀 명령 또는 HCI 명령을 받을 때까지 대기합니다. 시작 시 HCI 브리지가 생성되어 BrakTooth 커스텀 프로토콜을 ESP32에서 송수신되는 표준 HCI 명령과 분리합니다. ESP32 펌웨어에서 "RX/TX Sniffer" 기능이 활성화되면 Baseband 패킷은 BTSnifferBREDR.py 스크립트로 직접 전달되며, 이 스크립트는 커스텀 프로토콜을 통해 스니핑된 패킷을 디코딩하여 Scapy로 출력하거나 라이브 캡처로 Wireshark에 덤프하고 logs 폴더에도 저장합니다.
Baseband 패킷 디섹션은 InternalBlue Broadcom Wireshark Dissector를 확장한 것입니다. 구체적으로, 해당 디섹션은 h4bcm Wireshark 플러그인을 확장하여 몇 가지 추가 BT 레이어와 당사의 커스텀 ESP32 메타데이터 헤더를 지원합니다. @jiska2342님께 감사드립니다.
다음의 모든 오픈소스 프로젝트에 감사드립니다: