Взлом проездных и банковских карт. Как создаются вечные проездные

Взлом проездных и банковских карт. Как создаются вечные проездные

Темная сторона

Всем привет!

Прежде чем приступить хотел бы предупредить, что за действия, описанные далее в статье, вы можете получить уголовный срок. Не стоит проделывать это, если вы не уверены на 100%, что всё пройдет гладко.

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

Но даже с ними всё просто не будет. Во-первых, найти в открытом доступе актуальную информацию по этой теме очень не просто. К тому же, система безопасности постоянно улучшается и не факт, что описанные способы окажутся рабочими. Придется додумывать и экспериментировать. Здесь я предоставлю все имеющиеся источники, которые смог найти.

Что нам понадобится:

  • смартфон с NFC или специальный ридер, который будет считывать вашу карту
  • карты MIfare Zero для записи

Программа, с которой мы сегодня будем работать, называется Mifare Classic Tools (скачать её можно даже в Play Market). Она предоставляет возможность для взаимодействия с Mifare Classic RFID-тегами. Также еще можно использовать MFClassic (скачать её можете в моем втором телеграм канале).


Функции и возможности:

• Чтение Mifare Classic тегов

• Сохранение и редактирование данных тегов.

• Запись в Mifare Classic тегов (блочным)

• Клон Mifare Classic

• Управление ключами

• Создание, редактирование и сохранение файлов ключей

• Decode & Encode Mifare Classic Value Blocks

• Decode & Encode Mifare Classic условия доступа

• Сравните отвалов (Diff Tool)

• Отображение общей информации тегов

• Отображение данных тегов, как 7-Bit US-ASCII

• Отображение карты Mifare Classic и условия доступа в виде таблицы

• Дисплей Mifare Classic Value блоков, как целое число

• In-App (в автономном режиме) помощь и информация

Что мне удалось найти

Сам я подобное делать не пробовал да и нет возможности, так как у меня нет подходящих проездных карт и NFC модуля. Ниже будет информация с других сайтов. Ну а так как статьи с подобным содержимым подчищаются, я решил на всякий случай скопировать текст статей сюда (источник я, конечно, укажу). Например, на habr было две статьи посвященные тому, как легко взламываются карты «Тройка» (Москва) и «Подорожник» (Санкт-Петербург). Сейчас они удалены.


Содержимое статьи

Спешу предупредить читателей: Данная статья написана только для ознакомления, и ни в коем случае не призывает заниматься подделкой проездных билетов, так как это противоречит статье 327 УК РФ. Автор не несет ответственности за любые неправомерные действия совершенные людьми с использованием информации из данной статьи.


Я обычная девушка, сравнительно недавно работающая в сфере ИТ, не имею знаний в хакинге и взломе. Но вдохновленная статьями на Хабре про взлом транспортных карт «Тройка» и «Подорожник» (которые уже не доступны, авторы Ammonia и antoo), я решила рассказать про свой собственный опыт взлома транспортных карт «Ситикарт», которые действуют в Нижнем Новгороде.




Сразу скажу, я не хакер и не взломщица, а простой фронт-энд разработчик, мои знания по работе с ПК, если отбросить знания во фронт-энд разработке, можно охарактеризовать, как «опытный пользователь».


Я не разрабатывала специальные приложения, как делали это авторы упомянутых статей, а покажу, как доступными средствами можно легко взламывать транспортные карты. Методы взлома известны давно (лет 5-7 точно).


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


Но вернусь к взлому. Итак, обо всем по порядку.


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


Итак, у меня есть недорогой смартфон с NFC. Я в свое время покупала транспортные карты «Ситикард» (так получилось, что у меня их несколько – порой забывала карту то дома, то на работе и приходилось покупать новую).




Я скачала официальное приложение производителя карт Mifare NXP Taginfo и просканировала свою транспортную карту:


Оказалось, что карта основана на чипе Mifare Plus S, но что самое важное, работает она в режиме безопасности № 1. А это значит, что по сути это простая карта Mifare Classic, которая легко взламывается.


Я скачала в Google Play замечательное приложение Mifare Classic Tool и просканировала транспортную карту стандартными ключами:


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

«Постойте-ка» — подумала я, «но ведь можно попробовать способ, как описано в статье про взлом «Тройки».


Действительно, у «Ситикард» тоже есть приложение из Google Play, которое позволяет проверять баланс карты, а впоследствии прикрутили возможность и пополнять карту.


