Сниффер Mifare на RTL-SDR (RTL2832)

Иногда необходимо знать какими данными обмениваются ридер и карта. Это могут быть банальные причины, типа отладки программно-аппаратного обеспечения ридера, проверки отношения мощностей передачи-приёма; это могут быть и не очень банальные причины, типа трассировки обмена Mifare Classic или попытки на лету внести сбойный бит в AES-ключ Mifare Plus, чтобы выковырять криптобазу из испорченной карты…
Предлагаемый вариант сниффера был сделан из «плавников и рыбьих хвостов» — на базе RTL-SDR (RTL2832), донгла стоимостью 4$. Результат работы сниффера запечатлён на скриншоте: неплохо, неправда ли?

Вот так выглядит трассировка протокола ISO-14443A

А это приёмник на RTL-SDR (RTL2832), который перехватил обмен Mifare

Основная проблема построения приёмника в том, что требуется большой динамический диапазон и высокая разрешающая способность: мощная несущая ридера забивает слабый, практически никакой, сигнал карты. Если рассматривать приёмник с точки зрения реализации приёмника в самом ридере, то в данном случае проблема решается довольно просто: ридер точно знает, когда надо принимать сигнал, а поскольку ридер ещё и сам генерирует несущую, то включение в нужный момент фазового детектора решает проблему построения дешёвого приёмника, т.к. при приёме сигнала меряется искажение фазы эфирного сигнала относительно своего же опорного генератора.
У стороннего приёмника возможность «опираться» на что-либо отсутствует в принципе: в поле ридера, которое легко ловится на расстоянии полкилометра, приходится искать искажения, сделанные замыканием-размыканием 5ти витков катушки карты. Чудесная задача, учитывая ещё и то, что катушка на карте сделана методом напыления алюминия на лавсан — хорошо, хоть не краской витки нарисовали 🙂

Вобщем, задача построения сниффера Mifare не просто интересна как прикладная задача, а интересна как инженерная головоломка.

Основная задача приёмника на базе RTL-SDR — принять широкополосный сигнал на частоте 13.56МГц. Несмотря на то, что сам донгл принимает сигналы только от 40МГц и выше, существуют доработки, которые позволяют принимать сигналы КВ(HF) диапазона в режиме прямого преобразования: direct sampling mode. «Допиливать» RTL-донгл можно самому, а можно взять уже «допиленный». Наиболее простым и дешёвым показался вариант китайского радиолюбителя BA5SBA, тем более, что его поделки массово и «низадорого» продаются на Али 🙂

внутренности RTL-SDR на базе RTL2832 с доработкой от BA5SBA для приёма КВ-диапазона в режиме прямого преобразования

Внутри девайс от BA5SBA представляет собой доработку типовой платы RTL2832 для приёма сигналов КВ(HF) диапазона. Если интересно провести доработку RTL2832 самому, в интернете хватает ссылок по этой теме, вот парочка для примера: Активный direct sampling и RTL-SDR direct sampling mode.

Для трассировки обмена ридера с картой необходимо сделать антенну, которая представляет собой кольцо диаметром около 60мм из 12 витков одножильного провода от LAN-кабеля длиной чуть более 1м. Провод перевязан изолентой, чтобы витки не распускались. Выводы полученной катушки припаяны к концу отрезка антенного кабеля, который подсоединяется к HF-входу SDR-приёмника.

Антенна для сниффинга Mifare

Основной проблемой при приёме является огромная разница между уровнем излучения ридера и уровнем ответа карты, и для решения этой проблемы пришлось пойти на хитрость: придание антенне ярко выраженных частотных свойств. Для этого к выводам антенны припаян конденатор 1nF, который вместе с индуктивностью антенны (~22мкГн) и входным сопротивлением приёмника ослабляют уровень несущей 13.560МГц. При этом уровень сигнала карты всё-равно остаётся достаточно низким, поэтому для увеличения входной амплитуды, программе управления донглом необходимо включать внутреннее АРУ для выбранного АЦП (RTL AGC).

Для перехвата обмена, антенну следует располагать между ридером и картой вплотную к карте. Программу записи логов следует запустить до начала обмена, логи начнут записываться при появлении сигнала. При приёме за один раз записываются 3 файла: askNNNNN.wav, firNNNNN.wav и ookNNNNN.wav. В файл askNNNNN записывается огибающая, полученная в результате обработки IQ-модов AM-демодулятором. Файл firNNNNN.wav содержит сигнал после обработки цифровым фильтром. Файл ookNNNNN.wav содержит сигнал, соответствующий ON-OFF состояниям передатчика и приёмника.

На экране осциллографа, подключенного к ридеру, сигнал выглядит даже хуже, чем полученный с помощью приёмника

Для визуального просмотра полученных сигналов удобно воспользоваться программой audacity; обычно одновременно открывают два файла: firNNNNN.wav и ookNNNNN.wav.

Рабочий стол audacity со сканированным протоколом обмена

Далее, увеличивая-уменьшая масштаб, можно выбрать интересующую часть сигнала. Качество съёма сигнала такое, что даже без специальных навыков сигнал очень легко декодируется вручную. Просматривая ответы карты можно не просто оценить время ответов карты на запросы ридера, как, например, делает proxmark, а узнать точное время реакции карты на команду, точное время прохождения заданного бита, оценить амплитуду заряда внутреннего конденсатора карты, переходные процессы и т.п. Т.е. «смысл» в сниффере на RTL2832 есть 🙂

Запрос ридера REQA и ответ карты на него ATQA в увеличенном масштабе

Программа для записи протокола обмена между ридером и картой называется rtlcard, версию для Windows можно скачать здесь. Для декодирования обмена в реальном времени используется другой софт, но декодер обмена реального времени — отдельная тема для другого поста. rtlcard поддерживает следующие опции командной строки:

  • f — устанавливает центральную частоту приём в Гц, по умолчанию 13560000
  • g — можно набрать -g ON или -g OFF; включает/выключает внутреннее АРУ для RTL2832; по умолчанию АРУ RTL2832 включено
  • m — можно набрать -m I или -m Q; активирует вход I или Q для чтения сэмплов в режиме прямого преобразования; по умолчанию активирован вход Q

Сэмпл реального обмена ридера с картой, снятый с помощью rtlcard можно скачать здесь.