Клонирование Mifare — нет ничего проще!

Вот для такого замечательного случая, когда возникает необходимость клонировать карту Mifare, предназначена программа c2rwCopy to RW-card. Вообще-то клонирование направо и налево делается с помощью libnfc; c2rw не использует libnfc, но тоже позволяет создать клоны карт (включая UID) Mifare Ultralight, Mifare Classic и Mifare Plus 🙂 Для полного клонирования, включая UID, следует использовать специальные карты, так называемые карты Mifare Zero (RW-карты), по названию перезаписываемого сектора 0. В секторе 0 хранится UID карты, а также ATQA и SAK, которые отвечают за опознавание типа карты. Исходники софта открыты, скачать его можно здесь (для Windows).

c2rw01

Карты Mifare Zero бывают разных типов: в продаже есть карты — аналоги Ultralight, Classic, Plus различных объёмов. Но интересно то, что даже среди Mifare Zero есть свои отличия. Например, большинство RW-карт позволяют изменять UID только в специальном режиме, однако, попадаются карты в которых запись блока 0 возможна в нормальном режиме: обычная запись блока 0 проходит без ошибок и изменяет UID карты! Вот такие чудеса, главное не записать какую-нибудь ерунду вместо UID 🙂

Наиболее распространены карты CL1K (Classic, 1Kb, для перезаписываемых карт добавляется постфикс RW). В этих картах UID занимает первые 4 байта блока 0 (байты +0…+3). По адресу +4 блока 0 хранится BCC для UID — это исключающее ИЛИ между байтами UID. По адресам +5 и +6-7 хранится 1 байт SAK и 2 байта ATQA, которые отвечают за опознавание типа карты. В большинстве CL1K-RW/CL4K-RW изменение BCC и SAK ничего не меняет в работе карты, однако, попадаются карты, где это не так.

Перезаписываемые карты PL2S1-RW/PL4S1-RW которые бы полностью копировали Mifare Plus пока не попадались — это обыкновенные карты CL4K с UID длиной 7 байт (байты +0…+6). В этих картах SAK и ATQA расположены по адресам +7 и +8-9 соответственно.

Особняком стоят карты UL-RW (Ultralight). В этих картах поменять можно только UID, SAK и ATQA поменять нельзя. Встречаются RW аналоги UL/C (Ultralight-C), DF1, DF2 (DesFire) карт, но эти карты достаточно редки и заслуживают только упоминания.

Особенности копирования UL-карт

Узнать тип клонируемой карты можно нажав «?» рядом с типом карты. Если это UL-карта, то никаких дополнительных действий не потребуется — UL-карта копируется наиболее просто.

c2rw02

Внутреннее устройство UL-карт отличается от CL и PL. Данные на карте адресуются постранично, размер страницы — 4 байта, ключей авторизации нет, шифрование отсутствует. Чтение данных производится командой блочного чтения с указанием номера начальной страницы: по команде читаются 4 страницы, длина считанных данных 16 байт, т.е. длина считанных 4 страниц равна длине одного блока.

c2rw07

Считать одну страницу — нельзя, нет команды 🙂 Запись данных можно производить как командой страничной записи, так и командой блочной записи, но из блока будут записаны только первые 4 байта. Т.е. налицо некоторый идиотизм: чтение данных производится блочной командой, а запись — страничной, но что имеем — то имеем 🙂 На страницах 0…1 хранится UID карты вперемешку с BCC1. На странице 2 хранится BCC2, лишний и никому не нужный байт INT, а также 2 байта управляющего слова LOCK.c2rw08

Установка битов LOCK делает соответствующую страницу доступной только по чтению, причём единожды установленный бит сбросить не удастся — OTP зона, однако (One Time Programming). Такой же особенностью обладает страница 3: она тоже OTP, но установка битов в этой странице ничего не блокирует. Всего доступно 16 страниц (адресуются страницы 0…15).

Подробности внутреннего устройства UL-карт можно посмотреть в соответствующих мануалах.

Для копирования UL-карты следует установить UL-режим, считать оригинал и записать его на RW-карту. Для того, чтобы карта считалась полностью, в меню следует активировать пункт «Read full data«: после этого карта всегда будет считываться полностью, независимо от установок активности страниц.

c2rw03

Для того, чтобы записались все страницы, т.е. копия была полной, требуется разрешить запись страниц с помощью кнопочек, рядом с соотв. полями данных. Если какие-то страницы записывать не требуется — деактивируем их. После этого записываем данные («Write card«) на UL-RW.c2rw09

Собственно и всё. Если требуется подкорректировать UID, то исправляем данные в страницах 0 и 1, затем нажимаем кнопку «Fix!«, чтобы правильно сформировать байты BCC1 и BCC2, и после этого записываем данные в RW-карту. Также данные можно перенести в обычную UL-карту, но, разумеется, страницы 0-2 скопированы не будут (2я страница не будет скопирована целиком). При переносе данных на обычную карту надо соблюдать определённую осторожность, соблюдая порядок записи, т.к. записав что-то в LOCK область, потом можно ничего не записать в остальные страницы карты: так-что, порядок записи страниц имеет значение 🙂

Особенности копирования CL/PL карт