Я скачала и установила это приложение. Но теперь передо мной встала дилемма: ключи к карте зашиты или в самом приложении, или «прилетают» с сервера. Декомпиллировать Android-приложения достаточно просто, но я в этом не очень хорошо разбираюсь.


Наверняка, более или менее соображающий разработчик может это достаточно легко сделать. Я такими умениями не обладала и обратилась к брату, который занимается ремонтом домофонов, думала, у него есть знакомый программист, но он предложил более элегантное и простое решение.


Он к тому времени получил плату с Кикстартера, которая позволяет подсматривать протокол между ридером и картой. Оказывается, в домофонах стали использовать брелки, внутри которых зашит все тот же чип Mifare, и эта плата ему понадобилась для каких-то дел, связанных с этими брелками (я в подробности не вдавалась).


Итак, он взял свою плату, поместил ее к моему смартфону, который выступил в роли ридера, а в роли карты выступила собственно транспортная карта, и снял лог обмена данными между ридером и картой.


Дальше встал вопрос, что делать с полученным логом. Но непродолжительный поиск в Интернете привел к утилите под название crapto1gui. Ссылки приводить не будут, достаточно легко находится и так.


Скриншот утилиты привожу ниже (взято с одного из сайтов в интернете, так что данные там не реальные, которые мы использовали).


В общем, достаточно в эту утилиту вставить нужные куски лога и 6-байтный ключ мгновенно вычисляется. Я сама удивилась, как легко это делается, самое сложное было скопировать нужные части из лога и вставить в соответствующие поля программы.

Затем я открыла все тоже приложение Mifare Classic Tool (MCT), вставила в приложение полученный ключ и на этот раз мне отобразилось содержимое 0-го и 8-го секторов.


В нулевом секторе в основном были одни нули, а вот в восьмом были какие-то данные, из чего я сделала вывод, что данные по транспортной карте хранятся в 8-м секторе (как и в карте «Тройке» — неужели один и тот же разработчик?), а полученный ключ оказался ключом B (у сектора два ключа A и B).


Дальше, ради интереса, я с помощью опенсорсной утилиты libnfc и ридера бесконтактных карт получила и все остальные ключи от карты (подробнее об этом было написано в статье про «Подорожник» — я тоже использовала этот способ. Он также описан на сайте libnfc).


С помощью полученных ключей я попробовала прочитать содержимой другой транспортной карты. Оказалось, что ключ A совпадал, а ключ B – нет. Но с помощью упомянутой утилиты его тоже оказалось легко получить.


Дальше я принялась исследовать содержимое транспортной карты. 8-й сектор состоит из 4-х блоков по 16 байт. С помощью MCT стало понятно, что первый блок является т. н. Value-блоком. Первым делом пришла мысль, что в этом блоке и хранится баланс карты. С помощью MCT удалось его декодировать – он содержал число 2147483647. На баланс карты, будь он даже в копейках, это явно было не похоже.


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


Разбирать содержимое карты особого желания не было, ведь я хотела попробовать так называемую replay attack (это я уже потом узнала, как она правильно называется).


Утром перед поездкой в метро я сохранила содержимое восьмого сектора, приложила карту к турникету и отправилась на работу. Днем же, отправившись по делам, я с помощью MCT записала предыдущее состояние карты и попробовала проехать в метро… И у меня получилось!


Так я поняла, что таким образом можно делать «вечный проездной». Я решила немного побаловаться и записала содержимое сектора транспортной карты в домофонный брелок.


(вот такой же брелок я использовала для записи в него транспортной карты)

Я попробовала пройти через турникет, приложив брелок, но тут меня постигло разочарование – брелок, к моему удивлению, не сработал. Я подумала, что мою транспортную карту заблокировала (ведь брелок был ее клоном), но при прикладывании «оригинала» (транспортной карты) пройти через турникет удалось.

Я поговорила с братом, хотела узнать, что он думает по этому поводу, и он мне рассказал, что у каждой карты и брелка есть свой идентификационный номер. По всей видимости, мой «клон» был не полным, а содержимое в карте неким образом завязано на ее номер.

Но оказалось, что был выход и из этой ситуации: есть некоторые виды брелков, которые по виду точно такие же, но у них можно менять их номер (у обычных транспортных карт это сделать не получится). Более того, в MCT есть такая функция по перезаписи номера, поскольку он храниться в первом блоке нулевого сектора.

Правда, почему-то поменять номер с помощью MCT не получилось. Но получилось это сделать с помощью ридера и все того же libnfc.

