Специалисты по информационной безопасности зафиксировали новую кампанию группировки Mustang Panda, в рамках которой злоумышленники распространяют вредоносную DLL под видом легитимного продукта SolidPDF Creator. Данный образец представляет собой многоступенчатый бэкдор с продвинутой системой закрепления в системе и многослойной обфускацией полезной нагрузки. Целью атаки являются организации, чьи сотрудники могут открыть фишинговое письмо с вложенным ZIP-архивом.
Описание
Согласно данным анализа образца, начальным вектором инфицирования служит целевой фишинг (spear-phishing). Пользователь получает архив с именем "Письмо Его Превосходительству Президенту", внутри которого находится папка с исполняемым файлом, маскирующимся под документ. Исполняемый файл имеет двойное расширение, а при стандартных настройках Windows скрытие известных расширений делает его похожим на обычное письмо. При запуске этот файл загружает вредоносную библиотеку SolidPDFCreator.dll из той же папки, используя технику подмены библиотек (DLL side-loading). Фактически исполняемый файл легитимен и обычно является частью настоящего SolidPDF Creator, но злоумышленники распространяют его вместе с собственной вредоносной DLL.
Вредоносная DLL имеет экспорт с именем GetSPApp, который вызывается загрузчиком сразу после запуска. Реализованная в этой функции логика выполняет тройное ветвление в зависимости от того, откуда запущена библиотека. Если DLL находится в каталоге C:\ProgramData\IDM\logs, то она считает себя уже установленной и переходит к выполнению зашифрованного шелл-кода. Если же DLL запускается из другого места (например, из папки Загрузки), то она копирует себя и загрузчик в указанный каталог, создаёт вложенную структуру папок, а затем регистрирует задачу в планировщике Windows под названием MediumNetMonIt. Задача настроена на ежедневный запуск с правами системы (NT AUTHORITY\SYSTEM). Таким образом, после первой установки на каждом последующем входе в систему бэкдор автоматически активируется.
Механизм проверки местоположения выполняется дважды подряд. Это сделано для защиты от попыток инъекции в процесс со стороны средств защиты: если между двумя вызовами путь изменится (например, антивирус подменит значение), программа корректно завершится без выполнения вредоносного кода.
После того как DLL оказывается в постоянном каталоге, вызывается функция построения шелл-кода. Шелл-код изначально зашифрован в теле DLL в виде 186 блоков по 187 байт каждый. Алгоритм расшифровки каждого блока включает побайтовое XOR с циклическим ключом длиной 34 символа (маскируется по 32 байтам), а затем четырёхпроходное обращение порядка байтов, которое в итоге сводится к однократному реверсу всего блока. Последний, 187-й блок длиной 34 байта является "хвостом", который при расшифровке ключом даёт все нули - это приём для сокрытия истинного размера полезной нагрузки. Полученный расшифрованный массив размером около 34 килобайт затем копируется в выделенную область памяти, которая с помощью VirtualProtect становится исполняемой (RWX - чтение, запись, исполнение). Управление передаётся на смещение 0xD0 от начала массива через вызов EnumSystemLocalesA - штатной функции Windows, принимающей в качестве аргумента указатель на callback-функцию. Такой обходной манёвр позволяет обойти многие средства мониторинга памяти, так как вызов выглядит легитимным.
Внутри расшифрованного шелл-кода аналитики обнаружили 54 внутренние функции и процедуру разрешения API-имен через хеширование (в частности, хеш 0x72ABEDD7, характерный для ROR-13). Шелл-код выполняет обход PEB (Process Environment Block) для поиска импортируемых функций. После завершения этих подготовительных этапов управление передаётся второй стадии, которая, по оценкам экспертов, может быть C2-беаконом или модулем для загрузки дополнительных компонентов.
С точки зрения MITRE ATT&CK, данный образец использует тактику закрепления через запланированные задачи (T1053) и подмену библиотек (T1574.002). Обфускация данных (T1027) реализована через многослойное XOR-шифрование с реверсом. Обход песочницы (T1497) обеспечивается двойной проверкой пути установки. Выполнение кода в памяти через EnumSystemLocalesA (T1055.001) позволяет скрыть активность от эвристик.
Последствия такой атаки включают полную компрометацию системы: злоумышленник получает контроль с правами системы, может выполнять команды, похищать данные и использовать инфицированный хост как точку входа в корпоративную сеть. При этом вредонос не имеет встроенного механизма удаления, поэтому для очистки требуется вручную удалить файлы из C:\ProgramData\IDM\logs, отменить запланированную задачу MediumNetMonIt и уничтожить именованный объект события uydgcfteionxcfd.
Стоит отметить, что группировка Mustang Panda уже не первый год использует подобные цепочки атак с подделкой легитимных продуктов и многоэтапной обфускацией. Применение двойного расширения в имени файла и подмена библиотек остаются излюбленными приёмами этой группы. Для защиты организаций рекомендуется блокировать создание новых задач планировщика с нехарактерными именами, а также отслеживать появление файлов в папке IDM внутри ProgramData, так как это расположение не является стандартным для настоящего Internet Download Manager.
Индикаторы компрометации
MD5
- 8cb0c9f7871834ee23e9d55a0fe7c0e6
SHA1
- 2643a8e6a37f839e0cfedda3de836365948fb760
SHA256
- 6c8784885506b0fa3b0543be3c5caec1a4b3c689331d1012847505c61440b2be
YARA
| 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 | rule SolidPDFCreator_MustangPanda_Backdoor_DLL_2026 { meta: author = "0day in {REA_TEAM}" family = "SolidPDFCreator backdoor (Mustang Panda, Target India 2026 Campaign 3)" description = "Detects the SolidPDFCreator.dll stage-1 backdoor by its 186-chunk XOR decoder pattern" sha256 = "6c8784885506b0fa3b0543be3c5caec1a4b3c689331d1012847505c61440b2be" severity = "high" strings: // 1) hardcoded install path literal (only present in this sample) $s_install_path = "C:\\ProgramData\\IDM\\logs" ascii wide nocase // 2) single-instance event name $s_event_name = "uydgcfteionxcfd" ascii wide // 3) scheduled task name $s_task_name = "MediumNetMonIt" ascii wide // 4) daily trigger id $s_trigger_id = "DailyTriggerId" ascii wide // 5) the unique 34-byte XOR key (compact fingerprint) $s_xor_key = { 79 72 74 79 21 40 23 31 32 33 24 30 39 2a 67 64 74 25 64 67 74 24 38 37 34 54 79 64 67 68 73 62 79 72 } condition: // PE32 DLL uint16(0) == 0x5A4D and uint32(0x3C) == 0x4550 and filesize < 1MB and ( any of ($s_*) or $s_xor_key ) } |