Давай лавэ: как взламывают банкоматы, от отвертки до black box для самых маленьких и ленивых

Messages
121
Reputation
1
Reaction score
46
Points
28
atm-jackpotting-690x480.jpg

Наверное каждый, кто хоть раз снимал деньги из банкомата, слыша приятный шум диспенсера, задумывался о том как бы достать их побольше. И не мудрено, ещё в 90х, пересмотрев “Терминатор-2”, где Джон Коннор взламывает ATM с помощью ноутбука, некоторые начинали мечтать о том, как бы повторить его злодеяния. Несмотря на то, что терминаторов и скайнет до сих пор не изобрели, атаки на банкомат – реальность. Сегодня мы рассмотрим самые известные методы взлома ATM в мельчайших нюансах.

Для начала давайте разберемся как устроен банкомат. По сути – это сейф с компьютером, подключенный к сети. Снизу, в сейфе, хранятся деньги в специальных кассетах. Сейф оборудован механизмом подачи купюр, который называется диспенсер, выдающим деньги из кассет.

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

Банкомат связан с банком защищенным каналом связи, обычно по протоколам NDC/DDC(спецификации внизу статьи) или X.25(в общих случаях).

Деньги хранятся в кассетах, в среднем, этих кассет от четырех до шести. В каждой кассете примерно 2500 банкнот. Каждая кассета настроена под банкноту своего номинала: вместо купюр номиналом пятьдесят рублей не получится зарядить пятитыcячные.

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

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

Сейф защищен намного лучше – это шкаф из стали и бетона с двумя типами замков, кодовым (электронным или лимбовым, иногда встречаются электромеханические) и ключевым – как правило, сувальдным. В сейфе располагаются устройства, имеющее непосредственное отношение к деньгам, – диспенсер, из которого наличные выдаются, и модуль для приема наличных. Зачастую, сейф оборудуется датчиками. Они сообщают о наклоне, шуме, повышении температуры.

Список ПО, установленного в банкомате невелик:

  • Операционная система. Благодаря сильному лобби со стороны Microsoft большинство банкоматов работают под управлением ОС Windows разных модификаций. Хотя можно встретить машины, обычно более старые, под управлением QNX или AIX.
  • Програмное обеспечение для управления модулями
  • ПО, используемое для взаимодействия с пользователем (клиентом банкомата или оператором)
  • ПО для связи с процессинговым центром (который обеспечивает информационную и технологическую стороны транзакции)
  • антивирус или ПО для контроля целостности системы
Как правило, этого достаточно для выполнения банкоматом его непосредственных функций, но некоторые особо умные банки устанавливают на свои ATM такое ПО. как Acrobat Reader версии 6.0, Radmin, TeamViewer, активируют RDP и прочее ненужное и даже опасное в некоторых случаях програмное обеспечение.

Как и писалось выше, в качестве операционной системы, наверное, в 60% банкоматов до сих пор используют Windows. Да не просто Windows, а Windows XP. Microsoft не выпускает обновления для этой ОС с апреля 2014 года. Само собой, все 0-day для Windows XP остаются неустраненными. Зачастую, сотрудники, обслуживающие банкоматы, считают, что если банкомат работает, то лучше его и «не трогать». Поэтому на некоторых ATM до сих пор можно обнаружить, например, незалатанную критическую уязвимость MS08-067, дающую возможность удаленного выполнения кода.

Модули банкомата реализованы на микроконтроллерах с операционными системами реального времени (RTOS), статический анализ слабо применим к таким системам.

В каждый момент времени банкомат находится в одном из режимов работы:

  • Power Up — Загрузка
  • Offline — Нет связи с сервером или идёт соединение
  • Supervisor — Режим для инкассатора или сервис-инженера
  • Out of service — банкомат неисправен, кончились деньги, или банк перевёл его в этот режим
  • In service — основной режим работы
В режиме In service банкомат находится в одном из состояний (стейт), с номером от 001 до 999, и 25 символьной строкой-описанием.

Первый символ этой строки — тип стейта (обозначаются буквами A..Z а так же a..z и некоторыми символами (,’.?)), он определяет совокупность. Остальные 24 символа — это 8 десятичных 3-значных чисел, каждое из которых является определенной настройкой стейта (номер экрана для показа, условия перехода на стейт, список действий). Стейтов одного типа может быть любое количество.