На сей раз у меня получился полный клон транспортной карты в виде брелка, ведь даже номер совпадал. Я попробовала пройти через турникет по домофонному брелку, и это у меня легко получилось. В автобусе прикладывать брелок не рискнула, поскольку тетенька кондуктор могла бы очень удивиться, а вот «вечная» транспортная карта сработала тоже без проблем.



Содержимое статьи

RFID

Конечно же я начал с поиска в гугле и без особых усилий нашёл название данной — RFID (Radio Frequency IDentification) или в переводе на русский Радиочастотная Идентификация. Прочитав статью на википедии, я понял что метки (карты) делятся на 3 диапазона работы, Метки диапазона LF (125—134 кГц), Метки диапазона HF (13,56 МГц), Метки диапазона UHF (860—960 МГц). В общественном транспорте используются метки второго диапазона — HF.


Карты

Сами же карты выпускаются под именем торговой марки Mifare, которая объединяет несколько типов микросхем смарткарт, микросхемы считывателей и продукты на их основе.


На данный момент производятся 5 видов микросхем для карт:

Mifare Classic 1k, Mifare Classic 4k

Mifare Ultralight

Mifare Ultralight C

Mifare Plus

Mifare DESFire EV1


В нашем общественном транспорте используются первый и второй виды карт.


Социальная карта москвича сделана на основе Mifare 1k

Социальная карта студента сделана на основе Mifare 4k

Билет на несколько поездок на метрополитене сделан на основе Mifare Ultralight

1k и 4k означают объём памяти на карте 1 и 4 килобайт соответственно.

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

image
image
image
image

Практика

Естественно чтобы посмотреть данные записанные на карте и как то с ними поработать нужен был ридер для этих карт. В процессе поиска я наткнулся на модель под названием ACR122U. По цене он меня вполне устраивал, с доставкой с интернет-аукциона ebay вышло около 60 долларов.

Вот наконец 3 недели спустя я получил заветную посылку, в ней лежал сам ридер, две пустые белые карты Mifare 1k и диск с драйверами и дистрибутивом.

Собственно ридер

Я сразу же подключил его к ноутбуку, установил нужные драйвера, ридер определял карту, всё шло как надо. Теперь же у меня возник вопрос о том, как считать свою карту. Изначально я думал, что на диске будут все необходимые для этого программы и это будет проще простого, но оказалось не тут то было. Из того что было на диске, полезными, как бы это смешно не звучало, оказались только драйвера. Пришлось снова воспользоваться поиском.


Софт

После нескольких дней поиска я нашёл такой комплект средств разработки под названием libNFC. Немного изучив его я понял, что это именно то, что нужно. Одновременно с этим я наткнулся на блог одного человека по имени Александр darksimpson Симонов, который рассказывал о системе работы турникетов метрополитена, а также о данном проекте. Более того, он даже собрал все необходимые программы под винду, что было весьма удобно. Дальше я приступил к испытаниям. Но для начала расскажу о структуре карты.


Структура карты

Здесь я рассмотрю структуру карт Mifare 1k и 4k. Карта 1k разделена на 16 секторов, от 0 до 15. Нулевой сектор, это блок производителя, в котором записан индивидуальный серийный номер карты UID он прописывается на производстве и не поддаётся изменению. Остальные 15 секторов доступны для считывания/записи. Каждый сектор имеет два ключа вида A и B, а также LOCK-биты.

Комбинация последних даёт считывающему устройству информацию о том, разрешена ли запись/чтение и то с помощью какого вида ключей это можно сделать. В основном считывание происходит через ключи вида А, запись через ключи вида B. На пустых картах во всех секторах стоят ключи FFFFFFFFFFFF.Для 4k ситуация аналогичная, но вместо 16 секторов на ней 40. То есть чтобы считать содержимое карты на компьютер нужно знать ключи от всех 16 секторов, но так как на всех проездных билетах все ключи изменены, возникает логичный вопрос, как же узнать эти ключи? В этом мне помогла утилита MFCUK доработанная и собранная под винду другим блоггером под никнеймом Odinokij_kot. О работе этой программы вы можете прочитать в его статье

Пример работы MFCUK

Считывание карты

