Программирование ARM Сканирование сетей BLE в Linux Tue, January 25 2022  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Сканирование сетей BLE в Linux Печать
Добавил(а) microsin   

Bluetooth, как мы уже знаем, стала самой популярной и широко используемой во всем мире технологией беспроводной связи. С быстрым ростом развития Интернета вещей (IoT) в технологии Bluetooth, группа стандартов Bluetooth Special Interest Group (SIG) предпринимает постоянные усилия для увеличения скорости передачи с максимальным акцентом на маяки (beacons), медицинские датчики, поддержку устройств для развлечения и фитнеса.

Bluetooth Low Energy (BLE) это часть спецификации Bluetooth 4.0, которая дополнительно включает в себя классические устройства (Classic Bluetooth) и высокоскоростные протоколы (Bluetooth High Speed Protocols). В сравнении с классическими устройствами Bluetooth, устройства BLE предназначены для приложений с малым потреблением энергии (что красноречиво обозначено в названии), с сохранением примерно тех же дистанций для радиообмена данными. BLE работает по принципу "всегда выключено", и передает радиосигналы с минимально допустимыми порциями данных, только когда это необходимо. Это значительно уменьшает потребление тока устройствами BLE, что идеально подходит для применений, когда необходимо постоянное соединение с низкой скоростью передачи данных. BLE отлично подходит для пультов управления телевизором (TV remote), но не для беспроводной передачи медиа-информации (звук, видео), когда требуется передать большой объем данных. Технология BLE встроена во многие современные устройства - смартфоны, "умные" телевизоры (smart TV), медицинское оборудование, бытовое оборудование (пылесосы, кофе-машины и т. п.).

Примечание: непонятные термины и сокращения, встречающиеся в этом описании, см. в Словарике [2].

Первоначально Nokia разработала BLE для собственного проекта под названием "WIBREE", который позже был принят на вооружение Bluetooth SIG. BLE была задумана с акцентом на быструю установку соединения и повышенную энергоэффективность.

Чем BLE выделяется по сравнению с другими технологиями передачи данных по радио?

• Позволяет организовать обмен информацией между разными программно-аппаратными платформами: можно довольно просто взаимодействовать с широким спектром устройств. BLE работает на Android, iOS, Linux, Windows Phone, Windows 8/10, OS X.
• Быстрая установка взаимодействия (pairing speed).
• Помогает поддерживать соединение в течение длительных интервалов времени.
• Значительно снижает стоимость реализации.
• Высокая энергоэффективность.

Звучит хорошо, но так ли это на самом деле? Хороший вопрос с точки зрения безопасности.

Фактически BLE это просто протокол. На совести производителей оборудования лежит реализация защиты своих устройств BLE. Известно, что даже самый сильный криптографический протокол не работает из-за того, что генератор случайных чисел не является "достаточно случайным". То же самое относится и к BLE. Таким образом можно утверждать, что защита связи BLE находится в руках разработчиков, которые используют BLE.

Рассмотрим три основные уязвимости, которые BLE может подвергнуть своих пользователей:

Eavesdropping: название (eavesdropping переводится как "подслушивание") нам говорит о том, что передаваемые по радио данные, которыми обмениваются два связавшихся между собой устройства, можно "прослушать" с помощью стороннего оборудования. Соединение внутри пары устройств обозначает цепь доверия между ними. Цепь разрывается, когда отключается одно из устройств. Атакующий может использовать идентификационный номер одного из устройств (device unit number) для получения доступа к другим устройствам Bluetooth, доступным для соединения. Даже если ключи шифрования/дешифровки на устройстве должны были быть удалены, атакующий может подобрать (brute force) PIN-кода устройства, зная ID устройства, полученный с помощью Bluetooth Sniffer. Как только был вычислен PIN-код, может быть легко захвачено управление устройством.

