Голыми руками захватывать криптоключи и копировать брелоки Mifare для домофонов конечно невозможно, а вот собрать прибор, который будет это делать вполне реально. Не буду здесь рассказывать о том, что такое Mifare и вдаваться в технические подробности, скажу только, что данная технология используется сейчас, например, в домофонах, и для того, чтобы скопировать домофонный брелок, необходимо знать криптоключи, которыми он был закрыт.
Внимание! Данная статья создана исключительно в образовательных целях. Напоминаем, что любое проникновение в информационные системы может преследоваться по закону.
У многих, интересующихся технологией MIfare, наверняка есть простейшее устройство для чтения-записи карт и брелоков Mifare, состоящее из модуля PN532 и USB-UART адаптера:



Путем несложной и недорогой доработки это устройство можно заставить захватывать от
считывателя данные аутентификации, с помощью которых и рассчитываются криптоключи, так необходимые для чтения и копирования. Существуют и серийно выпускаемые приборы для этой цели — SMKey, Proxmark3, Chameleon и ещё некоторые. Это приборы с множеством функций, удобные, но недешевые.

Я предлагаю вашему вниманию более бюджетный вариант на основе подобного «малого джентльменского набора» из модуля PN532 и USB-UART адаптера, позволяющий захватывать данные от считывателя Mifare, например домофона, и рассчитывать криптоключи, с которыми считыватель обращается к метке.

Разработанное устройство в своей основе имеет недорогую, «народную» отладочную плату на основе процессора STM32F103C8T6, прозванную ещё «BluePill» c подключенными к ней модулем PN532 и USB-UART адаптером. Подключается данный агрегат через USB-OTG кабель к смартфону на Андроиде. Собирается всё это в макетном варианте без пайки, с помощью перемычек и имеет примерно такой вид, хоть и непрезентабельный, но вполне рабочий:



Схему сборки очень проста и представлена в текстовом виде:

PN532 ___________________STM32F103C8T6

SCK_____________________PA5(SPI1_SCK)
MISO____________________PA6(SPI1_MISO)
MOSI____________________PA7(SPI1_MOSI)
SS______________________PB0(GPIO_OUTPUT)
SIGIN___________________PB11(TIM2_CH4)
SIGOUT__________________PA12(TIM1_ETR)
SIGOUT__________________PA0(TIM2_ETR)
VCC_____________________+5V
GND_____________________GND


USB-UART________________STM32F103C8T6

RX______________________PA9(USART1_TX)
TX______________________PA10(USART1_RX)
+5V_____________________+5V
GND_____________________GND

ВАЖНО! Переключатели интерфейса PN532 должны быть установлены в режим SPI! Прошить STM32 можно с помощью утилиты FlashLoaderDemonstrator через существующий USB-UART адаптер.

Вот демонстрация захвата криптоключа от имитатора считывателя домофона(Arduino + PN532):


Так как считыватели IronLogic(IL), для работы с которыми и разрабатывалось данное устройство, пытаются прочитать метку с криптоключом, рассчитанным на основе UID данной метки, то этот UID сначала надо задать. Сделать это можно двумя способами – вручную или считать с метки. После этого производим захват и ждем расчета криптоключей.

Следующая вкладка программы «Запись на Classic» использует возможность ранних версий считывателей IL записывать копии на дешевые заготовки Mifare Classic. Этот способ основан на том, что считыватель IL после авторизации посылает домофону не оригинальный UID метки, а информацию, записанную в первом блоке (в общем случае совпадающую с UID оригинала). Для этого мы должны захватить и рассчитать криптоключ метки, которая послужит заготовкой, закрыть с его помощью нулевой сектор, а в первый блок этой метки записать четыре байта UID метки, которая служит прототипом. Для этого нам даже не надо захватывать криптоключ оригинала и снимать его дамп, достаточно узнать его UID, но это справедливо только в том случае, если оригинал — «оригинальный», а не является копией, тогда всё-таки придется читать первый блок и уже его записывать в копию. Чтобы было понятнее, рассмотрим такой пример – предположим, что мы хотим сделать копию оригинального ключа с UID 0xEBD52AC5, который записан и в первом блоке оригинала, на обычную метку Mifare Classic с UID, допустим, 0x12345678. Для этого мы с помощью представленного устройства, метко обозванного одним товарищем «Шайтан-Машиной», находим криптоключ именно для этого UID и именно для того объекта (подъезда, дома …), который нам нужен. Пусть криптоключ получился 0xABCDEF098765, тогда отредактируем нулевой сектор дампа копии следущим образом:



