Программирование ARM Сканирование Bluetooth-устройств на Raspberry Pi Thu, November 21 2024  

Поделиться

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

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


Сканирование Bluetooth-устройств на Raspberry Pi Печать
Добавил(а) microsin   

Чтобы установить bluescan, понадобилось также установить libglib2.0-dev, libcairo2-dev, libgirepository1.0-dev. Подсказки на разрешение этих зависимостей давала команда pip3 install bluescan. Команды для установки пакетов нужно запускать с помощью утилиты повышения уровня доступа sudo.

$ sudo apt-get install libglib2.0-dev
$ sudo apt install libcairo2-dev
$ sudo apt install libgirepository1.0-dev
$ sudo pip3 install bluescan

Примечание: новые термины и сокращения, касающиеся технологии Bluetooth, см. в Словарике [4].

Ошибка заключается, как всегда, в проблеме зависимостей кода от библиотек, которые традиционно меняются при смене версии Python. В моей версии Python 2.7.16, установленной на Paspberry Pi [1], не хватало функции removesuffix (этот метод для str появился в версии 3.9+ Python), на что указывало сообщение об ошибке:

Traceback (most recent call last):
  File "/usr/local/bin/bluescan", line 6, in < module >
    from bluescan.__main__ import main
  File "/usr/local/lib/python3.7/dist-packages/bluescan/__main__.py", line 19, in < module >
    from .br_scan import BRScanner
  File "/usr/local/lib/python3.7/dist-packages/bluescan/br_scan.py", line 31, in < module >
    from .common import bdaddr_to_company_name
  File "/usr/local/lib/python3.7/dist-packages/bluescan/common.py", line 28, in < module >
    company_id = items[0].removesuffix('   (hex)')
AttributeError: 'str' object has no attribute 'removesuffix'

Я не стал заморачиваться с поиском библиотек или переустановкой Python (чтобы не начали вылезать проблемы с другими программами), и временно устранил ошибку, просто удалив вызов функции removesuffix:

#company_id = items[0].removesuffix('   (hex)')
company_id = items[0]

Впоследствии можно будет либо самому дописать функцию removesuffix, либо все-таки перейти на более новую версию Python.

[Сканирование классических устройств Bluetooth]

Классические устройства (Classic Bluetooth) могут использовать 3 технологии BR (Basic Rate), EDR (Enhanced Data Rate) и AMP (Alternate MAC/PHY). Поскольку все это относится к системе Basic Rate, можно выполнить сканирование следующим образом, пример сканирования клавиатуры Bluetooth v3.0 компании Oklick, модель 840S:

pi@raspberrypi:~ $ sudo bluescan -m br
Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused
 
(bluescan:4061): Gdk-CRITICAL **: 12:12:55.303: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed
 
(bluescan:4061): Gdk-CRITICAL **: 12:12:55.306: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed
[INFO] BR scanning on hci0 with timeout 10.24 sec
 
Addr: 0C:FC:85:4F:17:1C (Unknown)
Page scan repetition mode: 1 (R1)
Reserved: 0x00
CoD: 0x002540
    Service Class: 0b1
        Limited Discoverable Mode
    Major Device Class: 0b101, Peripheral (HID)
Clock offset: 0x62EB
RSSI: -61
Extended inquiry response:
    Complete Local Name: Bluetooth Keyboard
    Complete List of 16-bit Service Class UUIDs
        0x1124 HumanInterfaceDeviceService
 
[INFO] Inquiry completed
 
[INFO] Requesting the name of the scanned devices...
0C:FC:85:4F:17:1C: Bluetooth Keyboard

Примечание: сообщения "Unable to init server" и "'GDK_IS_DISPLAY (display)' failed" выводятся потому, что консоль была запущена не в графическом окружении рабочего стола, а просто из консоли SSH. На эти сообщения можно не обращать внимания.

Как показано в примере выше, сканированием BR-устройств мы можем получить MAC-адрес, режим сканирования (page scan repetition mode [2]), класс устройства, смещение тактов (clock offset), уровень радиосигнала (RSSI), ответ на расширенный запрос extended inquiry response (здесь может быть информация об имени, передаваемой мощности, и т. д.).