Man in the Middle (MITM, атака "человек посередине"): в этом случае стороннее устройство представляется как два доверенных устройства, организуя через себя прозрачный обмен данными между этими двумя устройствами. Эти два устройства обмениваются данными друг с другом, ничего не подозревая о том, что на самом деле обмен происходит через третье устройство. Это третье устройство тогда получает полный контроль над радиообменом - оно может записывать передаваемые данные в свою память, удалять передаваемые данные или подменять их своими данными.

Denial of Service & Fuzzing Attack: этот тип атак обозначает нарушение связи между устройствами, возможно организованное третьей стороной. Поскольку большинство беспроводных устройств сегодня работают от встроенных батареек, есть риск возникновения ситуации атаки типа "отказ в обслуживании" (Denial of Service, DoS). Атаки DoS создают возможность частых сбоев связи из-за полного расхода энергии батареи. Fuzzing-атаки приводят к сбоям в системе связи, когда атакующий формирует неправильно сформированные или не стандартные пакеты (malformed, non-standard data), передавая их по радио в устройства Bluetooth и проверяя их ответ, что может вызвать чрезмерную нагрузку на атакуемые устройства и нарушить их работоспособность.

[Основные концепции BLE]

В технологии BLE существует две базовые концепции.

GAP - Generic Access Profile (профиль общего доступа).
GATT - Generic Attribute Protocol (протокол обмена основными атрибутами).

Generic Access Profile (GAP). Эта концепция отвечает за соединения и радиооповещения (advertising). GAP дает возможность "увидеть" оповещающее о себе устройство в радиосети BLE, и это играет основную роль в том, как устройства BLE взаимодействуют с другими устройствами.

GAP подразумевает 2 роли устройств при установке радиообмена:

Peripheral devices (периферийные устройства). Обычно это маленькие, маломощные устройства, работающие от батареек, к которым могут подключаться другие устройства, обычно более сложные и мощные. Хороший пример такого устройства - датчик сердцебиения (Heart Rate Monitor, HRM sensor). Периферийное устройство оповещает от себе advertising-пакетами и действует как сервер в сети BLE, к которому могут подключаться клиенты BLE.

Central devices (центральные устройства). Обычно это сотовые телефоны или другие подобные гаджеты, у которых больше памяти и вычислительной мощности. Центральные устройства работают как клиенты BLE, прослушивая advertising-пакеты и осуществляя сеанс подключения к нужному периферийному устройству.

Здесь был упомянут процесс оповещения (advertising). Периферийное устройство может передавать advertising-данные каждые 2 (в принципе этот интервал устанавливается разработчиком, и может быть любым). Если центральное устройство готово прослушать advertisement-пакеты, то оно может отвечать на них запросом ответа (scan response). В ответ на этот запрос периферийное устройство будет передавать данные ответа на запрос (scan response data). Таким образом, центральное и периферийное устройства получают оповещение друг о друге и соединяются друг с другом.

Generic Attribute Protocol (GATT). В общем протоколе данных BLE, известном как протокол атрибутов (Attribute Protocol), концепция GATT определяет, каким образом два устройства BLE обмениваются данными друг с другом данными. Это вводит еще две дочерние концепции BLE - служба (или сервис, service) и характеристика службы (characteristic). Этот протокол GATT сохраняет все службы и их характеристики в специальную таблицу поиска атрибутов (lookup table), используя для этого 16-разрядные универсальные идентификаторы (UUID). Многие значения UUID заранее определены организацией Bluetooth SIG для определенного назначения [4] (например, характеристике значения сердцебиения назначен UUID BLE_UUID_HEART_RATE_SERVICE 0x180D). Важно отметить, что GATT становится инициированным только после того, как завершится advertising-процесс, регулируемый GAP.

Итак, GATT формируют следующие две концепции. Обе эти концепции находятся в периферийном устройстве, центральное устройство получает к ним доступ:

• Сервисы
• Характеристики

Сервисы (Services). Сервис можно представить себе как шкаф, в котором есть выдвижные ящики, называемые в свою очередь характеристиками. В периферийном устройстве обычно реализовано 2 службы, но может быть одна служба или несколько служб. В службе может быть одна или несколько характеристик. Каждая служба в устройстве уникально идентифицируется с помощью UUID (Universally Unique IDentifier), который может быть длиной 16 бит для официально зарегистрированных служб, или 128 бит для пользовательских служб (custom services, т. е. это службы, произвольно созданные производителем устройства).