c2rw04

Карты CLxK и PLxS1 имеют посекторную организацию, когда несколько блоков (обозначаются буквой «B» с номером блока) объединены в один логический сектор (обозначается буквой «S«) с общими ключами авторизации. Секторы 0-31 объединяют по 4 блока, а сектора 32…39 по 16 блоков. В последний блок сектора записываются ключи авторизации A и B длиной 6 байт каждый, а также режим работы ключей. Например, можно задать режим, когда полный доступ к сектору возможен по ключу A, а ключ B не используется. Можно задать режим, когда ключ A используется только как ключ чтения, а ключ B как ключ чтения-записи, и т.п.. Блок, в котором хранятся ключи и режим авторизации сектора, называется трейлером (обозначается буквой «T» с номером сектора). Размер блока — 16 байт.

c2rw11

При чтении трейлера вместо ключей всегда читаются нули, за исключением тех случаев, когда неправильно установлены байты режима: в этом случае может быть считан ключ B, но ключ A считать невозможно, тут без вариантов, поэтому писать в трейлер то, что считали — нельзя 🙂 Если записать то, что считали — ключ поменяется и станет равным нулю. Вообще, с трейлером надо обращаться крайне осторожно: неправильно заданный режим ведёт к неработоспособности сектора на карте; восстановить работоспособность сектора можно только в случае RW-карты, установив правильный режим. В случае ошибки установки режима на обычной карте, её просто придётся выбросить. На картах CL1K всего 16 секторов (адресуются блоки 0…63), на карте PL2S1 — 32 сектора (адресуются блоки 0…127), на картах CL4K/PL4S1 — 40 секторов (адресуются блоки 0…255).

Подробности внутреннего устройства CL-карт можно посмотреть здесь.

c2rw10

Для копирования CL/PL карт следует правильно установить селектор типа, определяющий тип и объём карты, иначе при записи копии могут возникнуть ошибки: записать карту бОльшего объёма в меньшую болванку врядли получится 🙂 Всего доступно 4 типа карт: CL1K — Classic 1Kb, CL4K — Classic 4Kb, PL2S1 — Plus 2Kb, PL4S1 — Plus 4Kb. Если неправильно выбрать тип карты, то возникнут проблемы с опознаванием типа карты, т.к. SAK и ATQA в CL и PL картах находятся по разным адресам.

Самое сложное при копировании CL и PL карт — узнать ключи авторизации. Сделать это можно по-разному, один из способов — воспользоваться программой mfoc (смотреть здесь), которая восстанавливает ключи авторизации используя уязвимость CL-карт. Иногда узнать ключи не представляется возможным, поэтому клонировать такую карту не получится, по крайней мере целиком. Если ключи известны, то копирование карты не представляет сложностей.

Ключи вводятся посекторно; при вводе ключей от 0 до 31 страницы включительно видно, куда введённый ключ попадает в трейлере. Однако, начиная с 32го сектора, процесс «попадания» ключа в трейлер не столь очевиден, т.к. в диалоговом окне отображается только четверть сектора из-за больших размеров секторов. Т.е. чтобы установить ключи сектора с номерами от 32 до 39, достаточно ввести ключи на любой четверти сектора, а не вводить их на каждой четвертине: например, для чтения сектора 32 достаточно ввести ключи на любом секторе — 32/0, 32/1, 32/2, 32/3, хотя трейлер сектора 32 появится только при выборе 32/3. Для ввода ключа должна быть разрешена запись хотя бы одного блока, а иначе, какой смысл читать, если потом не записывать сектор?c2rw05

Считать карту можно целиком (кнопка «Read card«), а можно считать лишь те сектора, которые будут записаны (кнопка «Read sector«). Параметр меню «Read full data» отвечает за то, будут считаны все данные карты/сектора или только отмеченные. В случае невозможности считывания сектора 0, UID можно сформировать вручную, взяв произвольный ключ для сектора 0 в качестве рабочего: должен же быть хоть какой-то UID у карты. UID записывается в блок 0 простой записью байтов номера, для завершения формирования UID следует нажать кнопку «Fix!«: по нажатию кнопки «Fix!» будет сформированы правильные BCC, SAK, ATQA.c2rw06

После формирования дампа, его следует записать (кнопка «Write card«), записываются только отмеченные блоки. Собственно и всё, копирование завершено.

Задача копирования упрощается, если требуется скопировать RW-карту. Для этого следует активировать режим «Read in RW-mode«: искать и вводить ключи в этом случае не требуется, достаточно просто считать карту.

Подобрать ключ из числа известных ключей можно нажав на кнопочку «?» около соответствующего ключа. Также программа пытается подобрать ключ из числа известных при записи/чтении сектора.

Дамп карты также можно сохранить в файл (в меню «File«), поддерживается 3 формата: ASCII, бинарный (mfd), а также можно сохранить текущую конфигурацию программы, включая все данные и режимы. По умолчанию дампу даётся имя в виде типа карты со следующим за ним UID-ом.

И ещё. Данный материал приводится в образовательных целях, полученные знания не следует использовать в противозаконных целях, не стоит страдать ерундой. RW-карты хороши для для отладки приложений, проверки правильности работы софта, но не более того.