[Сканирование служб SDP]

Классические устройства Bluetooth сообщают внешнему миру о своем функционале через SDP. После сканирования SDP будут выведены записи службы (service records) указанного Classic Bluetooth-устройства. Пример SDP-сканирования клавиатуры Bluetooth v3.0 компании Oklick, модель 840S:

pi@raspberrypi:~ $ sudo bluescan -m SDP 0C:FC:85:4F:17:1C
[INFO] Scanning...
Number of service records: 3
 
Service Record
0x0000: ServiceRecordHandle (uint32)
        0x00010000
0x0001: ServiceClassIDList (sequence)
        0x1124: HumanInterfaceDeviceService
0x0004: ProtocolDescriptorList (sequence)
        0x0100: L2CAP
                PSM: 0x0011
        0x0011: HIDP
0x0005: BrowseGroupList (sequence)
        0x1002: PublicBrowseRoot
0x0006: LanguageBaseAttributeIDList (sequence)
        language name: 0x656e
        encoding: 0x006a
        attribute ID base: 0x0100
0x0009: BluetoothProfileDescriptorList (sequence)
        0x1124: HumanInterfaceDeviceService v1.0
0x000d: AdditionalProtocolDescriptorList (sequence)
        0x0100: L2CAP
                PSM: 0x0013
        0x0011: HIDP
0x0100: ServiceName (text)
        Airoha BT Keyboard
0x0101: ServiceDescription (text)
        Bluetooth KB
0x0102: ProviderName (text)
        Airoha
0x0200: HIDDeviceReleaseNumber (Deprecated) (uint16)
        0x0100
0x0201: HIDParserVersion (uint16)
        0x0111: USB HID specification v1.1.1
0x0202: HIDDeviceSubclass (uint8)
        0x40
0x0203: HIDCountryCode (uint8)
        0x00
0x0204: HIDVirtualCable (boolean)
        True
0x0205: HIDReconnectInitiate (boolean)
        True
0x0206: HIDDescriptorList (sequence)
         < Element 'sequence' at 0xae045ed0 >
0x0207: HIDLANGIDBaseList (sequence)
         < Element 'sequence' at 0xae045fc0 >
0x0208: HIDSDPDisable (Deprecated) (boolean)
        False
0x0209: HIDBatteryPower (boolean)
        True
0x020a: HIDRemoteWake (boolean)
        True
0x020b: HIDProfileVersion (uint16)
        0x0100
0x020c: HIDSupervisionTimeout (uint16)
        0x0C80
0x020d: HIDNormallyConnectable (boolean)
        False
0x020e: HIDBootDevice (boolean)
        True
0x020f: HIDSSRHostMaxLatency (uint16)
        0x0640
0x0210: HIDSSRHostMinTimeout (uint16)
        0x0320
 
Service Record
0x0000: ServiceRecordHandle (uint32)
        0x00010001
0x0001: ServiceClassIDList (sequence)
        0x1200: PnPInformation
0x0004: ProtocolDescriptorList (sequence)
        0x0100: L2CAP
                PSM: 0x0001
        0x0001: SDP
0x0005: BrowseGroupList (sequence)
        0x1002: PublicBrowseRoot
0x0009: BluetoothProfileDescriptorList (sequence)
        0x1200: PnPInformation v1.0
0x0200: unknown
        < uint16 value="0x0103" />
0x0201: unknown
        < uint16 value="0x05ac" />
0x0202: unknown
        < uint16 value="0x0239" />
0x0203: unknown
        < uint16 value="0x011b" />
0x0204: unknown
        < boolean value="true" />
0x0205: unknown
        < uint16 value="0x0002" />
 
Service Record
0x0000: ServiceRecordHandle (uint32)
        0x00010006
0x0001: ServiceClassIDList (sequence)
        0x1138: 3D Glasses
0x0009: BluetoothProfileDescriptorList (sequence)
        0x1139: 3D Synchronization v1.0