Характеристики (Characteristics). Это наиболее фундаментальная концепция для транзакции GATT. Каждая характеристика содержит в себе одну порцию данных, относящихся к сервису, и каждая характеристика снабжена уникальным идентификатором UUID, который однозначно отличает её от других характеристик. Например, это датчик сердцебиения HRM sensor содержит характеристику, у которой UUID = 0x180D, и из этой характеристики можно прочитать значение частоты пульса.

Организация SIG предоставляет информационные таблицы назначенных стандартных идентификаторов для сервисов и характеристик различных устройств BLE. Любое устройство BLE, которое претендует на соответствие стандарту, должно использовать идентификаторы UUID, которые организация SIG выделила для их приложений. Например, официальному идентификатору для передаваемой мощности (TX power UUID) SIG назначила значение 0x1804. Приложение устройства маячка BLE (beacon), которое было просканировано приложением nRF Connect [5], должно иметь такой же TX power UUID, как было назначено спецификациями SIG.

[Инструментарий для исследования сетей BLE]

Linux предоставляет самую лучшую поддержку для BLE. Чтобы использовать BLE, нам надо установить стек Bluetooth (BlueZ). Его можно установить, запустив команду:

pi@raspberrypi:~ $ sudo apt-get install bluez

Мы будем использовать платку Raspberry Pi 4 model B [6] с операционной системой Raspberry Pi Desktop (порт Linux Debian), на которой установлен пакет BlueZ. Можно для той же цели использовать обычный компьютер PC или ноутбук, где установлена Ubuntu. Raspberry Pi будет работать как центральный шлюз для обмена с другими периферийными устройствами. Назначения стека BlueZ - программировать и реализовать беспроводные стандарты Bluetooth.

На моей платке Raspberry Pi пакет blueZ уже был установлен, поэтому установщик пакетов вывел следующие сообщения:

pi@raspberrypi:~ $ sudo apt-get install bluez
Reading package lists... Done
Building dependency tree
Reading state information... Done
bluez is already the newest version (5.50-1.2~deb10u2+rpt1).
bluez set to manually installed.
The following package was automatically installed and is no longer required:
  python-colorzero
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
pi@raspberrypi:~ $ sudo apt autoremove
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
  python-colorzero
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 130 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 168375 files and directories currently installed.)
Removing python-colorzero (1.1) ...
pi@raspberrypi:~ $

После установки пакета BlueZ нам понадобятся две утилиты, чтобы сканировать сеть BLE, подключаться к устройствам, читать и записывать их данные:

hcitool
gatttool

Перед тем, как начать экспериментировать, нам нужно просканировать сеть BLE, чтобы обнаружить устройства, находящиеся поблизости. Если найдется устройство BLE, то мы должны выяснить, как к нему подключиться, как прочитать/записать данные. Есть некая надежда, что в устройстве обнаружится уязвимость, которую можно будет впоследствии эксплуатировать. Для этой цели незаменима утилита hcitool.

hcitool. Эта утилита использует интерфейс контроллера хоста (Host Controller Interface, HCI) в центральном устройстве (в нашем случае это будет Raspberry Pi), чтобы коммуницировать с устройствами BLE и читать/записывать их данные. Таким образом, hcitool полезна для обнаружения устройств BLE в текущем окружении, которые оповещают (advertise) о себе в сети, и после этого hcitool может быть полезна для чтения и изменения их значений (характеристик).

Значения/данные могут быть изменены только если заранее известны соответствующие служба и характеристика, откуда поступают (или куда поступают) данные. Чтобы обнаружить нужные службы и их характеристики, можно использовать другую утилиту - gatttool.

gatttool. Как было отмечено в предыдущем абзаце, gatttool в основном полезна для поиска идентификаторов служб и характеристик в устройстве BLE, их параметров доступа BLE, чтобы данные атакуемой цели должны считываться/записываться в целях исследования (уязвимостей).

