Взламываем транспортные карты: чит на бесконечные деньги
Этот парень открыл все турникеты на станции. Вы до сих пор считаете, что хакеры приносят только вред?
Начну с простого вопроса: кто из вас пользуется общественным транспортом? А кому нравится за него платить? Если такие все же найдутся, то могут смело переставать читать статью. Для остальных у меня есть рассказ о том, как четверо старшеклассников из Массачусетса взломали местную транспортную систему.
Жителям Бостона статья поможет получить бесплатные поездки, а для всех остальных этот материал будет неплохим уроком по реверс-инжинирингу. Ну или, по крайней мере, вы узнаете любопытную историю.
Разные авторы неоднократно писали на Хабре о взломе транспортных карт. В 2016-м досталось «Тройке», затем «Подорожнику», «Ситикард» и Metromoney. Первые статьи из этой серии вскоре загадочно исчезли со страниц сайта, но исправить проблему дырявых транспортных систем в реальности оказалось несколько сложнее. Иначе почему она актуальна и сегодня, спустя 7 лет, в крупных городах по всему миру?
На этот раз тему исследовали простые старшеклассники Мэтти Харрис, Захари Бертокки, Ноа Гибсон и Скотт Кэмпбелл. В итоге они выступили с докладом на DEF CON 31. Давайте разберемся, как и чего они добились.
Краткая предыстория
Итак, хакерской атаке подверглось «the T» (оно же MBTA) — транспортное управление залива Массачусетс. Американское государственное агентство, которое координирует работу местного метро, пригородных поездов, паромов и большинства автобусов в Бостоне. Еще это самая старая транспортная система в США, и в 2008 году у нее уже были проблемы с хакерами.
Тогда группа студентов MIT поняла, как взломать карты Charlie с магнитной полосой и начислить на них до $600. Они хотели выступить на DEF CON с презентацией, но MBTA такая идея не понравилась. Агентство наложило судебный запрет, и доклад не состоялся.
Ирония в том, что, когда на них подали в суд, согласно американским законам презентация и все материалы исследования перешли в общественное достояние. Эти записи и вдохновили новое поколение хакеров на еще одну попытку.
Шило на мыло
В прошлый раз взлом транспортных карт начался с покупки считывателя магнитных полос. Поэтому MBTA отказалась от этой технологии и теперь использует бесконтактные проездные.
Захари Бертокки начал собственное исследование и выяснил, что в »современных» бостонских проездных используется технология MIFARE. У нее есть множество разновидностей: MIFARE Plus, Ultralight, DESfire, но самая печально известная — MIFARE Classic. Конечно, именно она используется в картах Charlie. Захари поискал подходящий считыватель NFC и, перебрав несколько вариантов, остановился на PN532. Это небольшая красная платка стоимостью около $9, которая продается на Aliexpress и работает в паре с Raspberry Pi.
В MIFARE Classic применяется проприетарный 48-битный алгоритм шифрования NXP под названием Crypto1, который основан на принципе security through obscurity. При поверхностном погружении в криптографию может показаться, что это неплохо. На самом деле подобное шифрование реально взломать примерно за час, что было неоднократно продемонстрировано на практике. В отличие от обычного шифрования, в котором есть один или два ключа, в MIFARE Classic суммарно насчитывается 32 Sector keys. Чтобы их получить, можно использовать два вида атак: nested и dark side. В сети нетрудно найти ряд инструментов для их реализации и всю необходимую справочную информацию.
Захари нашел в сети стандартные ключи MIFARE, загрузил их в утилиту под названием MFOC, которая реализует атаку nested, и получил все шестнадцать пар ключей A и B.
Очевидно, что при внедрении бесконтактных проездных MBTA попросту не позаботилась о смене стандартных ключей. Это развязывает руки всем желающим манипулировать данными, записанными на карточки.
Скриншот из шестнадцатеричного редактора с двоичными данными транспортной карты Charlie
Сперва Захари сделал дамп двоичных данных с проездного Charlie, чтобы провести атаку на подобие той, котрая получилась у студентов MIT. Он записал дамп на пустую болванку — китайскую карту с бэкдором, позволяющим изменять UID. И это сработало.
Терминал снял деньги с болванки, но на оригинальной карте осталась прежняя сумма. Следовательно, в этой транспортной системе нет источника истины в виде некой базы данных. Вся информация о балансе хранится непосредственно на карте.
Не все так просто
Такое клонирование напоминает чит-код на бесконечные деньги, но с ним связан ряд проблем. Чтобы эксплуатировать подобную уязвимость, сперва нужно купить и пополнить оригинальную карту. Притом пары одинаковых проездных довольно быстро блокируют — их многократное использование вызывает срабатывание систем защиты. Совсем другое дело — подделка карт. Но для этого пришлось внимательно изучить шестнадцатеричный дамп.
Выяснилось, что при преобразовании первых четырех байтов (UID) в десятичный вид они соответствуют напечатанному на проездном числу — серийному номеру.
Затем Захари вспомнил, что в старых билетах Charlie была контрольная сумма, и нашел нечто похожее в свежем дампе.
Два байта данных, которые выделены жёлтым, наверняка являются контрольной суммой, ведь они есть даже в тех строках, которые заполнены нулями
К сожалению, ни один из десятков популярных алгоритмов хэширования не сработал с этими строками.
Расшифровка хэша
Где-то на этом этапе к проекту присоединились Скотт Кэмпбелл и Мэтти Харрис. Вместе исследователи начали сравнивать дампы разных карт.
Примеры контрольной суммы из двух разных карт
В приведенном примере одинаковые строки из двух дампов с разных проездных имеют разную контрольную сумму. Значит, к ним добавлена криптографическая соль. Понимание этого могло бы стать следующим шагом в расшифровке хэша. Но исследователи порядка трех недель проверяли стандартные калькуляторы контрольных сумм с солью и все равно ничего не добились.
Калькуляторы контрольных сумм
Прорыв обеспечил поиск математических закономерностей между контрольными суммами. Оказалось, если взять пару строк с одинаковыми данными из разных проездных и применить к ним функцию XOR, получается одно и то же значение.
0×98С3 — модификатор контрольных сумм
Как это можно использовать? Первый шаг — поиск двух одинаковых строк. Проще всего взять те, которые содержат одни нули. Затем идет расчет модификатора контрольных сумм. Так исследователи назвали значение, которое получается при XOR двух контрольных сумм. Это значение можно использовать для переноса строк с одной карты на другую.
Для этого нужно скопировать любую строку из дампа карты, а затем применить XOR к старой контрольной сумме, и получить новую. После этого остается записать её в соответствующий слот, и строка скопирована.
Возможности для реверс-инжиниринга
На первый взгляд, такой подход мало отличается от простого клонирования, но он позволяет не просто переносить дампы с карты на карту, а редактировать данные. К тому же значительно расширяются возможности для реверс-инжиниринга.
Долгое время Харрис, Бертокки, Гибсон и Кэмпбелл действовали методом проб и ошибок, меняя случайные данные на картах и тут же прикладывая их к считывателям на станциях в метро. Чтобы сэкономить время и перезаписывать карты «не отходя от кассы» они собрали портативный считыватель NFC из PN532, Raspberry Pi и повербанка
Допустим, вы пополнили проездной на $50 и клонировали его. Если проездной заблокируют, то эти средства пропадут. Но можно скопировать строку с деньгами со старой карты на новую и пользоваться ей дальше. Для этого нужно определить, в какой строке дампа закодирована информация о хранящихся на карте средствах. Естественно, это значение должно меняться после оплаты, так что требуется только найти нужные переменные.
Зелёным показана текущая сумма на карте, розовым — предыдущая
Казалось бы, не похоже на сумму в долларах, но тут начинается математическая магия. Если преобразовать значения из шестнадцатеричного в десятичный вид, то получаются следующие числа.
Все еще и отдаленно не напоминает баксы, но если поделить эти значения на два, то они начинают выглядеть знакомо. Повторив такие операции еще с несколькими картами, исследователи поняли, что именно в этой переменной хранятся деньги. Только они почему-то выражены в половинках — 0,5 цента. Примерно также выяснилось, что в памяти каждой карты есть два регистра транзакций: по одному для текущего и предыдущего значений.
Как изменить содержимое карты и «накрутить» деньги
Первым делом нужно изолировать переменные. Как видите, единственные различающиеся между этими двумя строками данные выделены красным.
Слева — деньги, справа — контрольная сумма
Затем исследователи попробовали выполнить XOR двух значений в разных версиях. По своему логично, ведь эта операция была ключом к копированию данных между картами. Так удалось получить выделенное зелёным значение, которое назвали модификатором данных. Затем операции XOR подвергли две контрольные суммы, что дало помеченное красным значение — модификатор контрольных сумм.
Далее исследователи взяли карту, на которой лежало ноль долларов и ноль центров и выполнили XOR с модификатором данных. Параллельно XOR-у подвергли контрольную сумму с модификатором контрольных сумм.
Сработало: получилась новая строка, которую записали на карту. И считыватель принял ее.
Впрочем, этих изменений оказалось недостаточно даже для одной поездки. Чтобы значительно увеличить сумму, на карту сперва пришлось положить еще 25 центов.
Дополнительный четвертак понадобился, поскольку в этом методе используется XOR двух значений. Как видно из примера выше, со значением 15 невозможно выполнять XOR и дальше. Необходимо добавить внешнее значение, чтобы получить ещё один бит, и только после этого продолжать «накрутку».
Имея на руках карту с двумя долларами и шестьюдесятью центами, можно повторять описанные операции раз за разом:
выполнить XOR, чтобы получить модификатор данных и модификатор контрольной суммы;
взять карту с нулём, сделать XOR денег с модификатором данных и контрольной суммы с модификатором контрольной суммы;
получить новую строку с $4,95;
И так по кругу.
Модификаторы данных и контрольной суммы удваиваются, пока не упираются в предельное значение $327,67. Это притом, что обычно карту Charlie нельзя пополнить более чем на $100.
Позже исследователи усовершенствовали процесс так, чтобы не приходилось каждый раз добавлять 25 центов: собрали все модификаторы в большую таблицу и автоматизировали модификацию дампа.
Словарь и краткое описание преобразований разных типов данных в памяти проездного
Таким образом:
Необходимо выбрать, что менять, например: 0×32 ($0,25) на 0xC8 ($1) в столбце 7.
Найти модификатор данных: XOR 0×32 c 0xC8 и получить 0xFA.
Найти модификатор контрольной суммы: подставить 0xFA и столбец 7 в таблицу поиска.
XOR модифицированной контрольной суммы (0xDE81) с прежней контрольной суммой, чтобы получить целевую контрольную сумму.
С учетом автоматизации в конечном счете взлом транспортной системы Бостона свелся к двум шагам:
Купить карту за 25 центов;
Изменить данные на $327.
Post-mortem
Анатомия карты Charlie
Самое интересное в дампе — переменные, которые отвечают за деньги и тип карты. Первые позволяют изготовить Charlie на $300, а вторые — делать проездные для людей с нарушением зрения, пенсионеров, студентов и сотрудников метро.
Для демонстрации своих достижений Харрис, Бертокки, Гибсон и Кэмпбелл собрали автомат для записи транспортных карт и обратились в MBTA.
Хотя взлом транспортных карт незаконен, на этот раз транспортное агентство не стало подавать в суд. Более того, он даже разрешило нашим героям сделать доклад о своем проекте на DEF CON.
Исследователей пригласили на совещание в головной офис управления и выслушали их рекомендации. По сути они сводятся к следующему:
при реализации системы оплаты поездок не следует хранить деньги на карте;
стоит использовать готовые защищённые системы наподобие Apple и Google Pay;
данные о картах, транзакциях и пользователях желательно хранить в отдельной базе данных;
подобные системы необходимо поддерживать и регулярно модернизировать после развертывания.
Сделало ли транспортное управление залива Массачусетс какие-то выводы из всей этой истории? Кажется, что да. Bostonglobe пишет, что MBTA совместно с исследователями разработало автоматизированные сценарии, которые могут распознавать поддельные карты и удаленно деактивировать их каждые 24 часа. Тем не менее, окончательное решение проблемы явно потребует замены нынешней системы CharlieCard. Модернизацию планируется завершить к марту 2025 года.