Для считывания карты мне понадобилась скачанная программа mfclassic_d.exe, найденные ключи для моей социальной карты жителя московской области и командная строка. В последней я указал путь к программе, файл с ключами от моей карты, вид ключей, запрос на считывание и имя файла в который запишется дамп карты. После нажатия заветной кнопки Enter пошёл процесс считывания, через пару секунд всё закончилось, о чем свидетельствовала надпись Done, 64 of 64 blocks read. Writing data to file: card.mfd… Done. После этого я попытался разобраться в тех данных, которые были записаны на карте, но меня это ни к чему не привело, так как в файле была лишь куча шестнадцатиричных чисел, единственное более менее понятными оказались паспортные данные записанные в одном из секторов. Запись карты производится аналогично, только нужно указать файл с ключами для той карты на которую мы записываем.

Пример работы mfclassic_d

Начало экспериментов. Тест номер №1

Сначала я считал карту до прохода через турникет автобуса, и после. Тоже самое я сделал с турникетом в метро. После сравнения дампов карты, я выяснил, что после прохода в автобусах, трамваях и троллейбусах изменяются только данные записанные в 4 секторе, остальные данные оставались теми же, в метрополитене менялись только данные 1 сектора. Отсюда вывод, метрошники используют 1 сектор, наземники 4.


Тест №2. Наземка

Вторым вопросом стояла возможность клонирования моей карты на одну из двух белых, которые шли в комплекте к ридеру. Указав в программе файл моей карты, а также ключи от пустой карты я начал процесс записи, времени ушло немного больше чем при считывании, примерно 4 секунды. В окне командной строки появилась надпись Done, 64 of 64 blocks written, что свидетельствовало об успешной записи на карту. После этого я отправился на Боевое крещение. Подошёл автобус, на остановке было 3 человека, я заходил последним, чтобы не создать очередь в случае непредвиденной ситуации. Итак, я подхожу к турникету, прикладываю только что записанную карточку, и о чудо, турникет показал срок действия моей социальной карты, заморгал зелёной лампой и дружелюбно пропустил меня в салон. Моему счастью не было предела. Позже я проверил карту на троллейбусах и трамваях, результат был тем же.


Тест №3. Метрополитен

Воодушевлённый успехами на наземном транспорте, я отправился в метро. Спустившись, я подошел к турникету, приложил ту же самую белую карту, на мониторе турникета высветилась надпись Действителен до: чч.мм.гг, после чего я спокойно прошел через турникет. Для меня, конечно, результат был ожидаем, но нотки сомнения всё равно присутствовали. Я был доволен как слон, в моей голове была мысль о безоговорочной победе над общественным транспортом города Москвы. Заехав в одно место, примерно через час мне снова пришлось спуститься в метро и тут меня ждал самый большой сюрприз. Приложив белую карту к турникету я увидел зловещую надпись Билет не исправен. Я приложил её ещё к паре турникетов, результат был тем же. Тогда я достал настоящую социальную карту и лишь с её помощью успешно прошёл через турникет. В метро я продолжал думать что же всё таки произошло. Выйдя на улицу пошёл на остановку, сел на автобус, приложил белую карту, она сработала. Странно, подумал я. Вернувшись домой я стал выяснять что же не так. Не найдя никакого логического объяснения я лёг спать. Следующим утром я спустился в метро, приложил свою оригинальную социальную карту и увидел ту самую пресловутую надпись Билет не исправен. После чего я проследовал в кассу за получением объяснения происходящего, где мне сказали что «возможно вы передали карту другому человеку, который по ней прошёл и это заметили. Из-за этого вашу карту занесли в СТОП-лист» Потом мне объяснили что нужно делать и куда ехать чтобы карту разблокировали. Через 2 недели по моему заявлению карту разблокировали и я продолжал по ней ездить.

image

СТОП-лист

Об этом самом листе в интернете не так много информации, всё что я о нём знаю, я услышал от людей не понаслышке знающих эту систему. В него заносятся серийные номера карт (UID) тех карт, которые ведут себя не корректно, а также например номера студенческих карт, владельцы которых были отчислены из университета. Данный СТОП-лист хранится в каждом турникете в метро и синхронизируется с общей базой примерно каждые 10 минут. Если вы прикладываете карту, с UID занесенным в этот лист, то турникет вас не пропустит, пусть даже срок действия карты ещё не закончился. Теперь объяснение того почему заблокировали мои карты. После того как я приложил белую карту, турникет отправил данные в базу для проверки, где сопоставляется UID и остальная информация о карте, срок действия и её номер (не UID). В ходе проверки база выясняет, что на данный UID нету выданной карты, она ищет настоящий UID по этим данным и после этого отправляет оба UID в СТОП-лист. То есть карты заблокировали из-за того, что серийный номер белой картой отличался от оригинального. Почему такого не произошло на наземном транспорте? Да потому что у всех наземных турникетов не существует общей базы данных, в которой могли бы сопоставляться данные, её нету из-за того что невозможно соединить все турникеты воедино. Таким образом турникет считывает только тип карты и срок её действия, не обращая внимания на UID, который в свою очередь может быть любым.