[hciconfig]

Утилита hciconfig нужна только если в системе установлено несколько адаптеров Bluetooth, и для сканирования Вы хотите использовать выбранный адаптер. Основные команды hciconfig приведены в таблице 1. Полная справка по командам доступна по man hciconfig (см. также врезку ниже).

Таблица 1. Команды общего назначения.

Команда Функция
hciconfig Используется для конфигурирования локальных устройств и адаптеров Bluetooth.  Мы можем запустить эту команду, чтобы получить список аппаратных устройство BLE (dongles), подключенных к нашему компьютеру, вместе с базовой информацией о них.
hciconfig hciX up Включит (активирует) устройство Bluetooth с именем hciX(1).

Примечание (1): если на компьютере только один адаптер Bluetooth (как например у Raspberry Pi), то его имя обычно hci0.

HCICONFIG(1)   Linux System Administration      HCICONFIG(1)
 
NAME
       hciconfig - конфигурирование устройств Bluetooth
 
SYNOPSIS
       hciconfig -h
       hciconfig [-a]
       hciconfig [-a] hciX [command [command parameters]]
 
ОПИСАНИЕ
       hciconfig используется для конфигурирования устройств Bluetooth devices. Здесь
       hciX это имя устройства, установленного в системе. Если hciX не предоставлено,
       то hciconfig напечатает имя и базовую информацию о всех устройствах Bluetooth,
       установленных в системе. Если hciX предоставлено, но не указана ни одна из команд,
       то будет распечатана информация только об устройстве hciX. Базовая информация
       это тип интерфейса, BD-адрес, ACL MTU, SCO MTU, флаги (up, init, running, raw,
       page scan enabled, inquiry scan enabled, inquiry, authentication enabled,
       encryption enabled).
 
ОПЦИИ
       -h, --help
              Выдаст список возможных команд.
 
       -a, --all
              Отличная от базовой информация, функции печати (print features), тип
              пакета (packet type), политика соединения (link policy), режим соединения
              (link mode), имя (name), класс (class), версия (version).
 