Режим In service​

При старте режима обслуживания банкомат автоматически начинает выполнять стейт 000. Обычно это стейт A (Card read state). В этом стейте банкомат отображает экран с приглашением вставить карту и переводит картридер в режим приёма. Также стейт отвечает за чтение карты и ветвление в зависимости от результатов этой операции.

Ниже пример конфигурации типичного стейта A:
000A001001011008004002001104

000 — номер стейта
A — тип стейта (Card read state)
001 — номер экрана (Screen number)
001 — номер стейта, на который переходить в случае успешного чтения карты
011 — номер стейта, на который переходить в случае ошибок чтения карты
008 — условие чтения 1
004 — условие чтения 2
002 — условие чтения 3
001 — условие возврата карты (сразу после чтения или по завершение операции)
104 — стейт перехода, если если карта неизвестна банку

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

Не каждый стейт имеет экран.

Экран может иметь номер от 000 до 999. Экраны, отличающиеся на 100, обычно резервируют под разные языки. Таким образом экран 010 и экран 210 это скорее всего разноязычные версии одного экрана. Об экранах я расскажу чуть позже.

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

Помимо стейтов и экранов в банкомате есть ещё один важный конфигурационный параметр — financial institution table. Таблица финансовых институтов содержит данные о том, какие карты принадлежат какому банку, как правильно парсить данные прочитанные с дорожек карты, и что делать в зависимости от этих данных дальше. Например если карта локальная то можно выполнить один сценарий, если карта стороннего банка то нужно запретить ветку сценария с мобильными платежами и проверкой баланса.

Номер стейта перехода в случае проблем с чтением карты — если карту не получилось прочесть ни по одному из предложенных условий — переходим на стейт, указанный в этом параметре. Как правило, это стейт J (Close state) на котором мы отдаём карту, показываем экран с предложением забрать её и активируем таймер по истечению срока которого будет запущен механизм удержания карты. Стейт J также является последним стейтом в случае успешной транзакции.

Условия чтения карты (3 параметра подряд) — это битовые маски, обозначающие номера треков, которые нужно прочесть, и взаимодействие с чипом в случае его наличия.

Например, Read Chip, Read Track 2 and Track 1, Read Track 1. Если хоть одно из условий срабатывает, то остальные условия не выполняются и карта считается прочитанной. Если ни одно из условий не выполняется, карта считается непрочитанной.

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

Остальные стейты устроены схожим образом:

  • Есть стейты для чтения суммы с клавиатуры и помещения в специальный внутренний буфер;
  • Есть стейты для чтения пин-кода пин-падом и получение затем пин-блока в специальный буфер;
  • Есть стейты для проверки введенных данных (например, если введенная сумма меньше минимальной суммы, то идет перенаправление на стейт с сообщением об ошибке);
  • Есть стейты для выбора с помощью боковых клавиш (так называемых FDK) и помещения символов этих клавиш (ABCD FGHI) в специальный 8-байтный буфур;
  • Есть стейты для обнуления и предустановки буферов.
Переходя по всем этим стейтам, приложение рано или поздно доходит до стейта взаимодействия с хостом — стейта I (Transaction Request State). На этом стейте формируется запрос из данных, собранных на прошлых стейтах и отправляется на сервер. Запрос представляет собой ID Банкомата (Logical Unit Number), данные с дорожек карты, данные о предыдущих транзакциях, данных с буферов суммы, пин-блока, нажатий функциональных клавиш (FDK буфер). Данные разделяются символом разделителем. Серверное приложение получает запрос и анализирует буфер FDK – именно по содержимому этого буфера хост понимает чего хочет банкомат. После чего, в зависимости от принятого решения, отсылает ответ в котором содержатся:

  • идентификатор действия которое нужно совершить;
  • номер экрана который нужно при этом действии показывать;
  • содержимое чека, если чек нужно напечатать;
  • стейт на который нужно перейти по завершению действия.
В специальном буфере передается количество купюр, которое нужно выдать из каждой кассеты (если это операция снятия наличных). Именно количество купюр, потому что банкомат не знает номиналы выдаваемых денег для него это просто бумажки в кассетах.