MIfare Zero

Остановиться в своих экспериментах я не мог, а в размышлениях так тем более. И вот меня посетила мысль, что если вдруг как то изменить UID на такой же как и у оригинальной карты. И вот после поисков в гугле я наткнулся на блог ещё одного человека по имени Андрей, который писал о способе клонирования Mifare карт. Оказалось что существуют неофициально выпускаемые карты под названием Mifare Zero. В этих самых картах блок производителя то бишь UID можно изменить на любой другой. Пообщавшись с Андреем я выяснил, что у него имеются данные карты, и что для экспериментов он готов продать мне одну из них. Мы договорились о встрече на одной из станций метро, где я и обзавёлся этой картой.

Изображение Mifare Zero из блога Андрея

Эксперимент №5. Возвращение в метро

Записав свою карту на карту Mifare Zero, с помощью утилиты mfsetuid_d.exe я поставил на неё UID своей социальной карты. Теперь это были две идентичные карты, которые отличались лишь рисунком, на одной он был, на другой нет. Спустившись в метро я успешно прошёл по данной карте, но радоваться было рано, надо было через некоторое время повторить проход, чтобы точно удостовериться в работоспособности карты и том, что её не заблокируют. Целую неделю я проходил через турникет по белой карте, всё было отлично, в СТОП-лист её не вносили. Успех!


Эксперимент №6

Следующим что я захотел испытать получится ли осуществить проход сразу нескольких людей, потому как по моей карте можно было пройти 1 раз в 7 минут. Взяв обе карты, мы с другом пошли в метро. Сначала прошёл я по оригинальной карте, затем друг по белой на соседнем турникете, пока что всё отлично, посидев в макдаке, мы поехали обратно, но к сожалению обе карты оказались заблокированными. Объяснение этому в том, что после моего прохода в базу пришли данные о моей карте, они проверились, всё сходится, следом прошел друг и данные снова верны. Но система увидела то, что по одной карте прошли 2 раза не выдержав 7 минутный интервал, такого быть не может, карта ведет себя не корректно и поэтому система её заблокировала. Вывод из этого такой, клонировать карту всё таки можно, но система защиты в метрополитене работает отлично и обойти её всё-таки наверное невозможно. Но пара задумок всё ещё оставалась.


Эксперимент №7

Предметом этого испытания стали карты студента. Однажды я предположил что если к примеру есть два студенческих проездных. Один из них продлен на данный месяц, второй нет. Так вот, если банально скопировать 1 сектор с продлённого проездного на непродлённый, то может что и выйдет?.. Начало месяца. Я не стал продлевать студенческую карту и взял на несколько часов продленную карту своей подруги, считал содержимое 1 сектора и записал на свою карту. После этого я отправился в метро со своей картой, приложив её я увидел что срок действия карты до конца текущего месяца. В результате я в течении всего дня ездил по данной карте, её не блокировали. Тут я снова подумал теперь точно победа, карта на блокируется и продлевать её можно с любого продленного студенческого, но как обычно не тут то было. Следующим утром карта была заблокирована. Видимо это случается потому, что в конце каждого дня база проверяет был ли действительно данный студенческий билет продлён на текущий месяц, в нашем случае нет, следовательно карту в СТОП-лист


Выводы

Система осуществления оплаты проезда в московском метрополитене создана с точным знанием всех открытий в сфере Mifare. Нет, конечно можно пройти по неоригинальному билету, но сделать это вы сможете всего несколько раз, после чего её заблокируют. Система СТОП-листа работает на должном уровне. Как говорится «бесплатный сыр только в мышеловке».



Ну и конечно же куда без нашего старого доброго Youtube. Роликов демонстрирующих работу программы Mifare Classic Tolls там тоже достаточно.

Так что, если кто-то хочет поэкспериментировать и поиграться - добро пожаловать. Как я и предупреждал, легко точно не будет, и найти полный и актуальный мануал по взлому карт вряд ли получится. Придется поработать ручками и пошевелить мозгами.

Report Page