0x0100: ServiceName (guess) (text)
        3D Glasses

[Сканирование функций LMP]

Детектирование функций LMP для Classic Bluetooth устройств позволяет сделать выводы о нижележащих функций безопасности [3].

[Сканирование BLE-устройств]

Технология Bluetooth, начиная с версии 4.0, в дополнение к системе Basic Rate, поддерживает технологию Bluetooth Low Energy (BLE) system. Пример сканирования:

pi@raspberrypi:~ $ sudo bluescan -m le
[WARNING] Before doing an active scan, make sure you spoof your BD_ADDR.
[INFO] LE active scanning on hci0 with timeout 10 sec
 
----------------LE Devices Scan Result----------------
Addr:        8C:EA:48:0A:B2:C3 (Unknown)
Addr type:   public
Connectable: False
RSSI:        -90 dBm
General Access Profile:
    Manufacturer Specific Data:
        Company ID: 0x0075 (Samsung Electronics Co. Ltd.)
        Data:       42040180668CEA480AB2C38EEA480AB2C201000000000000
 
Addr:        E7:36:C9:99:25:85
Addr type:   random
Connectable: True
RSSI:        -87 dBm
General Access Profile:
    Manufacturer Specific Data:
        Company ID: 0x434E (Unknown)
        Data:       C8CF1E3F8D0214940001
    Shortened Local Name: Nordic Device
 
Addr:        CD:5C:E2:9C:18:94 (Unknown)
Addr type:   public
Connectable: True
RSSI:        -87 dBm
General Access Profile:
    Flags:
        LE General Discoverable Mode
        BR/EDR Not Supported
    Manufacturer Specific Data:
        Company ID: 0x0157 (Anhui Huami Information Technology Co., Ltd.)
        Data:       02FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02CD5CE29C1894
    Complete Local Name: Mi Smart Band 4
    Incomplete List of 16-bit Service Class UUIDs:
        0xFEE0
    Service Data - 16-bit UUID:
        UUID: 0xE0FE
        Data: 64160000
 
Addr:        7A:EA:14:ED:0E:F3
Addr type:   random
Connectable: False
RSSI:        -83 dBm
General Access Profile:
    Manufacturer Specific Data:
        Company ID: 0x0006 (Microsoft)
        Data:       010920023D54168B8A79580AE7DAAB7251DF99496B2927632DB566
 
Addr:        FD:F0:FF:F9:A9:9F
Addr type:   random
Connectable: False
RSSI:        -65 dBm
General Access Profile:
    Manufacturer Specific Data:
        Company ID: 0x004C (Apple, Inc.)
        Data:       12020002

Как показано выше, результат LE-сканирования может дать нам адрес, тип адреса, статус соединения, уровень сигнала RSSI, GAP-данные, информацию о производителе.

[Сканирование сервисов GATT]

BLE-устройства говорят внешнему миру о своих открытых службах через GATT. После сканирования GATT мы можем получить представление о функционале и способу доступа к функционалу BLE-устройства. Впоследствии мы сможем прочитать эти GATT-данные (характеристики) с помощью дополнительных утилит [5]. Пример сканирования служб GATT устройства BLE:

pi@raspberrypi:~ $ sudo bluescan -m gatt --addr-type=random D9:9D:36:54:C5:26
[INFO] Agent object registered
       IO capability: NoInputNoOutput
[INFO] Changing D9:9D:36:54:C5:26 untrust succeeded
 