КОМАНДЫ
       up     Открыть и инициализировать устройство HCI.
 
       down   Закрыть устройство HCI.
 
       reset  Сбросить устройство HCI.
 
       rstat  Сбросить счетчики статистики.
 
       auth   Разрешить аутентикацию (установит устройство в security mode 3).
 
       noauth Запретить аутентикацию.
 
       encrypt
              Разрешить шифрование (установит устройство в security mode 3).
 
       noencrypt
              Запретить шифрование.
 
       secmgr Разрешить security manager (поддержка со стороны текущего ядра ограничена).
 
       nosecmgr
              Запретить security manager.
 
       piscan Разрешить сканирование страниц и запросов (page and inquiry scan).
 
       noscan Запретить сканирование страниц и запросов.
 
       iscan  Разрешить сканирование запросов (inquiry scan), запретить сканирование
              страниц (page scan).
 
       pscan  Разрешить сканирование страниц (page scan), запретить сканирование запросов
              (inquiry scan).
 
       ptype [type]
              Без указания type отобразит текущие типы пакетов. Иначе будут установлены
              все указанные типы пакетов. Здесь type это список типов пакетов, отделенных
              друг от друга запятой. Возможные типы пакетов: DM1, DM3, DM5, DH1, DH3, DH5,
              HV1, HV2, HV3.
 
       name [name]
              Без указания name печатает локальное имя. Иначе установит локальное имя в name.
 
       class [class]
              Без указания class печатает класс устройства. Иначе установит класс устройства
              в class. Здесь class это 24-битное hex-число, описывающее класс устройства,
              как это указывается в section 1.2 документа Bluetooth Assigned Numers.
 
       voice [voice]
              Без указания voice печатает установки voice.Иначе установит настройки voice
              в voice. Здесь voice это 16-разрядное hex-число, описывающее настройки voice.
 
       iac [iac]
              Без указания iac печатает текущие установки IAC. Иначе установит IAC в iac.
 
       inqtpl [level]
              Без указания level напечатает текущий уровень мощности запроса передачи.
              Иначе установит текущий уровень мощности запроса передачи в level.
 
       inqmode [mode]
              Без указания mode распечатает текущий режим запроса. Иначе установит текущий
              режим запроса в mode.
 
       inqdata [data]
              Без data напечатает текущие данные запроса. Иначе установит данные запроса в data.
 
       inqtype [type]
              Без type напечатает текущий тип запроса сканирования. Иначе установит тип
              запроса сканирования в type.
 
       inqparams [win:int]
              Без win:int напечатает окно сканирования запроса и интервал. Иначе установит окно
              сканирования в win слотов, и интервал запроса сканирования в int слотов.
 
       pageparms [win:int]
              Без win:int, напечатает окно сканирования страницы и интервал. Иначе установит окно
              сканирования страницы в win слотов, и интервал сканирования страницы в int слотов.
 
       pageto [to]
              Без указания to напечатает таймаут страницы. Иначе установит таймаут страницы
              в .I to слотов.
 
       afhmode [mode]
              Без mode напечатает текущий режим AFH. Иначе установит режим AFH в mode.
 
       sspmode [mode]
              Без mode напечатает текущий режим упрощенной установки связи (Simple Pairing
              mode). Иначе установит режим Simple Pairing в значение mode.
 
       aclmtu mtu:pkt
              Установит ACL MTU в mtu байт, и размер буфера ACL в pkt пакетов.
 
       scomtu mtu:pkt
              Установит SCO MTU в mtu байт, и размер буфера SCO в pkt пакетов.
 
       delkey < bdaddr >
              Эта команда удалит из устройства сохраненный ключ соединения (link key) для bdaddr.
 
       oobdata
              Получит локальные данные OOB (что делает недостоверными ранее прочитанные данные).
 
       commands
              Отобразит поддерживаемые команды.
 
       features
              Отобразит функции устройства.
 
       version
              Отобразит информацию версии.
 
       revision
              Отобразит информацию ревизии.
 
       lm [mode]
              Без mode напечатает режим соединения (link mode). MASTER или SLAVE соответственно
              обозначают запрос для перехода в режим master, или для того, чтобы остаться
              в режиме slave, когда поступает запрос на соединение. Дополнительное ключевое
              слово ACCEPT означает, что соединения в базовом диапазоне будут приниматься, даже
              если нет прослушивающих сокетов AF_BLUETOOTH. Здесь mode это NONE, или список
              отделенных друг от друга запятой ключевых слов, где возможны ключевые слова MASTER
              и ACCEPT. NONE установит политику соединения (link policy) в поведение по умолчанию,
              чтобы оставаться slave и не принимать соединения в базовом диапазоне, если нет
              прослушивающих сокетов AF_BLUETOOTH. Если присутствует MASTER, то устройство будет
              запрашивать переход в состояние master, если поступил запрос соединения. Если
              присутствует ACCEPT, то устройство будет принимать соединения в базовом диапазоне,
              даже когда нет прослушивающих AF_BLUETOOTH сокетов.

[hcitool]

Утилита hcitool используется для конфигурирования соединений Bluetooth, и посылает некоторые специальные команды устройствам Bluetooth. См. также man hcitool, или врезку ниже.

Таблица 2. Основные команды hcitool.

Команда Функция
hcitool -i hciX Использовать для команды интерфейс hciX. Если не указано, то по умолчанию будет использоваться первый доступный интерфейс.
hcitool scan Запуск сканирования классических (не BLE) устройств Bluetooth, которые находятся в режиме, доступном для распознавания (discoverable mode).
hcitool lescan Запуск сканирования BLE-устройств.

HCITOOL(1)     Linux System Administration               HCITOOL(1)
 
NAME
       hcitool - конфигурирует соединения Bluetooth.
 
SYNOPSIS
       hcitool [-h]
       hcitool [-i < hciX >] [command [command parameters]]
 
