Внимание! Данная статья создана исключительно в образовательных целях. Напоминаем, что любое проникновение в информационные системы может преследоваться по закону.У многих, интересующихся технологией 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 приложение из архива
Несколько слов хочу сказать по поводу модуля 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)
schetilin
09.12.2019 19:19Не буду здесь рассказывать о том, что такое Mifare и вдаваться в технические подробности
А все таки расскажите поподробнее. Ну или пару ссылок с внятным описанием для незнающих.svk4286 Автор
09.12.2019 19:38Это тема для отдельной статьи, а то и не одной, именно поэтому привел здесь только готовое решение. Информации в сети много, но она раскидана по тематическим форумам, поэтому даже конкретных ссылок дать затруднюсь. Если будет интерес к теме, попробую описать устройство
и его ПО подробнее, но это будет не просто.
x893
09.12.2019 20:50А исходники не планируете открыть от KeyToolsSTM/KeyTools?
svk4286 Автор
09.12.2019 21:07Скажем так — не планировал закрывать, но и публиковать пока тоже. Они на моем github, но практически без комментариев, кому интересно смотрите.
x893
09.12.2019 21:20А чтение MIFARE Ultralight не планируете добавить? Где то попадалась библиотека NDEF.
APK поставился — придется считыватель мастерить.
Спасибо!
siargy
10.12.2019 08:06-3немного занудствакопировать брелоки
видимо для многих росиян росийский язык неродной. иначе бы писали — брелки.
изучайте раздел беглые гласные. пример: колобок — колобки.sicambr
10.12.2019 11:22+1У многих россиян русский родной. Он позволяет https://ru.m.wikipedia.org/wiki/%D0%91%D1%80%D0%B5%D0%BB%D0%BE%D0%BA#%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE%D1%83%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5
siargy
11.12.2019 08:58ну всетаки заимствованые слова должны быть удобны и благозвучны, как асвальт и протвинь.
mihmig
11.12.2019 16:17Правильно ли я понимаю, что подключившись к двум пинам разъёма MSU (что это за стандарт?)
микроконтроллер «сниффает» обмен между считывателем и картой?
svk4286 Автор
11.12.2019 16:41STM32 частично эмулирует Mifare Classic, заставляя считыватель начать процесс аутентификации, чтобы в дальнейшем на основе полученных данных можно было рассчитать криптоключ. PN532 в этом случае выполняет только роль приемо-передатчика.
Krysnik
Хотелось бы больше подробностей как расчитывается крипто ключ. Или программа не ваша разработка?
svk4286 Автор
Криптоключи рассчитываются на основе захваченных данных двух неоконченных аутентификаций между считывателем и устройством, но такие подробности выходят за рамки статьи.
OverQuantum
Полагаю, в основе лежит алгоритм, описанный в статье «Dismantling MIFARE Classic».