Всем привет. Сегодня хотелось бы с вами поговорить о Point of Sale (далее POS) системах, их архитектуре и безопасности. Вероятно, постпраздничный шок от длинных очередей в магазинах прошел, и самое время посмотреть, что же находится за этой завесой социальных коммуникаций. Исследование, описанное ниже, было проведено @chipik и мной.
Современные POS-системы представляют собой комбинацию программных и аппаратных решений, позволяющих проводить платежные операции и облегчающих ежедневные бизнес-процессы. Говоря о POS-ах, обычно имеют в виду кассовые аппараты, терминалы оплаты и другие привычные состовляющие торговых магазинов. Однако, архитектура POS не ограничивается только этими элементами. Что же касается безопасности, то, казалось бы, это тема не новая: начиная с 2012 года, почти на каждой конференции BlackHat USA был доклад о платежных системах (тут, тут, тут, тут). Но все эти доклады, будучи очень близки к обсуждаемой теме, все же немного о другом.
Чтобы стало понятнее, давайте рассмотрим процедуру оплаты в обычном магазине:
Сначала покупатель проводит картой по считывателю терминала для оплаты своих покупок. Данные кредитной карты поступают в терминал, откуда отправляются в POS-систему. Далее, POS-система связывается с PSP (Payment Service Provider), который, в зависимости от типа кредитной карты, обращается в банк для прохождения процедуры авторизации транзакции. Как раз в этот момент покупателю предлагается ввести PIN-код для подтверждения транзакции. Если все прошло успешно, код авторизации возвращется из банковской сети в PSP и передается в POS-систему и терминал. Все вышеописанные коммуникации происходят в течении пары секунд.
Исследования и атаки, которые упоминались в начале, в основном направлены на платежные терминалы, на взаимодействие с ними покупателей. Сегодня же будет рассмотрена другая часть – POS-системы, через которые проходят данные о транзакции.
Мы уже несколько раз говорили о различных бизнес-процессах, в чем же они заключаются? Рассмотрим, например, классический сетевой магазин. В магазине есть менеджер, скорее всего, их несколько. Каждое утро менеджеру необходимо открывать магазин, а затем и POS-терминалы. Хочется заметить, что POS-терминалы – это не то же самое, что и платежные терминалы. Первое изображение – это платежный терминал, а второе – POS-терминал.
Во время запуска POS-терминалы синхронизируют время и получают обновленные параметры с сервера магазина, включая цены на товары, информацию об их наличии и другие служебные данные. После этого кассиры могут залогиниться за своими рабочими местами и начать работу. Очевидно, что каждое действие на кассе логируется.
В конце дня менеджеру необходимо повторить процедуру в обратном порядке: сначала закрыть кассы, а после – магазин. После этого действия ни одна транзакция не может быть проведена до открытия магазина. Во время закрытия POS-терминалы отправляют свои логи на сервер. Это и есть те бизнес-процессы, о которых упоминалось выше. Именно их POS-системы позволяют упростить и облегчить.
На рынке POS-систем решений довольно много, и подразделяются они на группы продуктов для малых, средних и крупных организаций.
По большей части, они имеют схожую архитектуру. В этой статье мы подробно рассмотрим решение компании SAP: "SAP Point of Sale". Мы также исследовали продукт компании Oracle – MICROS, в котором нашли похожие уязвимости, закрытые в январе 2018 года (CVE-2018-2636).
О компании SAP можно узнать подробнее на официальном сайте. В двух словах: SAP разрабатывает большие ERP-решения для крупных компаний. POS-системы как продукт появились у SAP в 2005 году, когда она поглотила другую фирму – Triversity Transactionware GM, занимающуюся исключительно POS-решениями.
Архитектура SAP POS
Архитектура этой системы состоит из трех частей: Front Office, Back Office и Head office. К первой относят клиентскую часть, т.е. POS client и Mobile POS Client, являющиеся POS-терминалами, за которыми работают кассиры. Front Office соединен с Back Office, где находятся непосредственно локальный сервер магазина (Xpress Server), база данных (Database) и решение для локального управления POS-системой (Store manager), используя которую, менеджер открывает и закрывает магазин и терминалы.
Говоря о локальном решении, мы имеем в виду конкретный магазин, поскольку SAP POS – это продукт для крупных организаций, и архитектурно он задумывался для сети магазинов с центральным управлением. Иными словами, в этом случае, локальное решение – это POS-система одного из магазинов сети.
Глобальное управление сетью магазина осуществляется из головного офиса, с использованием Store Configurator, который соединен со всеми серверами магазинов.
Общий обзор сделан, теперь давайте рассмотрим, как все это устроено поподробнее. А двигаться будем в следующем порядке:
Head office
Store Configurator представляет собой приложение, которое позволяет настраивать в POS-системах абсолютно все. Нет, не так, АБСОЛЮТНО все, начиная с пользователей и внешнего вида экрана кассира и заканчивая шифрованием и иными настройками безопасности.
Как же все это реализовано? После внесения изменений в Store Configurator администратору необходимо нажать "convert", и на файловой системе в папке "Store Configurator/data/parm/" будут созданы специальные файлы с этими параметрами.
Файлов, как и параметров, много, расширения у них тоже разные. Приведем пример:
- cnummask.cmk – содержит информацию о "маске" номера карты покупателя, т.е. о том, сколько и каких цифр будет на чеке;
- rcptlogo.rcp – здесь данные о логотипе фирмы, который печатается на чеке;
- cashier.clg – содержит информацию о пользователях POS-системы (кассирах, менеджерах и других), включая персональные данные (ФИО, дата рождения, номер телефона) и данные авторизации (логин, хэш пароля);
- layout.ui0 – содержит информацию о внешнем виде POS-терминала, расположении клавиш, фоновом изображении и т.п.
Содержимое файлов – это текстовое представление параметров, указанных в Store Configurator. На изображении ниже – файл rcptlogo.rcp.
Далее, администратору необходимо скопировать эти файлы в папку "/Xpress Server/parm/" каждого сервера магазина. Среди файлов, созданных Store Configurator, есть один "особый". Он называется "newparm.trg", и содержит в себе один лишь символ "Z". Xpress Server (сервер магазина), каждые 30 секунд проверяет папку "/parm/" на наличие этого файла. Если находит его, применяет обновленные параметры из загруженных файлов и удаляет "newparm.trg". Таким образом, этот файл выступает в роли своеобразного триггера обновлений.
Back office
Следующий на очереди — Back Office, а точнее – коммуникации внутри него. Он состоит, как уже было сказано ранее, из Xpress Server, Database и Store Manager. Все эти компоненты могут быть установлены как на одной машине, так и на разных. Store Manager взаимодействует с базой по стандартным портам и в данном случае очень напоминает Store Configurator с ограниченным функционалом и той лишь разницей, что записывает изменения параметров в базу данных напрямую, используя stored-процедуры.
В рамках исследования системы были найдены две забавные процедуры: ssp_insert_backdoor и ssp_delete_backdoor. Основная их цель – создать пользователя с именем "back" и паролем "door" и повышенными привилегиями. Конечно же, сделано это лишь на тот случай, когда все пользователи в POS-системе забудут свои данные авторизации.
Взаимодействие Store Manager и Xpress Server осуществляется по порту 2202, и выглядит более интересным. Изучая функционал Store Manager, мы обнаружили раздел Store Administration, который предоставляет любопытные возможности:
- во-первых, отображаются все подключенные POS-терминалы;
- во-вторых, их можно открывать и закрывать;
- в-третьих, есть функция мониторинга, позволяющая отслеживать все, что отображается на экране кассира (информация о покупках и чеки).
Посмотрев пакеты, которые Store Manager отправляет на порт 2202 Xpress Server-а (куда же без WireShark), мы увидели plaint-text команды. "It`s telnet protocol and the port is used for monitoring and not critical configuration," – узнали мы из документации. Окей, а что если мы попробуем подключиться к этому порту с посторонней машины?
Как оказалось, никакого white list не предусмотрено. По умолчанию, этот порт открыт, и нет никаких рекомендаций по его закрытию в Security Guide. Естественно, ограничить доступ к портам можно сторонними средствами, но мы же смотрим на безопасность POS-системы, верно?
После подключения к Xpress Server на порт 2202 нас встречает приветственное сообщение с версией POS системы. Команда "help" возвращает список доступных функций:
999 *** XPRESS SERVER MOST COMMON COMMAND HELP ***
999 MONXPS [ON|OFF]
999 [SHOWTERM|TERMINAL-STATUS] [ALL|Term#]
999 [MONTERM|MONITOR-TERMINAL] [ALL|XPS|Term#] [START|STOP|ON|OFF]
999 OPEN-TERMINAL [ALL|Term#]
999 OPEN-STORE [TODAY|NumberOfSecsSinceJan1-1970]
999 CLOSE-TERMINAL [ALL|Term#] [FORCE|NO-FORCE|ABORT]
999 TERMINAL-BALANCE [Term#] [BAL|UNBAL]
999 CASHIER-BALANCE [Cashier#] [1|2|3] [ShortOver Amount] [netTenderTotal] <-- 1=BALANCED 2=UNBALANCED 3=PREVIOUS BALANCE NOW OUT OF DATE
999 UPDATE-CASHIER [Cashier#]
999 DELETE-CASHIER [Cashier#]
999 END-OF-DAY [FORCE|NO-FORCE|ABORT]
999 STORE-TOTALS [CLOSE-DAY|CLOSE-WEEK|CLOSE-PERIOD|DONE-END-OF-DAY|...]
999 STORE-TOTALS CONSOL-DAY [RTOT|SRTOT|CTOT|SPROD|...]
999 COMMS-RESET [1|2|3] <-- 1=ALL 2=REMOTE 3=MODEMS
999 FLUSH-PLUCACHE
999 TRIGGER-NEWPROMOS
999 SHUTDOWN
999 . <-- Use to repeat previous command
Из названий этих функций вполне понятно их назначение. Отсутствие какой-либо проверки позволяет анонимно открывать и закрывать POS-терминалы, мониторить все, что происходит на них (например, при покупке в консоль выводится содержимое чека) или просто выключить Xpress Server.
Стало очень интересно, как реализованы эти функции в коде, и все ли команды отображены в выводе "help". Процесс, обрабатывающий приходящие запросы, – xps.exe. Немного реверса, и был найден перечень возможных команд. Их оказалось чуть больше 17… их 74. 74 команды принимает и обрабатывает Xpress Server с порта 2202. Описывать все было бы слишком долго, остановимся на самых интересных.
APM-VALIDATE-PASSWD – позволяет проверить данные авторизации, введенные пользователем. Эта команда возвращает три различных кода: 0 – если логин и пароль введен правильно, 1 — если неправильный пароль, 10 — если пользователя с таким логином не существует. Очевидно, ничто не мешает потенциальному нарушителю, находясь в локальной сети магазина, перебрать все возможные комбинации логинов и паролей (логин может состоять только из цифр) и получить данные для доступа к POS-терминалам.
Но brute-force — это же не очень круто, поэтому существует иная команда, Reset password, которая изменяет пароль пользователя на новый. Все, что нужно знать, – это логин, который может быть получен перебором. И еще одно маленькое уточнение. В этой POS-системе логин может состоять только из цифр, что значительно облегчает гипотетический перебор.
Команды FILE-FIND, FILE-OPEN и FILE-READ позволяют найти, открыть и прочитать данные на файловой системе Xpress Server. Вы же еще помните, что все это происходит без регистрации и смс, анонимно? Любопытно, что параметры команды FILE-OPEN передаются напрямую в C++ функцию fopen(), и если неправильно указать режим, то приложение Xpress Server получает ошибку и завершает свою работу.
Перейдем к последней части обзора.
Front office
POS-client, он же POS-терминал, подключается к серверу по порту 2200. Вся информация, все транзакции и вообще все коммуникации происходят именно по этому порту и только в таком направлении: инициатором является клиент, а сервер просто принимает и отвечает на запросы. Если вспомнить бизнес-процессы, то все происходит следующим образом. В начале дня, когда менеджер открывает POS-терминал, он отправляет пакет на сервер: "Сервер, я терминал номер 5, я открыт, пришли мне новые параметры и давай синхронизируем дату и время". В конце дня, когда менеджер закрывает POS-терминал, он отправляет на сервер свои логи. Ну и, конечно же, после каждой транзакции данные о ней и об изменении количества товаров также отправляются на сервер. Посмотрев трафик между POS-терминалом и Xpress Server, мы обнаружили, что пакеты на получение и загрузку файлов имеют определенную структуру:
Len – длина отправляемого пакета. Where – место, куда записываем данные. What – место, откуда берем данные. End – пара NULL-байт. Type – тип пакета, в зависимости от которого с пакетом будут выполнены те или иные действия. Пакеты могут быть:
Так, например, для того, чтобы получить файл с настройками у сервера, POS-client отправляет пакет типа R на порт 2200:
{R0059}C:\\local_directory\poc.txt,C:\remote_directory\poc.txt,0,0;
В этом пакете:
- R – тип;
- 0059 – длина данных;
- C:\local_directory\poc.txt – куда записывается файл;
- C:\remote_directory\poc.txt – место хранения файла на сервере;
- 0,0 – конец пакета.
В ответе POS-client получает содержимое запрашиваемого файла и записывает его себе в специальную директорию. При попытке продублировать отправляемый POS-client-ом пакет с другой машины в ответе было также получено содержимое файла на сервере. Как мы видим, здесь также нет никаких проверок: порт 2200 Xpress Server принимает и обрабатывает пакеты от любой машины.
Это показалось забавным, но на чтении файлов далеко не уедешь. Давайте попробуем собрать набор пакетов для загрузки своего файла на сервер. Ведь POS-client как-то же записывает логи на сервер, правильно?
Во-первых, отправляем пакет типа S. Поле Where содержит путь на сервере, куда мы будем записывать данные, поле What необязательно, поскольку мы все делаем вручную, но очень важен размер Size, в котором мы указываем размер следующего, второго, пакета. Он будет типа F — FILE_DATA и будет состоять из своего размера и данных (содержимое), которые мы хотим записать на сервер. Ну и третий, последний пакет типа С — конец файла. После этого, Xpress Server записывает файл в указанную директорию и возвращает пакет типа G — GOOD. Любопытно, что если отправить пакет с неправильным полем Size, Xpress Server удалит файл на сервере. Ниже вы можете увидеть видео-POC анонимной записи, чтения и удаления файла:
Таким образом, из-за отсутствия каких-либо проверок, любой человек, который может подключиться к этому порту, может читать, записывать и удалять файлы на сервере.
И что из всего этого можно получить? Давайте посмотрим, чего можно достигнуть, скомбинировав вышеописанные возможности.
Итак, атакующему необходимо иметь доступ в локальную сеть магазина. Обычно получить его не составляет особого труда, т.к. периферийные устройства, включая весы, регулярно стоят в залах, и доступ к ним не ограничен.
Давайте суммируем наши знания о системе:
- Store Configurator создает специальные файлы с параметрами системы, копирует их на Xpress Server, который применяет параметры, когда находит файл "newparm.trg".
- Атакующий может записывать любые данные в любой файл в любой директории на Xpress Server-е используя порт 2200.
- POS-терминалы получают обновленные параметры с Xpress Server и применяют их после открытия.
- Атакующий может анонимно выключать и включать POS-клиенты, используя порт 2202.
Комбинация этих особенностей позволяет изменить любой параметр в SAP POS-системе.
Допустим, атакующий хочет приобрести какой-то товар, скажем, за доллар.
- Атакующий записывает на Xpress Server в папку parm файлы конфигурации, указывая новую цену товара.
- Атакующий записывает на Xpress Server в папку parm триггер-файл "newparm.trg", активируя обновление параметров на сервере.
- Сервер обновляет параметры.
- Часть из них он записывает в базу данных.
- Атакующий отправляет команду закрытия терминалов.
- Xpress server закрывает терминалы, терминалы отправляют свои логи на сервер. Процесс занимает от 10 до 30 секунд.
- Атакующий отправляет команду открытия терминалов.
- Терминалы открываются.
- Терминалы загружают новые параметры с сервера и применяют их.
Вот, собственно, и все. Но чего-то все же не хватает, а именно — возможности удаленного выполнения команд на сервере. А она, в общем-то, есть.
Каждый раз, когда Xpress Server обновляет параметры, т.е. находит триггер-файл "newparm.trg", он ищет и запускает два ".bat" файла: "XPSPARM.BAT" и "StopTN.BAT". А это означает только одно – атакующий может их перезаписать и выполнить скрипт с reverse-shell на себя.
Это будет выглядеть примерно так: атакующий заменяет файл "XPSPARM.BAT" на свой, используя порт 2200; записывает файл "newparm.trg", тем самым вызывая обновление параметров и запуск "*.bat" файла.
Шифрование
Да, в SAP POS применяется шифрование, но по умолчанию, «из коробки», оно отключено. Если шифрование настроено, то все важные данные передаются в виде шифротекста. Стоит уточнить, что шифруются именно данные, а не коммуникации между элементами системы. Например, если мониторить транзакции на терминале с включенным шифрованием, то мы получим в ответе шифротекст только вместо номера кредитной карты, остальные же данные будут переданы в открытом виде.
В этой таблице приведены имена таблиц и поля, которые должны пройти процедуру шифрования. В то же время, есть дополнительная таблица "CryptoRegister", где перечислено то же самое, но с указанием "уровня" шифрования. Так, например, пароли пользователей хранятся в виде хэш-значения и имеют уровень шифрования 4, а номера кредитных карт шифруются 3DES и имеют уровень 3.
SAP POS использует для хранения и генерации ключей инструмент "TWSecurity". При его запуске создается специальный "контейнер", и доступ в него возможен только по паролю, в котором хранится ключ шифрования. Поскольку 3DES – это симметричный алгоритм, ключ должен быть одинаковым на всех элементах системы: Front Office, Back office и Head office. Т.е. после создания контейнера его необходимо экспортировать на все части POS-системы. Доступ к ключу осуществляется только по токену, который прописан в реестре. И все было бы круто, но есть одно "НО".
Ключ (вернее его токен), который используется для шифрования данных, задается в Store Configurator… а это значит, что он конвертируется, как и другие параметры, в специальный файл, и может быть изменен атакующим на пустое значение для отключения шифрования в SAP POS.
"Мы патчили, патчили и наконец-то запатчили!"… или что делать в сложившейся ситуации
На данный момент, описаные в этой статье уязвимости закрыты. Да, не с первого раза, получилось почти со второго. Так, первая SAP Note 2476601 вышла 11 июля 2017 года, имела CVSS 8.1 и носила название "Missing Authentication checks in SAP Point of Sale (POS) Retail Xpress Server". В ней был запатчен доступ к порту 2202 (telnet). Это было сделано добавлением нового параметра "BACKOFFICEIPADDRESS", который по умолчанию имеет значение "localhost". Но, в то же время, не было ни одного упоминания о второй уязвимости на порту 2200, которая прекрасно работала и позволяла злоумышленникам удаленно исполнять команды, давая возможность "обойти" свежий июльский патч, просто изменив этот параметр. Наша команда сообщила об этом недочете SAP Product Security Response Team, которая выпустила целых две SAP Note – 2520064 и 2520232, 18 августа 2017 года. SAP Note 2520232 удаляет две stored procedure: "ssp_insert_backdoor" и "ssp_delete_backdoor". SAP Note 2520064 принес больше изменений. Этот патч добавил 3DES шифрование почти ко всем пакетам, которыми обмениваются различные элементы SAP POS: POS-client, Xpress Server, Store Configurator, Store Manager. Т.е. сейчас, даже имея возможность подключения к открытым портам, не зная ключа, у нас нет возможности повлиять на POS-систему: сервер не понимает приходящие к нему незашифрованные пакеты и просто отбрасывает их.
Это действительно интересное решение, но и здесь не обошлось без казусов. Почти сразу после выхода SAP Note на форумах стало появлятся множество сообщений о том, что не работает Store Manager. Дело в том, что SAP забыл о Store Manager, вернее о том, что этот компонент взаимодействует не только с Xpress Server, но и с базой данных. Когда Store Manager отправляет зашифрованный пакет в Базу данных, она возвращает ошибку в открытом тексте, которую Store Manager не может расшифровать и просто crash-ится. В связи с этим, вышел финальный патч, который исправляет ошибку предыдущего патча. Тем не менее, лучшим решением для защиты от возможных атак на вашу инфрастурктуру являются пусть и не всегда удачные, но регулярные обновления.
True story
А вот и любопытные вести с запада: Forever 21, Калифорнийская компания, "US fashion retailer", которая занимается продажей одежды по всему миру с 1984 (815 магазинов, 57 стран, США, Австралия, Бразилия, Китай, Франция и т.д.), 28 декабря 2017 года подтвердила информацию о том, что часть ее POS-систем была скопроментирована в период с 3 апреля по 18 ноября (!!!). Эксперты утверждают, что злоумышленники имели анонимный доступ в сеть POS-систем и использовали его для установки вредоносных программ с целью сбора информации о кредитных картах покупателей (номер карты, срок ее действия, владелец, код проверки подлинности). Забавно, что шифрование критических данных в этих системах было отключено (да-да, не работало) аккурат в период с 3 апреля по 18 ноября. Видимо, шифрование не является большой проблемой не только в SAP-системах. К сожалению, точной информации о том, какие именно POS-системы были скопрометированы, найти не удалось. Если верить новостям, то 28 июня 2017 года Forever 21 подписала контракт с Toshiba Global Commerce Solutions о поставке своих систем, но к этому моменты текущие системы уже были скомпроментированы.