ОПИСАНИЕ
       hcitool используется для конфигурирования соединений Bluetooth и для отправки некоторых
       специальных команд в устройства Bluetooth. Если не предоставлена command, или если
       используется опция -h, то hcitool распечатает информацию по использованию (usage)
       и завершит работу.
 
ОПЦИИ
       -h     Выдаст список доступных команд.
 
       -i < hciX >
              Команда применяется к устройству hciX. Здесь hciX должно быть именем установленного
              устройства Bluetooth. Если не указано, то команда будет отправлена в первое доступное
              устройство Bluetooth.
 
КОМАНДЫ
       dev    Отобразит локальные устройства.
 
       inq    Опрашивает remote-усройства. Для каждого обнаруженного устройства печатаются адрес
              устройства Bluetooth, смещение частоты тактов (clock offset) и класс (class).
 
       scan   Запрашивает список remote-устройств. Для каждого обнаруженного устройства печатаются
              его имя (device name).
 
       name < bdaddr >
              Печатает device name для remote-устройства по указанному Bluetooth-адресу bdaddr.
 
       info < bdaddr >
              Печатает device name, версию и поддерживаемые функции для remote-устройства
              по указанному Bluetooth-адресу bdaddr.
 
       spinq  Запускает процесс периодических опросов (periodic inquiry). Результаты опроса
              не печатаются.
 
       epinq  Выход из процесса периодических опросов (periodic inquiry).
 
       cmd < ogf > < ocf > [parameters]
              Отправит произвольную HCI-команду в локальное устройство. Здесь ogf, ocf
              и parameters это hex-байты.
 
       con    Отобразит активные соединения в базовом диапазоне.
 
       cc [--role=m|s] [--pkt-type=< ptype >] < bdaddr >
              Создаст соединение в базовом диапазоне с remote-устройством по Bluetooth-адресу
              bdaddr. Опция --pkt-type задает список разрешенных типов пакетов. Здесь ptype это
              список типов пакетов, где каждый тип отделен друг от друга запятой. Возможные
              типы пакетов DM1, DM3, DM5, DH1, DH3, DH5, HV1, HV2, HV3. По умолчанию допускаются
              все типы пакетов. Опция --role может иметь значение m (на разрешать смену роли,
              оставаться master) или s (разрешить переключение роли, перейти в режим slave,
              если пир запросит переход в режим master). По умолчанию используется m.
 
       dc < bdaddr > [reason]
              Удаляет соединение в базовом диапазоне с remote-устройством по Bluetooth-адресу
              bdaddr. Здесь reason может быть одним из кодов ошибки Bluetooth HCI. По умолчанию
              19 для соединений, завершенных по инициативе пользователя. Указываемое значение
              должно быть в десятичном формате.
 
       sr < bdaddr > < role >
              Переключение роли соединения базового диапазона с remote-устройством в режим
              master или slave.
 
       cpt < bdaddr > < packet types >
              Меняет типы пакетов для соединения в базовом диапазоне для устройства по
              Bluetooth-адресу bdaddr. Параметр packet types это список типов пакетов,
              где каждый тип отделен друг от друга запятой. Допускаются типы пакетов DM1,
              DM3, DM5, DH1, DH3, DH5, HV1, HV2, HV3.
 
       rssi < bdaddr >
              Отображает информацию об уровне принимаемого сигнала (received signal strength
              information) для соединения с устройством по Bluetooth-адресу bdaddr.
 
       lq < bdaddr >
              Отобразит качество соединения (link quality) с устройством по Bluetooth-адресу
              bdaddr.
 
       tpl < bdaddr > [type]
              Отобразит уровень передаваемой мощности для соединения с устройством по
              Bluetooth-адресу bdaddr. Здесь type может быть 0 для текущего уровня передаваемой
              мощности (по умолчанию) или 1 для максимального уровня передаваемой мощности.
 
       afh < bdaddr >
              Отобразит карту каналов AFH для соединения с устройством по Bluetooth-адресу bdaddr.
 
       lp < bdaddr > [value]
              Без value отобразит настройки политики соединения (link policy) для соединения
              с устройством по Bluetooth-адресу bdaddr. Если указано value, то установит link
              policy для этого соединения в value. Возможны значения для value: RSWITCH, HOLD,
              SNIFF и PARK.
 
       lst < bdaddr > [value]
              Без value отобразит таймаут супервизора соединения (link supervision timeout)
              с устройством по Bluetooth-адресу bdaddr. Если указано value, то установит link
              supervision timeout для этого соединения в значение value слотов, или в бесконечность,
              если value равно 0.
 
       auth < bdaddr >
              Запрашивает аутентикацию для устройства с Bluetooth-адресом bdaddr.
 
       enc < bdaddr > [encrypt enable]
              Разрешает или запрещает шифрование для устройства по Bluetooth-адресу bdaddr.
 
       key < bdaddr >
              Меняет ключ линка (link key) соединения для устройства по Bluetooth-адресу bdaddr.
 
       clkoff < bdaddr >
              Считывает смещение тактов (clock offset) для устройства по Bluetooth-адресу bdaddr.
 
       clock [bdaddr] [which clock]
              Считывает такты для для устройства по Bluetooth-адресу bdaddr. Здесь clock может
              быть 0 для локальных тактов, или 1 для piconet clock (по умолчанию).
 
       lescan [--privacy] [--passive] [--whitelist] [--discovery=g|l] [--duplicates]
              Запускает сканирование BLE.
 
       leinfo [--static] [--random] < bdaddr >
              Получает информацию remote-устройства BLE.
 
       lewladd [--random] < bdaddr >
              Добавляет устройство с белый список BLE (White list BLE).
 
       lewlrm < bdaddr >
              Удаляет устройство из белого списка BLE.
 
       lewlsz
              Считывает размер белого списка BLE.
 
       lewlclr
              Очищает белый список BLE.
 
       lerladd [--local irk] [--peer irk] [--random] < bdaddr >
              Добавляет устройство а список распознавания (BLE Resolving List).
 
       lerlrm < bdaddr >
              Удаляет устройство из списка распознавания (BLE Resolving List).
 
       lerlclr
              Очистит список распознавания (BLE Resolving List).
 
       lerlsz
              Прочитает размер списка распознавания (BLE Resolving List).
 
       lerlon
              Включает разрешение адреса BLE (BLE Address Resolution).
 
       lerloff
              Выключает разрешение адреса BLE (BLE Address Resolution).
 
       lecc [--static] [--random] < bdaddr > | [--whitelist]
              Создает соединение BLE.
 
       ledc < handle > [reason]
              Завершает соединение BLE.
 
       lecup < handle > < min > < max > < latency > < timeout >
              Обновление соединения BLE.

