Исследователи кибербезопасности обнаружили широкомасштабную кампанию, получившую название Operation PCPcat. В рамках этой кампании злоумышленники целенаправленно крадут конфиденциальные данные из развертываний Next.js. Используя активные исследования через сеть ловушек (honeypot), специалистам удалось получить доступ к API центра управления (Command and Control, C2) злоумышленников. В результате были раскрыты тревожные операционные показатели: подтверждено 59 128 скомпрометированных серверов при успешности атак в 64,6%. Данная кампания наглядно демонстрирует, как сегодня выглядит промышленный масштаб хищения учетных данных, и показывает пути для его обнаружения.
Описание
Кампания PCPcat была выявлена при мониторинге Docker-ловушки. Атака основана на эксплуатации уязвимостей в Next.js/React и сочетает несколько опасных техник. Во-первых, для удаленного выполнения кода (Remote Code Execution, RCE) используются уязвимости CVE-2025-29927 и CVE-2025-66478. Во-вторых, происходит систематическое извлечение учетных данных и другой чувствительной информации. В-третьих, на скомпрометированных системах устанавливается инфраструктура C2 для обеспечения устойчивости (persistence) и туннелирования трафика. Управление всей сетью осуществляется через API-ориентированный центр управления.
Наиболее критичным открытием стала информация, полученная в результате прямой разведки активного C2-сервера. Статистика подтвердила, что менее чем за 48 часов кампания успешно скомпрометировала 59 128 серверов. Высокий процент успеха в 64,6% указывает на эффективность используемых эксплойтов и масштабность сканирования. Вся операция демонстрирует признаки крупномасштабной разведывательной кампании по извлечению данных в промышленных объемах.
Атака начинается с массового сканирования публично доступных доменов Next.js. Вредоносная программа react.py использует сложную цепочку команд для идентификации и эксплуатации уязвимостей. После первоначальной проверки уязвимости с помощью команды "id" происходит эксплуатация CVE-2025-29927 и CVE-2025-66478. Эти специфичные для Next.js уязвимости позволяют выполнить команду через манипуляцию JSON-полезной нагрузкой с прототипным загрязнением (prototype pollution) и инъекцию команд в "child_process.execSync()". Результаты затем извлекаются через перенаправление HTTP-заголовков.
После подтверждения уязвимости вредоносная программа приступает к систематическому поиску и извлечению чувствительных данных. В приоритете находятся файлы окружения, такие как ".env", ".env.local", ".env.production" и ".env.development". Также извлекаются системные переменные окружения, SSH-ключи из "~/.ssh/", облачные учетные данные из "~/.aws/credentials" и "~/.docker/config.json", учетные данные Git и история команд bash. В некоторых случаях программа пытается получить доступ к критическим системным файлам, таким как "/etc/shadow" и "/etc/passwd".
Для обеспечения долгосрочного доступа кампания PCPcat устанавливает на скомпрометированные системы полноценную инфраструктуру C2. С помощью команды загрузки и выполнения скрипта "proxy.sh" устанавливаются несколько компонентов. Во-первых, это GOST v2.12.0, SOCKS5-прокси на localhost:1080, используемый для туннелирования злонамеренного трафика. Во-вторых, FRP (Fast Reverse Proxy) v0.52.3, который создает исходящее соединение с C2 для обратного туннелирования и доступа к локальным сервисам. В-третьих, сканер React, который в бесконечном цикле запрашивает у C2 новые цели для атаки, поддерживая активность скомпрометированной машины в ботнете. Для обеспечения устойчивости создаются службы systemd с авто-перезапуском, что позволяет вредоносному ПО сохраняться после перезагрузки системы.
Инфраструктура управления кампанией базируется на сервере с IP-адресом 67.217.57[.]240, географически расположенном в Сингапуре. Сервер использует несколько портов для разных функций: порт 666 для раздачи полезных нагрузок, порт 888 для сервера FRP и порт 5656 для основного API C2. Программный отпечаток сервера указывает на использование Python 3.12.3.
API центра управления, доступный по адресу "http://67.217.57[.]240:5656", отличается простотой и отсутствием какой-либо аутентификации, что упрощает его анализ. Ключевые конечные точки включают в себя "GET /domains?client=<ID>", которая выдает сканирующим узлам пакеты по 2000 IP-адресов для атаки. Конечная точка "POST /result" принимает похищенные данные в формате JSON без какой-либо валидации, всегда отвечая статусом 200 OK. Наиболее информативной оказалась конечная точка "GET /stats", которая в реальном времени раскрывает операционную статистику кампании, включая общее количество сканирований и успешных компрометаций. Простая проверка работоспособности доступна через "GET /health".
Полный конвейер извлечения данных работает по четкому алгоритму. Сканирующий узел запрашивает цели через API. Для каждого IP-адреса в пакете он пытается эксплуатировать уязвимость CVE-2025-29927. Если RCE подтверждается, происходит извлечение файлов ".env", системных переменных, SSH-ключей, учетных данных AWS, Docker, Git и истории команд. Все данные упаковываются и отправляются на C2 через "POST /result". При наличии доступа на сервере развертывается постоянная инфраструктура C2 для туннелирования и устойчивости.
В ловушке также был зафиксирован вектор атаки через уязвимый Docker API. Злоумышленники пытались создать контейнер с образом Alpine Linux, который при запуске автоматически загружал и выполнял скрипт "proxy.sh". Это превращало контейнер в новый узел ботнета, открывая возможности для перемещения по сети (pivoting).
Кампания PCPcat служит тревожным напоминанием о критической важности своевременного обновления зависимостей, особенно в таких популярных фреймворках, как Next.js. Организациям, использующим подобные технологии, необходимо усилить мониторинг необычной сетевой активности, неавторизованных процессов и попыток доступа к файлам с учетными данными. Обнародованные индикаторы компрометации (Indicators of Compromise, IoCs), включая IP-адреса C2, сигнатуры файлов и сетевые правила для систем обнаружения вторжений (IDS), позволяют начать активный поиск угроз в собственных инфраструктурах.
Индикаторы компрометации
IPv4 Port Combinations
- 67.217.57.240:5656
- 67.217.57.240:666
- 67.217.57.240:888
URLs
- http://67.217.57.240:5656/domains
- http://67.217.57.240:5656/health
- http://67.217.57.240:5656/result
- http://67.217.57.240:5656/stats
- http://67.217.57.240:666/files/proxy.sh
- http://67.217.57.240:666/files/react.py
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | rule PCPcat_react_py { meta: description = "PCPcat React.py scanner" author = "Threat Intel" date = "2025-12-14" strings: $s1 = "CVE-2025-29927" nocase $s2 = "PCPcat" nocase $s3 = "67.217.57.240:5656" nocase $s4 = "deploy_pcpcat" $s5 = "extract .env" condition: (2 of them) } |
| 1 2 3 4 5 6 7 8 9 10 11 | rule PCPcat_proxy_sh { meta: description = "PCPcat proxy.sh installer" strings: $s1 = "pcpcat-gost.service" $s2 = "pcpcat-frp.service" $s3 = "67.217.57.240:888" $s4 = "FRP_VERSION" condition: 3 of them } |
| 1 2 3 4 5 6 7 8 9 10 11 | rule PCPcat_API_Signature { meta: description = "PCPcat C2 API communication pattern" strings: $s1 = "/domains?client=" nocase $s2 = "/result" nocase $s3 = "\"env\":" nocase $s4 = "67.217.57.240:5656" condition: all of them } |