Система оплаты проезда общественного транспорта Москвы

в 21:50, , рубрики: mifare, RFID, информационная безопасность, Песочница, фрикинг, метки: , , ,

image
Предыстория
В далёком 2005 году, когда я был ещё мелким ребёнком, я впервые увидел такую вещь как «Социальная карта москвича» Смотря на то как пенсионеры прикладывают её при проходе через турникеты наземного транспорта и метрополитена, я стал задумываться над тем, как же работает вся эта система. Но в детстве у меня не было возможности этим заняться. Позже, когда я уже сам начал зарабатывать деньги, я решил всерьёз приступить к изучению системы оплаты проезда в общественном транспорте.

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 килобайт соответственно.
Так же у меня в наличии была социальная карта жителя московской области, которая отличалась от первой только названием и дизайном.
imageimageimageimage

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

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

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

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

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

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

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

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

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

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

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

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

Автор: R0mjke

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js