
Bluetooth 5 и 4.x LE сниффер для оборудования TI CC1352/CC26x2 с поддержкой расширенной рекламы, всех режимов PHY, фильтрации MAC/RSSI и экспорта в PCAP, совместимого с Wireshark.
Sniffle — это сниффер для Bluetooth 5 и 4.x (LE) с использованием аппаратного обеспечения TI CC1352/CC26x2.
Sniffle имеет ряд полезных функций, включая:
Если вы не хотите тратить усилия на настройку среды сборки прошивки, вы можете просто прошить готовые двоичные файлы прошивки с помощью UniFlash/DSLite. Готовые двоичные файлы прошивки прикреплены к релизам на вкладке релизов GitHub этого проекта. При использовании готовой прошивки убедитесь, что используете код Python, соответствующий тегу релиза, а не ветке master, чтобы избежать проблем совместимости с прошивкой, которая отстаёт от ветки master.
arm-none-eabi-gcc, предоставляемый менеджерами пакетов различных дистрибутивов Linux, часто не содержит некоторых заголовочных файлов или требует изменений в конфигурации компоновщика. Чтобы избежать лишних хлопот, я рекомендую использовать ARM GCC по ссылке выше. Вы можете просто скачать и распаковать готовые исполняемые файлы.
TI SDK предоставляется в виде исполняемого двоичного файла, который извлекает набор исходного кода после принятия лицензионного соглашения. В Linux и Mac каталог установки по умолчанию находится в ~/ti/. Это работает нормально, и мои makefile'ы ожидают этот путь, поэтому я рекомендую оставить значение по умолчанию. То же самое относится и к инструменту TI SysConfig.
После извлечения SDK вам нужно будет отредактировать один makefile в соответствии с вашей средой сборки. Внутри ~/ti/simplelink_cc13xx_cc26xx_sdk_8_30_01_01 (или в том месте, куда был установлен SDK) находится makefile с именем imports.mak. Единственные пути, которые необходимо указать здесь для сборки Sniffle, — это пути к GCC, XDC, cmake и SysConfig. Компилятор CCS нам не нужен. Смотрите diff ниже в качестве примера и адаптируйте под место установки.```
diff --git a/imports.mak b/imports.mak
index b2cf5bf59..389d1a7c3 100644
--- a/imports.mak
+++ b/imports.mak
@@ -18,14 +18,14 @@
-XDC_INSTALL_DIR ?= /home/username/ti/xdctools_3_62_01_15_core -SYSCONFIG_TOOL ?= /home/username/ti/ccs1270/ccs/utils/sysconfig_1.21.1/sysconfig_cli.sh +XDC_INSTALL_DIR ?= $(HOME)/ti/xdctools_3_62_01_15_core +SYSCONFIG_TOOL ?= $(HOME)/ti/sysconfig_1.21.1/sysconfig_cli.sh
-CMAKE ?= /home/username/cmake-3.21.3/bin/cmake +CMAKE ?= cmake PYTHON ?= python3
TICLANG_ARMCOMPILER ?= /home/username/ti/ccs1270/ccs/tools/compiler/ti-cgt-armllvm_3.2.2.LTS-0 -GCC_ARMCOMPILER ?= /home/username/arm-none-eabi-gcc/12.3.Rel1-0 +GCC_ARMCOMPILER ?= $(HOME)/arm_tools/arm-gnu-toolchain-14.3.rel1-x86_64-arm-none-eabi IAR_ARMCOMPILER ?= /home/username/iar9.50.2
Начиная с версии SDK 8.30.01.01, для компиляции с последними версиями GCC (и binutils) требуется небольшое изменение SDK, чтобы избежать ошибок компоновки "Unknown destination type (ARM/Thumb)" и "dangerous relocation: unsupported relocation".```
diff --git a/kernel/tirtos7/packages/ti/sysbios/family/arm/m3/Hwi_asm_gcc.s b/kernel/tirtos7/packages/ti/sysbios/family/arm/m3/Hwi_asm_gcc.s
index 187cfd744..4cbf0d384 100644
--- a/kernel/tirtos7/packages/ti/sysbios/family/arm/m3/Hwi_asm_gcc.s
+++ b/kernel/tirtos7/packages/ti/sysbios/family/arm/m3/Hwi_asm_gcc.s
@@ -236,6 +236,7 @@ lab$1:
@ user code has set the PRIMASK and not cleared it, or when single
@ stepping with interrupts disabled.
+.type ti_sysbios_family_arm_m3_Hwi_interruptsAreDisabledButShouldNotBe, %function
ti_sysbios_family_arm_m3_Hwi_interruptsAreDisabledButShouldNotBe:
b ti_sysbios_family_arm_m3_Hwi_interruptsAreDisabledButShouldNotBe
diff --git a/kernel/tirtos7/packages/ti/sysbios/family/arm/v8m/Hwi_asm_gcc.s b/kernel/tirtos7/packages/ti/sysbios/family/arm/v8m/Hwi_asm_gcc.s
index 717f49c9a..1c83ed725 100644
--- a/kernel/tirtos7/packages/ti/sysbios/family/arm/v8m/Hwi_asm_gcc.s
+++ b/kernel/tirtos7/packages/ti/sysbios/family/arm/v8m/Hwi_asm_gcc.s
@@ -226,6 +226,7 @@ lab$1:
@ user code has set the PRIMASK and not cleared it, or when single
@ stepping with interrupts disabled.
+.type ti_sysbios_family_arm_v8m_Hwi_interruptsAreDisabledButShouldNotBe, %function
ti_sysbios_family_arm_v8m_Hwi_interruptsAreDisabledButShouldNotBe:
b ti_sysbios_family_arm_v8m_Hwi_interruptsAreDisabledButShouldNotBe
После внесения этого изменения вам потребуется перекомпилировать SDK.``` cd ~/ti/simplelink_cc13xx_cc26xx_sdk_8_30_01_01 make build-gcc -j5
### Получение DSLite
DSLite — это инструмент командной строки TI для программирования и отладки через XDS110
отладчики. Платы Launchpad CC26xx и CC13xx обе содержат отладчики XDS110.
К сожалению, TI не предоставляет отдельного скачивания DSLite для командной строки.
Самый простой способ получить DSLite — установить [UniFlash](http://www.ti.com/tool/download/UNIFLASH)
от TI. Он доступен для Linux, Mac и Windows. Исполняемый файл DSLite будет
находиться по пути `deskdb/content/TICloudAgent/linux/ccs_base/DebugServer/bin/DSLite`
относительно каталога установки UniFlash. В Linux каталог установки UniFlash по умолчанию
находится внутри `~/ti/`.
Вам следует добавить каталог с исполняемым файлом DSLite в вашу `$PATH`.
## Сборка прошивки
После того как GCC, DSLite и SDK установлены и работают, сборка
Sniffle должна быть простой. Просто перейдите в каталог `fw` и
выполните `make`. Если вы не установили SDK в каталог по умолчанию, вам может
потребоваться отредактировать `SIMPLELINK_SDK_INSTALL_DIR` в makefile.
Если вы собираете или устанавливаете на какую-либо модификацию Launchpad, отличную от CC26x2R,
вам необходимо указать `PLATFORM=xxx` либо как аргумент make, либо определив
его как переменную окружения перед вызовом make. Поддерживаемые значения для `PLATFORM`
можно найти в makefile прошивки. Обязательно выполните `make clean` перед
сборкой для другой платформы.
## Установка прошивки (плата TI Launchpad)
Чтобы установить Sniffle на (подключенную) плату CC26x2R Launchpad с помощью DSLite, выполните
`make load` в каталоге `fw`. Для любых других моделей Launchpad необходимо
указать аргумент `PLATFORM` для make, как описано выше. Вы также можете прошить
скомпилированный бинарный файл `sniffle.hex` с помощью графического интерфейса UniFlash.
## Установка прошивки (USB-донгл SONOFF)
Чтобы установить Sniffle на донгл SONOFF CC2652P (оснащенный мостом USB/UART
CP2102N), используйте утилиту [JelmerT/cc2538-bsl](https://github.com/JelmerT/cc2538-bsl)
для прошивки с помощью встроенного загрузчика ROM следующей командой:```
python3 cc2538-bsl.py -p /dev/ttyUSB0 --bootloader-sonoff-usb -ewv sniffle_cc1352p1_cc2652p1.hex
По состоянию на 10 января 2025 года в cc2538-bsl существует ошибка, которая не позволяет сбросить чип CC2562P в донгле Sonoff после прошивки. Исправление находится в pull request 173, который ещё не принят. В ожидании слияния pull request можно использовать мой форк по адресу https://github.com/sultanqasim/cc2538-bsl.
В 2022 году из-за дефицита чипов, вызванного пандемией COVID-19, некоторые донглы Sonoff CC2652P были собраны с микросхемами USB/UART-моста CP2102 (не N), которые ограничены скоростью 921600 бод. Если у вас такой донгл, вам потребуется прошить другой образ прошивки, использующий более низкую скорость 921600 бод. Эта специальная сборка с пониженной скоростью называется sniffle_cc1352p1_cc2652p1_1M.hex (вариант сборки CC2652P1F_1M). Также при использовании утилит Sniffle нужно будет указывать опцию -b 921600, чтобы переопределить скорость по умолчанию (2000000).
ПРЕДУПРЕЖДЕНИЕ: Не прошивайте неправильный вариант сборки через загрузчик, иначе вы рискуете «окирпичить» устройство и потерять доступ к загрузчику. Для устройств Sonoff CC2652P используйте файл sniffle_cc1352p1_cc2652p1.hex (вариант сборки CC2652P1F) или файл sniffle_cc1352p1_cc2652p1_1M.hex (вариант сборки CC2652P1F_1M) для скорости 921600 бод. Если вы прошьёте неправильный вариант и потеряете доступ к загрузчику, возможно восстановить устройство через JTAG/SWD.
Electronic Cats предоставляет инструмент Catnip Uploader для загрузки прошивки. Подробную информацию можно найти в репозитории. Скачайте инструмент и выполните следующие команды:```bash
[ec@sniffle]$ git clone https://github.com/ElectronicCats/CatSniffer-Tools.git [ec@sniffle]$ cd CatSniffer-Tools/catnip_uploader [ec@sniffle]$ pip install -r requirements.txt
[ec@sniffle]$ python3 catnip_uploader.py releases [INFO] Fetching assets from https://api.github.com/repos/ElectronicCats/CatSniffer-Firmware/releases/latest [INFO] Release: board-v3.x-v1.1.0 [INFO] Fetching assets from https://api.github.com/repos/nccgroup/Sniffle/releases/latest [INFO] Release: v1.10.0 [INFO] Found local release: releases_board-v3.x-v1.1.0 [SUCCESS] Local release is up to date: board-v3.x-v1.1.0 [SUCCESS] Available releases: 0: sniffer_fw_CC1352P_7_v1.10.hex 1: airtag_scanner_CC1352P_7_v1.0.hex 2: nccgroup_v1.10.0_sniffle_cc1352p7_1M.hex 3: airtag_spoofer_CC1352P_7_v1.0.hex 4: sniffle_CC1352P_7_v1.7.hex
[ec@sniffle]$ python3 catnip_uploader.py load 2 COMPORT
Вам нужно изменить *COMPORT* на соответствующий путь для вашей платы.
С помощью команды `python3 catnip_uploader.py load 2 COMPORT` вы загрузите
прошивку `2: nccgroup_v1.10.0_sniffle_cc1352p7_1M.hex`.
**Для загрузки прошивки Catsniffer V3 требуется SerialPassthroughwithboot**.
**ПРЕДУПРЕЖДЕНИЕ:** Не прошивайте неправильный вариант сборки с помощью загрузчика, иначе вы
рискуете «окирпичить» устройство и потерять доступ к загрузчику. Если вы
используете скрипт `catnip_uploader.py` для загрузки и установки прошивки, он
предложит только совместимые прошивки. Однако, если вы решите скомпилировать и установить
прошивку вручную, убедитесь, что используете правильный вариант сборки. Для устройств CatSniffer
v3 используйте файл `sniffle_cc1352p7_1M.hex` (вариант сборки `CC1352P74_1M`).
Устройства CatSniffer v1.x/v2.x используют другой вариант микросхемы (CC1352P1), для которого требуется
другая сборка прошивки (вариант `CC1352P1F3_1M`, образ `sniffle_cc1352p1_cc2652p1_1M.hex`).
Sniffle не тестировался на устройствах CatSniffer v1.x/v2.x, но, вероятно,
будет работать, если вы прошьете соответствующий вариант сборки. Если вы прошьете
неправильный вариант и потеряете доступ к загрузчику, возможно, удастся восстановить
устройство с помощью JTAG/SWD.
## Использование сниффера```
[skhan@serpent python_cli]$ ./sniff_receiver.py --help
usage: sniff_receiver.py [-h] [-s SERPORT] [-b BAUDRATE] [-c {37,38,39}] [-p] [-r RSSI]
[-m MAC] [-i IRK] [-S STRING] [-a] [-A] [-e] [-H] [-l] [-q]
[-Q PRELOAD] [-n] [-C] [-d] [-o OUTPUT]
Host-side receiver for Sniffle BLE5 sniffer
options:
-h, --help show this help message and exit
-s SERPORT, --serport SERPORT
Sniffer serial port name
-b BAUDRATE, --baudrate BAUDRATE
Sniffer serial port baud rate
-c {37,38,39}, --advchan {37,38,39}
Advertising channel to listen on
-p, --pause Pause sniffer after disconnect
-r RSSI, --rssi RSSI Filter packets by minimum RSSI
-m MAC, --mac MAC Filter packets by advertiser MAC
-i IRK, --irk IRK Filter packets by advertiser IRK
-S STRING, --string STRING
Filter for advertisements containing the specified string
-a, --advonly Passive scanning, don't follow connections
-A, --scan Active scanning, don't follow connections
-e, --extadv Capture BT5 extended (auxiliary) advertising
-H, --hop Hop primary advertising channels in extended mode
-l, --longrange Use long range (coded) PHY for primary advertising
-q, --quiet Don't display empty packets
-Q PRELOAD, --preload PRELOAD
Preload expected encrypted connection parameter changes
-n, --nophychange Ignore encrypted PHY mode changes
-C, --crcerr Capture packets with CRC errors
-d, --decode Decode advertising data
-o OUTPUT, --output OUTPUT
PCAP output file name
Отладчик XDS110 на платах Launchpad создаёт два последовательных порта. В Linux они обычно называются ttyACM0 и ttyACM1. Первый из созданных последовательных портов используется для связи со Sniffle. По умолчанию CLI Python связывается через первое найденное устройство CDC-ACM, соответствующее комбинации USB VID:PID TI XDS110, или через первый найденный донгл Sonoff. Возможно, вам придётся переопределить это с помощью опции командной строки -s, если вы используете другой USB-последовательный адаптер или подключили дополнительные устройства USB CDC-ACM.
Для опции -r (фильтр RSSI) значение -40 обычно хорошо работает, если сниффер находится очень близко или почти касается передающего устройства. Фильтр RSSI очень полезен для игнорирования нерелевантных рекламных пакетов в загруженной RF-среде. Фильтр RSSI активен только при захвате рекламных пакетов, так как при отслеживании соединения вы всегда хотите захватывать трафик каналов данных. Вероятно, вам не следует использовать фильтр RSSI, когда активна фильтрация MAC, так как вы можете потерять рекламные пакеты от интересующего MAC-адреса при слишком низком RSSI.
Чтобы переключаться между рекламными пакетами и иметь надёжное отслеживание соединений, необходимо настроить фильтр MAC с помощью опции -m. Следует указывать MAC-адрес периферийного устройства, а не центрального. Чтобы выяснить, какой MAC-адрес отслеживать, вы можете запустить сниффер с фильтрацией RSSI, разместив сниффер рядом с целевым устройством. Это покажет рекламные пакеты от целевого устройства, включая его MAC-адрес. Следует отметить, что многие BLE-устройства передают рекламные пакеты со случайным MAC-адресом вместо своего «реального» фиксированного MAC-адреса, указанного на этикетке.
Большинство новых BLE-устройств используют разрешаемые приватные адреса (RPA), а не фиксированные статические или публичные адреса. Хотя вы можете настроить фильтр MAC на конкретный RPA, устройства периодически меняют свой RPA. RPA можно разрешить (связать с конкретным устройством), если известен ключ разрешения идентификатора (IRK). Sniffle поддерживает автоматическое разрешение RPA при предоставлении IRK. Это избавляет от необходимости постоянно обновлять фильтр MAC при каждом изменении RPA. Вы можете указать IRK для Sniffle с помощью опции -i; IRK должен быть представлен в шестнадцатеричном формате, начиная со старшего байта (MSB). Указание IRK позволяет Sniffle переключаться между каналами вместе с рекламодателем так же, как это делается с фильтром MAC. Функция фильтрации MAC на основе IRK (-i) является взаимоисключающей со статической фильтрацией MAC (-m).
Также есть удобная функция для автоматического определения MAC-адреса рекламодателя, чьё рекламное сообщение или ответ на сканирование содержит указанную строку (последовательность байтов). Это полезно для устройств с RPA, у которых IRK неизвестен, но рекламное сообщение содержит достаточно уникальную статическую строку для идентификации. Эта функция использует опцию -S, где строка задаётся с использованием стандартных escape-последовательностей. Например, чтобы найти рекламодателя, чьё рекламное сообщение содержит шестнадцатеричную последовательность байтов DE AD BE EF, укажите -S "\xDE\xAD\xBE\xEF". Чтобы найти рекламодателя со строкой "hello", просто укажите -S "hello". При использовании функции поиска строки изначально принимаются все MAC-адреса, пока не будет найдено рекламное сообщение, содержащее искомую строку. После этого будет настроен фильтр MAC с соответствующим MAC-адресом рекламодателя, а фильтр RSSI будет автоматически отключён.
Для отслеживания вспомогательных указателей в расширенной рекламе Bluetooth 5 включите опцию -e. Для повышения производительности и надёжности при захвате расширенной рекламы эта опция отключает переключение между основными рекламными каналами, даже если настроен фильтр MAC. Если вы не уверены, будет ли соединение установлено через обычную или расширенную рекламу, вы можете включить флаг -H вместе с -e, чтобы выполнять переключение между основными каналами для обычных рекламных пакетов и запланированное прослушивание вспомогательных пакетов расширенной рекламы. При комбинировании -e и -H надёжность обнаружения соединения может снизиться по сравнению с переключением только на основных (обычных) или только на вторичных (расширенных) рекламных каналах.
Для отслеживания PHY на большом расстоянии на основных рекламных каналах укажите опцию -l. Обратите внимание, что переключение между основными рекламными каналами в режиме большого расстояния не поддерживается, поскольку вся реклама на большом расстоянии использует расширенный механизм BT5. В рамках расширенного механизма вспомогательные указатели на всех трёх основных каналах указывают на один и тот же вспомогательный пакет, поэтому переключение между основными каналами не требуется.
Чтобы не выводить на экран пустые пакеты данных при отслеживании соединения, используйте флаг -q. Это упрощает наблюдение за значимыми сообщениями в реальном времени, но может скрыть моменты, когда отслеживание соединения нестабильно или потеряно.
Для зашифрованных соединений Sniffle поддерживает обнаружение обновлений параметров соединения, даже если ключ шифрования неизвестен, и пытается измерить новые параметры. Однако, если вы знаете новый интервал соединения и дельту Instant, ожидаемые при зашифрованных обновлениях параметров, вы можете указать их с помощью опции --preload/-Q для повышения производительности/надёжности. Ожидаемая пара Интервал:DeltaInstant должна быть указана как целые числа, разделённые двоеточием. Интервал — это целое число, кратное 1,25 мс (как определено в LL_CONNECTION_UPDATE_IND). DeltaInstant — это количество событий соединения между моментом передачи пакета обновления соединения и моментом применения новых параметров. DeltaInstant должно быть больше или равно 6, согласно требованиям спецификации Bluetooth для центральных устройств. Если ожидается несколько зашифрованных обновлений параметров, вы можете указать несколько пар параметров, разделённых запятыми (например, 6:7,39:8). Если у вас есть устройство, которое отправляет зашифрованные PDU обновления PHY, не меняющие PHY, или отправляет зашифрованные PDU управления мощностью LE без изменений PHY, вы можете использовать опцию --nophychange/-n.
Чтобы остановить сниффер, нажмите Ctrl-C.
Если по какой-то причине прошивка сниффера зависнет и откажется захватывать трафик даже при отключённых фильтрах, следует перезагрузить MCU сниффера. На платах Launchpad кнопка сброса находится рядом с портом micro USB.
usage: scanner.py [-h] [-s SERPORT] [-b BAUDRATE] [-c {37,38,39}] [-r RSSI] [-l] [-d] [-o OUTPUT]
Scanner utility for Sniffle BLE5 sniffer
options: -h, --help show this help message and exit -s SERPORT, --serport SERPORT Sniffer serial port name -b BAUDRATE, --baudrate BAUDRATE Sniffer serial port baud rate -c {37,38,39}, --advchan {37,38,39} Advertising channel to listen on -r RSSI, --rssi RSSI Filter packets by minimum RSSI -l, --longrange Use long range (coded) PHY for primary advertising -d, --decode Decode advertising data -o OUTPUT, --output OUTPUT PCAP output file name
Сканер использует те же аргументы командной строки, что и сниффер. Назначение
утилиты сканера — собирать список находящихся поблизости устройств, которые
передают рекламные пакеты, и активно отправлять запросы на сканирование для
обнаруженных устройств, без того потока быстро прокручиваемых данных, который
вы получаете с утилитой сниффера. Аппаратное/программное обеспечение
перейдёт в режим активного сканирования, где оно будет сообщать о полученных
рекламных пакетах, отправлять запросы на сканирование для тех, которые можно
сканировать, и сообщать о полученных ответах на сканирование.
Утилита сканера будет записывать и сообщать MAC-адреса только один раз,
не засоряя дисплей. Когда закончите сбор рекламных пакетов, нажмите
Ctrl-C, чтобы остановить сканирование и вывести результаты. Сканер покажет
последний рекламный пакет и ответ на сканирование от каждого устройства.
Результаты сканирования будут отсортированы
по RSSI в порядке убывания.
## Примеры использования
Снифферить все рекламные пакеты на канале 38, игнорировать RSSI < -50, оставаться на
рекламном канале, даже когда видны CONNECT\_REQs.```
./sniff_receiver.py -c 38 -r -50 -a
Перехватывать рекламные пакеты от MAC 12:34:56:78:9A:BC, оставаться на рекламном канале, даже когда видны CONNECT_REQs, сохранять рекламные пакеты в data1.pcap.```
./sniff_receiver.py -m 12:34:56:78:9A:BC -a -o data1.pcap
Перехватывайте объявления и соединения для первого обнаруженного MAC-адреса с RSSI >= -40. Фильтр RSSI будет автоматически отключен после фиксации MAC-адреса. Сохраняйте захваченные данные в `data2.pcap`.```
./sniff_receiver.py -m top -r -40 -o data2.pcap
Перехватывать рекламные пакеты и соединения от периферийного устройства с big endian IRK 4E0BEA5355866BE38EF0AC2E3F0EBC22. Предзагрузить два ожидаемых обновления параметров зашифрованного соединения; первое с интервалом 6, происходящее через 6 событий соединения после того, как сниффер обнаружил зашифрованный LL_CONNECTION_UPDATE_IND. Второе ожидаемое обновление зашифрованного соединения имеет интервал 39, и DeltaInstant также 6.``` ./sniff_receiver.py -i 4E0BEA5355866BE38EF0AC2E3F0EBC22 -Q 6:6,39:6
Перехватывать расширенные рекламные объявления BT5 и соединения от ближайших устройств (RSSI >= -55).```
./sniff_receiver.py -r -55 -e
Перехватывайте устаревшие и расширенные рекламные объявления и соединения от устройства с указанным MAC-адресом. Сохраните захваченные данные в data3.pcap.```
./sniff_receiver.py -eH -m 12:34:56:78:9A:BC -o data3.pcap
Sniff extended advertisements and connections, используя long range primary PHY на канале 38.```
./sniff_receiver.py -le -c 38
Активно сканировать на канале 39 рекламные пакеты с RSSI больше -50.``` ./scanner.py -c 39 -r -50
## Получение IRK
Если у вас есть рутированный телефон на Android, вы можете найти IRK (и LTK) в конфигурационном файле Bluedroid. На Android 8.1 он находится по пути `/data/misc/bluedroid/bt_config.conf`. Параметр `LE_LOCAL_KEY_IRK` указывает собственный IRK устройства Android, а первые 16 байт `LE_KEY_PID` для каждого сопряжённого устройства в файле указывают IRK этого устройства. Имейте в виду, что ключи, хранящиеся в этом файле, имеют обратный порядок байт (little endian), поэтому **порядок байт ключей в этом файле необходимо изменить на обратный (big endian).** Например, little endian IRK 22BC0E3F2EACF08EE36B865553EA0B4E необходимо преобразовать в 4E0BEA5355866BE38EF0AC2E3F0EBC22 (big endian) при передаче Sniffle с опцией `-i`.
Вы также можете найти IRK и LTK через HCI Snoop логи, захваченные на Android или iOS без рутирования устройства:
* Android: <https://novelbits.s3.us-east-2.amazonaws.com/Developer+Guides/Android+Bluetooth+Debugging+Guide.pdf>
* iOS: <https://novelbits.s3.us-east-2.amazonaws.com/Developer+Guides/iOS+Bluetooth+Debugging+Guide.pdf>
## Плагин для Wireshark
Sniffle включает плагин для Wireshark, который позволяет автоматически запускать Sniffle из графического интерфейса Wireshark, выбрав интерфейс захвата 'Sniffle'.
Чтобы установить плагин Sniffle, сначала найдите расположение вашей личной папки Extcap в диалоге 'About Wireshark' (*Help* > *About Wireshark* > *Folders* > *Personal Extcap path*). На системах POSIX (Linux и Mac OS) с последними версиями Wireshark (4.2.0+) эта папка находится по пути `~/.local/lib/wireshark/extcap`. В Windows она находится по адресу `%USERPROFILE%\AppData\Roaming\Wireshark\extcap`.
На системах POSIX вы можете просто создать символическую ссылку на плагин extcap Sniffle в личную директорию extcap Wireshark:
```sh
ln -s /путь/к/sniffle_extcap.py ~/.local/lib/wireshark/extcap/sniffle_extcap.py
mkdir -p ~/.local/lib/wireshark/extcap ln -s $(pwd)/python_cli/sniffle_extcap.py ~/.local/lib/wireshark/extcap
На Mac OS Wireshark может пытаться использовать Python из Xcode вместо Python, указанного в вашем PATH через профиль оболочки. Таким образом, плагин Sniffle может не отображаться в интерфейсах extcap, если PySerial не установлен для Python из Xcode. Чтобы это исправить, вы можете отредактировать строку shebang в файле `sniffle_extcap.py`, чтобы она указывала на Python с установленным PySerial, например на Homebrew Python по пути `/opt/homebrew/bin/python3`, а не на `/usr/bin/env python3`.
В Windows вы можете скопировать следующие файлы и каталоги из директории `python_cli` в вашу персональную папку Extcap:```
sniffle/
sniffle_extcap.py
sniffle_extcap.bat
В Windows может потребоваться отредактировать sniffle_extcap.bat чтобы указать расположение
интерпретатора python, если каталог установки не включен в PATH, например:```
@echo off
C:\my_python_install\python.exe "%~dp0sniffle_extcap.py" %*
После установки плагина перезапустите Wireshark или выберите *Capture* > *Refresh Interfaces*, чтобы включить интерфейс Sniffle.
## Функциональность передачи
В то время как оригинальная прошивка Sniffle 2019 года была исключительно пассивным слушателем, более поздние версии прошивки добавили различные функции для активной передачи пакетов различными способами. Текущая прошивка Sniffle поддерживает работу как в качестве GAP-центрального, так и периферийного устройства, включая активное сканирование, устаревшую и расширенную рекламу, инициирование соединений и подключение в роли центрального или периферийного устройства. Скрипт `scanner.py` выполняет активное сканирование. Скрипт `initiator.py` инициирует соединение с периферийным устройством, а затем действует как подключенное центральное устройство. Скрипт `advertiser.py` выполняет устаревшую рекламу и принимает запросы на соединение от других устройств, переходя в роль подключенного периферийного устройства.
Функциональность передачи Sniffle немного отличается от традиционного HCI-контроллера Bluetooth, поскольку она дает вам очень низкоуровневый контроль над точными PDU, отправляемыми на канальном уровне. Этот низкоуровневый контроль позволяет коду на стороне хоста реализовывать дополнительные функции, такие как fuzz-тестирование канального уровня или релейные атаки на канальном уровне.
Я еще не нашел времени формально документировать API прошивки Sniffle, хотя он достаточно очевиден при взгляде на его реализацию на стороне хоста в `sniffle_hw.py`. Активное сканирование (которое передает запросы сканирования) активируется `cmd_scan`. Инициирование соединения запускается `cmd_connect`, хотя проще всего использовать обертку `initiate_conn`. Реклама (опционально подключаемая) активируется `cmd_advertise` для устаревшей рекламы или `cmd_advertise_ext` для расширенной рекламы.
## Задержка UART XDS110
После исправления проблемы TI [EXT_EP-11735](https://sir.ext.ti.com/jira/browse/EXT_EP-11735) в середине 2024 года отладчик XDS110 (входящий в состав плат TI Launchpad) стал разумно обрабатывать высокие скорости передачи, такие как 2M (используемые Sniffle), без чрезмерной задержки. Однако последняя прошивка XDS110 по-прежнему использует буферизованную работу UART на основе DMA на таких скоростях, и поэтому может по-прежнему вносить задержку до 30 мс. Эта задержка несущественна для использования в качестве сниффера, но может быть вредна для более активных операций, таких как код на стороне хоста, выступающий в роли GATT-клиента или сервера, или выполнение релейных атак. Описанная ниже модификация прошивки XDS110 версии 3.0.0.28 для работы на основе прерываний может по-прежнему значительно снизить задержку для таких чувствительных ко времени операций. Должно быть возможно сделать аналогичную модификацию для последней прошивки XDS110, но я не нашел времени изучить ее и найти нужные биты для изменения.
В середине 2024 года и ранее прошивка отладчика TI XDS110 (входящего в состав плат Launchpad) имела нежелательное поведение в своем мосту USB-UART, при котором на высоких скоростях передачи могла возникать сильная задержка, особенно при частых малых записях, как это делает прошивка Sniffle. Эта проблема существовала годами и все еще присутствовала в апреле 2024 года с прошивкой XDS110 3.0.0.28, поставляемой с UniFlash 8.6.0. Коренная причина заключалась в том, что при работе на основе DMA прошивка XDS110 накапливала данные UART в буфере, размер которого был пропорционален скорости передачи, и ждала заполнения этого буфера перед передачей данных. Была логика для очистки этого буфера, если новые данные не поступали в течение последних 15 миллисекунд, но эта логика очистки никогда не срабатывала, когда Sniffle часто добавлял небольшие пакеты из событий соединения каждые несколько миллисекунд. В результате этого неоптимального поведения данные сниффера могли появляться на хосте с задержанными пакетами.
Прошивка XDS110 также имеет альтернативный режим работы UART, при котором каждый прием UART вызывает прерывание, в результате чего данные немедленно передаются на хост. Этот режим работы на основе прерываний имеет гораздо меньшую задержку. Однако прошивка использует его только для скоростей передачи ниже 230400. В качестве обходного пути для высокой задержки режима DMA при частых малых порциях данных вы можете изменить прошивку, чтобы использовать мост USB-UART на основе прерываний даже на высоких скоростях передачи (например, 2M бод, используемые Sniffle). В прошивке 3.0.0.28 (поставляемой с Uniflash 8.6.0) вы можете отредактировать байты по смещению 0x0A14 с 61 3F на 00 1F. Это изменит скорость переключения на работу UART на основе DMA с 230400 на 0x200000 (2097152).
Имейте в виду, что описанные выше смещения и модификации байтов действительны только для прошивки 3.0.0.28 и будут отличаться для других версий прошивки. Прошивка недопустимой прошивки на ваш отладчик может повредить его, и мы не несем ответственности за любой возможный ущерб.
Следующие команды могут быть использованы в Linux для изменения прошивки XDS110 для низкой задержки UART на высоких скоростях передачи:```
cd ~/ti/uniflash_8.6.0/deskdb/content/TICloudAgent/linux/ccs_base/common/uscif/xds110/
cp firmware_3.0.0.28.bin firmware_3.0.0.28_fastuart.bin
printf '\x00\x1f' | dd of=firmware_3.0.0.28_fastuart.bin bs=1 seek=$((0x0A14)) conv=notrunc
sha256sum firmware_3.0.0.28_fastuart.bin
Перед прошивкой убедитесь, что SHA256-сумма модифицированной прошивки равна c226f2e9cb2b9f0bc111ca11f2903d58d4065293468623428c0e8eeb22086dcf. После проверки выполните следующие команды для прошивки модифицированного отладчика XDS110:```
./xdsdfu -m
./xdsdfu -f firmware_3.0.0.28_fastuart.bin -r
## Релейная передача трафика канального уровня
Sniffle может использоваться для выполнения [релейной атаки на канальном уровне](https://hardwear.io/netherlands-2022/presentation/bluetooth-LE-link-layer-relay-attacks.pdf)
трафика Bluetooth LE. При выполнении релейной атаки одно устройство Sniffle выступает в роли
BLE-центрального (с использованием `relay_master.py`), а второе устройство Sniffle — в роли BLE-периферийного
(с использованием `relay_slave.py`). Термины «ведущий» и «ведомый» являются устаревшими для обозначения
центрального и периферийного устройств BLE соответственно. Релейный ведущий захватывает рекламные данные и
данные ответа на сканирование от подлинного периферийного устройства, затем передает их релейному ведомому.
Релейный ведомый передает рекламные объявления и ответы на сканирование, имитируя подлинное периферийное
устройство, и принимает соединения. После принятия соединения релейный ведомый уведомляет релейного ведущего,
который затем устанавливает соединение с подлинным периферийным устройством. С этого момента все пакеты канального
уровня пересылаются между релейным ведущим и ведомым.
Скрипт релейного ведущего предоставляет функциональность для запроса более быстрых интервалов
соединения на одной или обеих сторонах реле для уменьшения задержки. Если используется XDS110
в качестве моста USB/UART, имейте в виду, что прошивка XDS110 вносит дополнительную задержку
в реле, если не модифицировать ее, как описано выше.
Обратите внимание, что скрипт релейного ведущего создает сетевой слушатель, который привязывается
ко всем интерфейсам (0.0.0.0), и сетевой протокол, используемый для взаимодействия
между релейными устройствами, не обеспечивает безопасности. Используйте эти скрипты только в
доверенных сетевых средах.
Использование скриптов релейного ведущего (центрального) и ведомого (периферийного) показано ниже.
В настоящее время скрипты реле не поддерживают расширенную рекламу.```
usage: relay_master.py [-h] [-s SERPORT] [-c {37,38,39}] [-m MAC] [-i IRK] [-S STRING]
[-P] [-q] [-Q PRELOAD] [-f] [-p] [-F] [-o OUTPUT]
Relay master script for Sniffle BLE5 sniffer
options:
-h, --help show this help message and exit
-s, --serport SERPORT
Sniffer serial port name
-c, --advchan {37,38,39}
Advertising channel to listen on
-m, --mac MAC Specify target MAC address
-i, --irk IRK Specify target IRK
-S, --string STRING Specify target by advertisement search string
-P, --public Supplied MAC address is public
-q, --quiet Don't show empty packets
-Q, --preload PRELOAD
Preload expected encrypted connection parameter changes
-f, --fastslave Relay slave should request a fast connection interval
-p, --pause Wait for key press on master before relaying
-F, --fastmaster Relay master should specify a fast connection interval
-o, --output OUTPUT PCAP output file name
ВВОД:``` usage: relay_slave.py [-h] [-s SERPORT] [-M MASTERADDR] [-q]
Relay slave script for Sniffle BLE5 sniffer
options: -h, --help show this help message and exit -s, --serport SERPORT Sniffer serial port name -M, --masteraddr MASTERADDR IP address of relay master -q, --quiet Don't show empty packets