[INFO] Unregistered Agent object
 
 
----------------GATT Scan Result----------------
Number of services: 3
 
 
Service (0x0001 - 0x0009, 4 characteristics)
    Handle: 0x0001
    Type:   0x2800 (Primary Service)
    Value:  00001800-0000-1000-8000-00805F9B34FB (Unknown)
    Permissions: Read Only, No Authentication, No Authorization
 
    Characteristic (0 descriptors)
        Handle: 0x0002
        Type:   0x2803 (Characteristic)
        Value:
            Properties: READ WRITE
            Handle:     0x0003
            UUID:       00002A00-0000-1000-8000-00805F9B34FB (Unknown)
        Permissions: Read Only, No Authentication, No Authorization
    Value
        Handle: 0x0003
        Type:   00002A00-0000-1000-8000-00805F9B34FB (Unknown)
        Value:  b'Nordic Relay'
        Permissions: Higher layer profile or implementation specific
 
    Characteristic (0 descriptors)
        Handle: 0x0004
        Type:   0x2803 (Characteristic)
        Value:
            Properties: READ
            Handle:     0x0005
            UUID:       00002A01-0000-1000-8000-00805F9B34FB (Unknown)
        Permissions: Read Only, No Authentication, No Authorization
    Value
        Handle: 0x0005
        Type:   00002A01-0000-1000-8000-00805F9B34FB (Unknown)
        Value:  b'\x00\x00'
        Permissions: Higher layer profile or implementation specific
 
    Characteristic (0 descriptors)
        Handle: 0x0006
        Type:   0x2803 (Characteristic)
        Value:
            Properties: READ
            Handle:     0x0007
            UUID:       00002A04-0000-1000-8000-00805F9B34FB (Unknown)
        Permissions: Read Only, No Authentication, No Authorization
    Value
        Handle: 0x0007
        Type:   00002A04-0000-1000-8000-00805F9B34FB (Unknown)
        Value:  b'\x06\x00\x18\x00\x00\x00\x90\x01'
        Permissions: Higher layer profile or implementation specific
 
    Characteristic (0 descriptors)
        Handle: 0x0008
        Type:   0x2803 (Characteristic)
        Value:
            Properties: READ
            Handle:     0x0009
            UUID:       00002AA6-0000-1000-8000-00805F9B34FB (Unknown)
        Permissions: Read Only, No Authentication, No Authorization
    Value
        Handle: 0x0009
        Type:   00002AA6-0000-1000-8000-00805F9B34FB (Unknown)
        Value:  b'\x01'
        Permissions: Higher layer profile or implementation specific
 
 
Service (0x000A - 0x000A, 0 characteristics)
    Handle: 0x000A
    Type:   0x2800 (Primary Service)
    Value:  00001801-0000-1000-8000-00805F9B34FB (Unknown)
    Permissions: Read Only, No Authentication, No Authorization
 
 
Service (0x000B - 0xFFFF, 2 characteristics)
    Handle: 0x000B
    Type:   0x2800 (Primary Service)
    Value:  000018FF-0000-1000-8000-00805F9B34FB (Unknown)
    Permissions: Read Only, No Authentication, No Authorization
 
    Characteristic (0 descriptors)
        Handle: 0x000C
        Type:   0x2803 (Characteristic)
        Value:
            Properties: READ NOTIFY
            Handle:     0x000D
            UUID:       00002A99-0000-1000-8000-00805F9B34FB (Unknown)
        Permissions: Read Only, No Authentication, No Authorization
 
    Value
        Handle: 0x000D
        Type:   00002A99-0000-1000-8000-00805F9B34FB (Unknown)
        Value:  b''
        Permissions: Higher layer profile or implementation specific
 
    Characteristic (0 descriptors)
        Handle: 0x000F
        Type:   0x2803 (Characteristic)
        Value:
            Properties: WRITE NO RESPONSE WRITE
            Handle:     0x0010
            UUID:       00002A3D-0000-1000-8000-00805F9B34FB (Unknown)
        Permissions: Read Only, No Authentication, No Authorization
    Value
        Handle: 0x0010
        Type:   00002A3D-0000-1000-8000-00805F9B34FB (Unknown)
        Value:  Unknown
        Permissions: Higher layer profile or implementation specific

[Ссылки]

1. Raspberry Pi, быстрый старт.
2. Scan Repetition site:dziwior.org.
3. Bluescan Bluetooth Scanner For Scanning BR/LE Devices, LMP, SDP site:pentesttools.net.
4Bluetooth: аббревиатуры и термины.
5. Сканирование сетей BLE в Linux.

 

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


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

Top of Page