В первый блок запишем UID оригинала 0xEBD52AC5, а в третий блок шесть байт криптоключа, найденного для этой заготовки — 0xABCDEF098765. Запишем дамп в заготовку, и получим копию домофонного ключа. Примерно так прибор SMKey делает копии IronLogic на обычные Mifare Classic, и именно так поступает данная программа записи. В поле «Код» заносим вручную или считываем с оригинального ключа 4 байта UID, которые будут записаны в 1-й блок копии. Стартуем и, далее следуем подсказкам программы. Сначала считываем UID заготовки, потом подносим устройство к домофону и захватываем данные аутентификации. После окончания расчета программа предложит поднести заготовку для записи данных. Если будет найдено более одного криптоключа, то после записи первого варианта будет дана возможность проверить полученную копию. Если копия не подходит, то следует попробовать следующий рассчитанный ключ, или стереть (привести в исходное состояние) заготовку для дальнейшего использования. Копия может не работать также из-за того, что неправильно определили код, который записывается в 1-й блок копии – например если попытаетесь записать реальный UID не оригинального брелока, а его копии, сделанной по вышеописанному методу.В таком случае надо использовать не UID метки, а данные из 1-го блока, которые можно получить в разделе «Копирование сектора».

Этот способ не будет также работать для последних версий ПО считывателей IL. В таком случае копию можно сделать, скопировав полностью 0-й сектор ( 4 блока) на заготовку, позволяющую записывать 0-й блок с помощью раздела приложения «Копирование сектора». Здесь также сначала находим криптоключ оригинала, читаем его нулевой сектор и затем пишем на заготовку. Ввиду отсутствия под рукой заготовок ОТР и ОТР-2.0, эта функция пока тестировалась только на заготовках ZERO, хотя новые версии считывателей требуют использовать ОТР-2.0.

Ну и на закуску – раздел приложения «Запись UID» позволяет изменять UID, восстанавливать испорченный 0-й блок и сбрасывать на дефолт криптоключи заготовок ZERO.

Итак – коротко подытожу. Чтобы сделать такое устройство, приобретаем или ищем по своим загашникам модуль PN532, любой из USB – UART адаптеров FTDI, PL2303, CH340 или CP2102, отладочную плату STM32F103C8T6, полтора десятка перемычек, USB-OTG переходник и смартфон(планшет) на Андроиде с OTG. Собираем по вышеприведенной схеме само устройство, прошиваем *.bin файлом STM32 и устанавливаем *.apk приложение из архива
на смартфон. Для корректной работы приложение на смартфоне должно запускаться при подключении USB-UART адаптера или по умолчанию, или выбором вручную, иначе приложение не получит доступ к адаптеру.

Несколько слов хочу сказать по поводу модуля PN532 – не все эти модули «одинаково полезны»! Из трёх модулей(таких как на фото выше), приобретенных мной, один плохо читал и записывал метки, особенно ZERO и ОТР-2.0, но нормально работал в пассивном режиме со считывателями домофонов, другой вел себя с точностью до наоборот и только третий более-менее справлялся и с метками и с домофонами(правда хуже чем первые два). Возможно мне не повезло и именно эта партия модулей оказалась не лучшего качества, но жалуются на них и другие люди. Впрочем – кому как повезет. Это я к чему говорю? В продаже появились модули PN532 немного другой компоновки, которые дороже, но, по отзывам не имеют таких проблем:



Если же кому-нибудь попадется PN532, который плохо пишет-читает метки, то могу посоветовать добавить к устройству модуль RC522, стоящий сущие копейки, но прекрасно выполняющий свои функции, по следующей схеме:

RC522____________________STM32F103C8T6

RST______________________PB12(GPIO_OUTPUT)
SCK______________________PB13(SPI2_SCK)
MISO_____________________PB14(SPI2_MISO)
MOSI_____________________PB15(SPI2_MOSI)
SDA______________________PA8(GPIO_OUTPUT)
VCC______________________+5V
GND______________________GND
В этом случае PN532 будет работать только при захвате данных от считывателя, а вся тяжесть работы с метками ляжет на плечи RC522.

