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

При въезде выдается парковочный талон, при выезде он засовывается обратно в терминал. В основном, талоны бывают двух типов: бумажные со штрихкодом/QR-кодом и пластиковые бесконтактные карты, о последних и пойдет речь.
Как обычно, сразу хочу оговориться что вся информация представлена исключительно в ознакомительных целях и не несет в себе цели спонсирования терроризма и установления мирового господства.
Как-то раз, воспользовавшись парковкой одного столичного торгового центра я, вдохновившись статьями про Тройку и Подорожник, а так же из чистого любопытства запустил на телефоне с поддержкой технологии NFC приложение MifareClassicTool и попробовал прочитать содержимое карты. Логично было бы предположить, что проверка факта оплаты проводится в режиме онлайн, а карта используется только как идентификатор пользователя. В таком случае без доступа к внутренней сети тут делать нечего и этой статьи попросту бы не было, но реальность оказалась интереснее. Моим глазам предстала приблизительно такая картина:

Скриншот немного сокращен для удобства читателей. Карта представляет собой Mifare Classic 1K, разделена на 16 секторов. В секторах 1-9 записана какая-то информация и ключи от них неизвестны. В остальных пусто и используются ключи по умолчанию. Очень любопытно. К счастью для нас, проприетарный протокол шифрования crypto1, используемый в этих картах, хорошо изучен и имеет уязвимости.
Нам понадобится ноутбук, ридер бесконтактных карт типа ACR122U и приложение mfoc, которое позволяет имея всего одни ключ от любого сектора за разумное время восстановить все остальные. Пропустим этап сборки и настройки этого добра, перейдем сразу к делу. Кладем карту на ридер, запускаем программу, оставляем ноутбук в машине и идем шопиться, ведь ради этого мы сюда и приехали. Прошел час, все ключи восстановлены, пробуем прочитать карту еще раз.

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

Отличий не очень много, но на что же они похожи? Да это же время въезда в BCD формате, 11:25:47. Рядом с ним дата, 12.11.2018. Меняем дату на несколько дней назад, идем к терминалу оплаты и он радостно сообщает что мы должны ему много денег. Меняем дату обратно, ставим текущее время и бесплатно выезжаем с парковки.
В принципе, на этом можно было бы остановиться, но любовь к исследованиям пересиливает лень, едем в другой торговый центр и повторяем операцию там. Ключи отличаются, но формат данных аналогичный. Посетив несколько торговых центров и один вокзал и проведя несколько опытов становится понятно что к чему. В первом секторе хранится срок действия карты, в нашем примере это до 31.12.2050. Во втором — время въезда, время и сумма оплаты, время, до которого разрешен выезд. Блоки третьего и последующих секторов надо читать как 4 числа в little-endian. Попробуем расшифровать данные в нашем примере.

Блоки с описанием тарифов отличаются между парковками, первый блок сектора 3 используется как заголовок, но его формат остался не известен, в открытом доступе документацию найти не удалось, да это уже и не столь важно.
Наверное, тут надо сделать какие-то выводы. Разработчики системы могли бы использовать онлайн проверку, могли бы использовать карты типы Desfire / Ultralight C, не имеющие известных уязвимостей, но понадеялись на безопасность устаревшей технологии. С другой стороны, это не банковская карта и убыток тут не значителен, хотя таксисты на вокзале будут довольны.
Автор: parktime