По завершению требуемых действий приложение шлёт подтверждение на хост и переходит на указанный стейт. Как правило это уже известный нам стейт J. В случае какого-либо сбоя приложение шлёт сообщение о сбое на хост и ждёт нового Transaction Reply с переходом на новый стейт.

Экран банкомата представляет собой поле 32х16 клеток. Экран может содержать как графическую информацию, так и текстовую, которая позиционируется относительно клеток. Шрифты могут быть двойной высоты.

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

Пример экрана, отображающего картинку из таблицы картинок (\0c\1bP2018\1b\5c)

Именно на такие экраны ссылаются параметры стейта.

Совокупность стейтов, экранов, FIT, таймеров называется сценарием банкомата. Каждый сценарий имеет свой номер. После загрузки банкомата и подключением его к сети, он шлет на хост сообщение в котором сообщает свой ID и номер конфигурации. Если конфигурацию следует обновить — хост переводит банкомат в режим «Out Of Service» и начинает грузить необходимые параметры новой конфигурации. Последним параметром идёт номер конфигурации. Схожим образом происходит загрузка ключей для шифрования пин-блока, для макирования, и мастер-ключей.

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

Как мы видим, банкомат – это конструктор, порой, с кривым оборудованием и устаревшим ПО. Немудрено, что такая система рано или поздно падёт жертвой логических атак.
atack_options.jpg

Возможности для логической атаки на банкомат
Но, обо всём по порядку…

Против лома нет приёма​

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

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

Поведение при обнаружении не забранной карты полностью настраивается — банкомат может как захватить её, так и оставить в тракте. Тоже самое относится к выдаче карты до/после денег, в начале/конце работы, при отключении электричества. Что делать, если введён неверный PIN, введен ложный PIN (если есть), когда обнуляется счетчик неверных PIN-ов, нужен ли захват карты — все решает хост. Если хост не проинструктирует банкомат захватить карту, он её не захватит, будь она хоть десять раз фальшивая, украденная и потерянная.

Просто и логично? Чем не логическая атака? До 2016 в большинстве банков всё работало как часы. Но прошло время и уязвимость была исправлена. Тем не менее, и сейчас существуют, как банки, в которых ничего об этом не слышали, так и устаревшие машины. Мир очень большой…

Усложняемся: black box​

Для реализации такой атаки злоумышленники сверлят отверстие в лицевой панели банкомата, чтобы добраться к шине USB или напрямую к кабелю диспенсера. Получив доступ к кабелю, злоумышленник может подключить диспенсер к своему устройству, запрограммированному для отправки команд на выдачу купюр. Атаки такого
типа получили название Black Box.
ripatm.jpg
Банкомат с просверленным отверстием в сервисную зону Начнём с использования сервисных утилит и их модифицированныз версий, изначально предусмотренных производителями банкоматов для проверки работоспособности устройств. Одна из функций таких утилит – тестирование работы диспенсера, в том числе выдача банкнот. Для проведения такого теста инженеру нужно подтвердить свою легитимность путем открывания двери сейфа или какими-либо манипуляциями с кассетами диспенсера. Логика проста – если ты можешь открыть сейф, то у тебя есть ключ, т.е. ты лицензированный инженер или инкассатор. Но никто не отменял выпуск новых версий IDA Pro, и замена пары байтов в утилите на «правильные» позволяет «тестировать» выдачу без каких бы то ни было проверок. Как же происходит атака? Злоумышленник вскрывает или сверлит банкомат, подключает диспенсер к своему ноутбуку и покидет место преступления, оставив устройство подключенным. Ноутбук с установленными драйверами для диспенсера банкомата с пропатченной утилитой KDIAG, не требующей подтверждения открытия крышки, по команде оператора отдаёт команду о выдаче денег. Для организации удаленного доступа оператора к ноутбуку подключен USB GPRS модем. В качестве ОС используется Windows, версии XP или 7 для лучшей совместимости с драйверами.