В заключении хочу сказать, что работоспособность устройства в реальных условиях тестировалась только на считывателях IronLogic самого первого поколения, без фильтров ZERO, ОТР, ОТР-2.0. К другим версиям просто нет доступа, поэтому для более современных считывателей IL потребуется доработка ПО, ну и, конечно, наличие этих самых считывателей.

Архив

Комментарии (23)


  1. Krysnik
    09.12.2019 17:29
    +1

    Хотелось бы больше подробностей как расчитывается крипто ключ. Или программа не ваша разработка?


    1. svk4286 Автор
      09.12.2019 17:53
      -1

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


    1. OverQuantum
      10.12.2019 12:56

      Полагаю, в основе лежит алгоритм, описанный в статье «Dismantling MIFARE Classic».


  1. schetilin
    09.12.2019 19:19

    Не буду здесь рассказывать о том, что такое Mifare и вдаваться в технические подробности

    А все таки расскажите поподробнее. Ну или пару ссылок с внятным описанием для незнающих.


    1. svk4286 Автор
      09.12.2019 19:38

      Это тема для отдельной статьи, а то и не одной, именно поэтому привел здесь только готовое решение. Информации в сети много, но она раскидана по тематическим форумам, поэтому даже конкретных ссылок дать затруднюсь. Если будет интерес к теме, попробую описать устройство
      и его ПО подробнее, но это будет не просто.


  1. x893
    09.12.2019 20:50

    А исходники не планируете открыть от KeyToolsSTM/KeyTools?


    1. svk4286 Автор
      09.12.2019 21:07

      Скажем так — не планировал закрывать, но и публиковать пока тоже. Они на моем github, но практически без комментариев, кому интересно смотрите.


      1. x893
        09.12.2019 21:08

        Вот спасибо огромное. Коментарии и не нужны!


      1. x893
        09.12.2019 21:20

        А чтение MIFARE Ultralight не планируете добавить? Где то попадалась библиотека NDEF.
        APK поставился — придется считыватель мастерить.
        Спасибо!


        1. svk4286 Автор
          09.12.2019 21:27

          А зачем?


        1. level
          10.12.2019 13:08

          Ultralight открытый и есть софт в маркете, который их читает.


          1. x893
            10.12.2019 13:22

            Были какие то проблемы, видимо что то со считывателем. Надо проверить потом.


  1. siargy
    10.12.2019 08:06
    -3

    немного занудства
    копировать брелоки

    видимо для многих росиян росийский язык неродной. иначе бы писали — брелки.
    изучайте раздел беглые гласные. пример: колобок — колобки.


    1. sicambr
      10.12.2019 11:22
      +1

      1. siargy
        11.12.2019 08:58

        ну всетаки заимствованые слова должны быть удобны и благозвучны, как асвальт и протвинь.


  1. svk4286 Автор
    10.12.2019 12:10

    Нет.


  1. EEElice
    10.12.2019 13:07

    Он будет помнить этот RFID-брелок если выключить-включить устройство?


    1. svk4286 Автор
      10.12.2019 13:09

      Нет.


      1. EEElice
        10.12.2019 13:22

        Но потенциально можно это реализовать с помощью Mini SD / Micro SD. Для образовательных целей, конечно же!)


  1. mihmig
    11.12.2019 12:28

    Скажите, а как Вы с помощью UART-переходника общаетесь с I2C-портом платы PN532?


    1. svk4286 Автор
      11.12.2019 12:47

      Если внимательнее посмотрите на схему, то увидите, что USB-UART подключен к STM32, а уже STM32 к PN532 и (опционально) к RC522, но через SPI, а не I2C.


  1. mihmig
    11.12.2019 16:17

    Правильно ли я понимаю, что подключившись к двум пинам разъёма MSU (что это за стандарт?)
    микроконтроллер «сниффает» обмен между считывателем и картой?


    1. svk4286 Автор
      11.12.2019 16:41

      STM32 частично эмулирует Mifare Classic, заставляя считыватель начать процесс аутентификации, чтобы в дальнейшем на основе полученных данных можно было рассчитать криптоключ. PN532 в этом случае выполняет только роль приемо-передатчика.