Пример сканирования устройств BLE:

pi@raspberrypi:~ $ sudo stdbuf -oL hcitool lescan | grep "Nordic"
EE:26:F7:17:E4:D2 Nordic
E7:36:C9:99:25:85 Nordic
F9:6C:9E:DD:0A:E2 Nordic
CE:17:00:58:53:57 Nordic

Команда grep используется для фильтрации вывода информации о найденных устройствах. Здесь stdbuf -oL используется, чтобы избежать промежуточной буферизации вывода hcitool, и необходимые искомые отфильтрованные значения отображались сразу [3].

[gatttool]

Утилита gatttool позволяет распознавать GATT. С её помощью можно прочитать структуру GATT, а также читать и записывать характеристики GATT. См. также полный список команд в результатах вывода man gatttool, или врезку ниже.

Таблица 3. Основные команды gatttool.

Команда Функция
gatttool -I Запуск gatttool в интерактивном режиме.
gatttool -t random -b [adr] -I Запуск gatttool в интерактивном режиме, с использованием случайного адреса BLE. Соединение с remote-устройством Bluetooth, у которого адрес adr.
primary Проверка наличия доступных сервисов у подключенного устройства BLE.
characteristic Проверка наличия доступных характеристик у подключенного устройства BLE, откуда мы могли бы прочитать данные.
char-desc Распознавание описателя характеристики (Characteristics Descriptor Discovery). Проверка для n количества дескрипторов (handles).
char-read-hnd Чтение характеристики по её дескриптору (handle).
char-write-req Запись значений в характеристику.