Выдача денег с помощью сервисной утилиты KDiag на банкоматах Wincor Nixdorf Wincor Nixdorf KDiag 2.6 Setup с драйверомСкачать Также в свободном доступе существует софт от ATMDesk. Ещё один способ обогатиться для злоумышленников – изменить номинал выдаваемых купюр, опять же при помощи диагностической утилиты. В результате атакующий получает из кассеты деньги с самым большим номиналом (например, 100 долларами или евро), а ПО банкомата думает, что выдает наименьший из имеющихся номиналов. Таким образом, по карте с балансом в несколько сотен можно получить несколько тысяч. Недостаточно надежная система защиты NCR используется в половине банкоматов. Еще в 19% машин вовсе отсутствуют какие-либо меры защиты от атак Black Box. XFS XFS (CEN/XFS, а в прошлом WOSA/XFS), или eXtensions for Financial Services – стандарт, предоставляющий клиент-серверную архитектуру для взаимодействия финансовых приложений на платформе Windows с устройствами, в частности, для банкоматов. Стандарт направлен на унификацию работы ПО с любым оборудованием, независимо от производителя, и предоставляет для этой цели общий API. В случае, если банкоматом находится под управлением системы на основе Windows, задача програмного обсепечения сводится к организации взаимодействия пользователя (клиента или обслуживающего персонала) с процессинговым центром, который присылает банкомату команды, и управляет оборудованием, которое эти команды выполняет. Обмен сообщениями с процессинговым центром происходит по протоколам (NDC/DDC или X.25), пользователь работает через GUI, а за работу каждого модуля банкомата отвечают соответствующие сервис-провайдеры (своеобразные шлюзы в эти модули). Для трансляции команд в сервис-провайдеры и далее в оборудование, а также для возврата статусных сообщений, используется уровень, называемый XFS Manager – согласно концепции WOSA. Любой крупный производитель банкоматов (Wincor, NCR, Diebold) имеет свою реализацию как XFS, так и банковского приложения. Однако на рынке есть альтернативный софт, соответствующий всем стандартам и не привязанный к конкретному вендору. Существует несколько реализаций XFS-менеджеров (в том числе с открытым исходным кодом), написанных на С++ и теоретически библиотеки сервисных провайдеров, написанные под один менеджер, так же должны подходить ко всем остальным, но по факту иногда библиотека, написанная конкретным вендором под конкретный XFS менеджер, работает только с этим менеджером. Также существует Java XFS со своими библиотеками, не совместимыми с классическими менеджерами.

xfs_how_works-scaled-e1603024004168.jpg

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

Например, диспенсер, наиболее интересное для злоумышленников устройство, может выдавать деньги без всякой авторизации. А в некоторых моделях банкоматов при помощи XFS можно программными способами открыть сейф и разблокировать кассеты.

Применительно к картридеру XFS позволяет читать и записывать данные магнитной полосы банковской карты и даже получать историю транзакций, хранящихся на чипе EMV-карты.

Нельзя не упомянуть и пинпад – Encrypted PIN-pad (EPP). Считается, что PIN нельзя перехватить, потому что он вводится на пин-паде банкомата и непосредственно внутри модуля шифрования превращается в пин-блок (для этого криптоклавиатура EPP содержит ключи, пара к которым находится в аппаратном модуле безопасности банка). Однако XFS позволяет нам использовать пин-пад в двух режимах:

  1. открытом – для ввода различных числовых значений, например, суммы, которую требуется выдать;
  2. защищенном (безопасном), в который криптоклавиатура EPP переключается для ввода пин-кода и ключей шифрования.
Такая особенность позволяет реализовать атаку типа «человек посередине» (MiTM). Надо всего лишь перехватить команду от хоста к пин-паду EPP на переключение в защищенный режим и сообщить устройству, что работа продолжается в открытом режиме. В ответном сообщении пин-пад EPP передаст нажатые клавиши в виде простого текста, что и требуется злоумышленнику.

Ты спросишь, а как же аутентификация и эксклюзивный доступ? Да и спецификации на стандарт наверняка не достать? К сожалению, это не про XFS. Никакой аутентификации этот стандарт не предусматривает, а эксклюзивный доступ к сервис-провайдерам реализован, но не ради безопасности. Это всего лишь функция однопоточной отправки команд, чтобы случайно не сломать нежную железяку путем параллельной отправки двух одинаковых команд.
 
Top