Карты на стол! Проводим пентест POS-терминалов
Содержание статьи
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Основные компоненты инфраструктуры POS-терминалов
Чтобы лучше понять, как устроена инфраструктура, в которой работает POS-терминал, рассмотрим упрощенную модель его взаимодействия с другими компонентами. Эта схема может быть сложнее, в нее можно добавить другие элементы, такие как банк‑эквайер и банк‑эмитент, сервер обновлений и так далее. Однако в этой статье мы разберем уязвимости, относящиеся прежде всего к платежному приложению и инфраструктуре, в которой терминалы работают.

Итак, по порядку. TMS (Terminal Management System) — это сервер управления парком POS-терминалов. Через него на терминалы распространяется конфигурация (например, формат чеков и логотип), устанавливаются и обновляются приложения, а также он управляет ключами шифрования и логированием. Кроме того, TMS собирает логи с терминалов. Доступ к TMS предоставляется, как правило, через веб‑интерфейс административной панели, в которой можно делать все, что перечислено выше.
Функциональность решений для управления терминалами сильно различается, поэтому наряду с TMS-сервером мы рассмотрим и MDM (Mobile Device Management): современные POS-терминалы все чаще построены на Android. Схему взаимодействия мы, как и прежде, намеренно упростим.

Задача MDM сводится к управлению POS-терминалами — от включения до блокировки устройства. Примерно по такой схеме MDM занимается сбором информации с конечных устройств. В самом простом варианте собирается просто информация о статусе работы терминала, например deviceoffline .

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

Ближе к делу. Кейс № 1
Мы рассмотрели основные компоненты инфраструктуры POS-систем. Теперь можно перейти к одному из кейсов, с которым мы столкнулись на пентесте реального приложения.
Итак, у нас есть пачка POS-терминалов, платежное приложение, которое установлено на эти самые терминалы, и доступ к тестовому веб‑приложению TMS.
Изначально терминал работал в киоск‑режиме, поэтому мы могли пользоваться только целевым приложением, выполняя функции кассира. Более того, из‑за этого у нас отсутствовал доступ к сетевым настройкам и мы не могли настроить MitM для анализа трафика. При этом в меню приложения есть панель «Администратор», но доступ к ней открывается только после ввода шестизначного пароля, состоящего из цифр. Мы сразу для себя определили несколько вариантов, как и где его найти:
- поискать документацию или форумы с ответами на вопросы от техподдержки или какие‑то гайды от компаний по настройке терминалов;
- попробовать простые варианты с кликами по главному экрану приложения или поперебирать комбинации с кнопками громкости;
- поискать захардкоженные секреты в самом приложении;
- запустить полный перебор ручным способом или с помощью Flipper.
Перечитав форумы и документацию от других производителей, мы так ничего и не нашли, зато перебором нащупали рабочий вариант: три нажатия на кнопку включения плюс свайп вниз — и появлялась заветная системная шторка с нижней панелью Android.
info
Стоит отметить: по опыту изучения документации разных производителей выход из киоск‑режима нередко реализован через комбинации кнопок громкости, тапы по определенным углам экрана или логотипу и свайпы.
Дальше мы открыли настройки, но они оказались под паролем, который нам тоже был неизвестен. Терминалов у нас было несколько, поэтому мы стали искать зацепки на других устройствах: подключали терминал к ноутбуку по USB, по возможности проверяли содержимое внешнего хранилища и снова искали информацию в сети, но безрезультатно. На одном из устройств настройки Android оказались без пароля — и мы сразу подняли точку доступа Wi-Fi на ноутбуке.
Ноутбук был подключен Ethernet-кабелем напрямую к роутеру, POS-терминал напрямую подключается к Wi-Fi-точке, развернутой на ноутбуке. Это позволило полноценно перехватывать трафик.
Анализируя сетевой трафик POS-терминала, мы заметили, что он постоянно обращается к одному и тому же IP-адресу и передает практически однотипные данные по протоколу MQTT. В них содержались название вендора, SerialNumber и информация о состоянии устройства (deviceoffline/deviceonline).

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

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

Заходим в панель MDM
С добытой связкой логин/пароль мы смогли аутентифицироваться в веб‑приложении MDM — как под учетной записью вендора, так и под учетной записью клиента, развернувшего MDM на своем сервере.

Интересным показалось, что эта учетная запись не задокументирована и используется вендором для активации POS-терминалов по SerialNumber или для работы MQTT-брокера, поскольку ее даже нет в списке среди остальных пользователей развернутой платформы у клиента.
Внутри панели открылся полный набор возможностей для управления парком терминалов клиента.

Особое внимание привлекла возможность загружать на терминалы приложения.

На вкладке Private Apps мы нашли целевое платежное приложение в нескольких версиях, под разные платформы, а также сам MDM‑клиент. В истории загрузок мы заметили, что на часть терминалов устанавливали приложение PWDGenerator. Оно генерирует пароль для входа в настройки Android согласно документации клиента, поэтому мы его выгрузили для последующего анализа.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее




Подпишись на наc в Telegram!
Только важные новости и лучшие статьи
Подписаться