GATTTOOL(1)    General Commands Manual                GATTTOOL(1)
 
NAME
       gatttool - утилита для работы с устройством Bluetooth Low Energy (BLE)
 
SYNOPSIS
       gatttool
 
ОПИСАНИЕ
       gatttool это инструмент, который может использоваться для манипуляции атрибутами
                устройства BLE.USAGE
       gatttool [опция...]
 
       Help по опциям:
         -h, --help                 Показать подсказку по опциям.
         --help-all                 Показать подсказку всем опциям.
         --help-gatt                Показать все команды GATT.
         --help-params              Показать все аргументы Primary Services/Characteristics.
         --help-char-read-write     Показать все аргументы Characteristics Value/Descriptor
                                    Read/Write
       Опции приложения:
         --i, ---adapter=hciX                      Указать адаптер локального интерфейса
         --b, ---device=MAC                        Указать Bluetooth-адрес remote-устройства
         --t, ---addr-type=[public | random]       Установить тип адреса LE. По умолчанию: public
         --m, ---mtu=MTU                           Указать размер MTU
         --p, ---psm=PSM                           Указать PSM для GATT/ATT поверх BR/EDR
         --l, ---sec-level=[low | medium | high]   Установить security level. По умолчанию: low
         --I, ---interactive                       Использовать интерактивный режим

Пример интерактивной сессии с подключением к устройству BLE, у которого MAC-адрес D9:9D:36:54:C5:26:

pi@raspberrypi:~ $ sudo gatttool -t random -b D9:9D:36:54:C5:26 -I
[D9:9D:36:54:C5:26][LE]> connect
Attempting to connect to D9:9D:36:54:C5:26
Connection successful
[D9:9D:36:54:C5:26][LE]>

Примечание: здесь указана опция -t random для того, чтобы избежать ошибки подключения "Error: connect error: Connection refused (111)" [7].

Пример чтения информации об идентификаторах служб (uuid:). Здесь также выдаются значения дескрипторов служб (attr handle:).

[D9:9D:36:54:C5:26][LE]> primary
attr handle: 0x0001, end grp handle: 0x0009 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x000a, end grp handle: 0x000a uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x000b, end grp handle: 0xffff uuid: 0000180D-0000-1000-8000-00805f9b34fb

Пример чтения информации об идентификаторах характеристик (uuid:). Здесь также выдаются свойства характеристик (char properties:) и значения дескрипторов хаоактеристик (char value handle:). Значения дескрипторов характеристик понадобятся для того, чтобы считывать и записывать характеристики.

[D9:9D:36:54:C5:26][LE]> characteristics
handle: 0x0002, char properties: 0x0a, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x02, char value handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x0008, char properties: 0x02, char value handle: 0x0009, uuid: 00002aa6-0000-1000-8000-00805f9b34fb
handle: 0x000c, char properties: 0x12, char value handle: 0x000d, uuid: 00002a99-0000-1000-8000-00805f9b34fb
handle: 0x000f, char properties: 0x0c, char value handle: 0x0010, uuid: 00002a3d-0000-1000-8000-00805f9b34fb

Пример чтения характеристики о её идентификатору UUID. Идентификатор указывается в HEX-формате, без префикса 0x:

[D9:9D:36:54:C5:26][LE]> char-read-uuid 2A3D
handle: 0x0010   value: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

[Ссылки]

1. Practical Guide to Hacking Bluetooth Low Energy site:blog.attify.com.
2. nRFxx: аббревиатуры и термины.
3. Grep hcitool lescan output stackoverflow.com.
4. Assigned Numbers BLE site:bluetooth.com.
5. Службы BLE, руководство для начинающих.
6. Raspberry Pi, быстрый старт.
7. Cannot connect to BLE device on Raspberry Pi site:stackoverflow.com.
8Сканирование Bluetooth-устройств на Raspberry Pi.

 

Добавить комментарий


Защитный код
Обновить

Top of Page