Перейти к содержимому

Terminalfix: как фальшивая Captcha извлекает Exe и Dll из Png через powershell

TerminalFix и поддельная Cloudflare CAPTCHA: как PowerShell извлекает EXE и DLL из PNG

Сценарии с фальшивой Cloudflare CAPTCHA давно перестали быть экзотикой. Пользователю показывают привычное окно проверки, а затем предлагают выполнить несколько действий: открыть PowerShell, вставить команду или запустить файл. На этом этапе заражение происходит не из-за сложной уязвимости, а вследствие социальной инженерии.

Кампания TerminalFix использует именно такой подход. Жертве предлагают самостоятельно выполнить инструкции, после чего на компьютер попадает PowerShell-загрузчик. Его задача - получить несколько PNG-файлов, извлечь из них бинарные данные и запустить скрытые компоненты.

Загрузчик под видом обычного BIN-файла

Анализ начинается с файла с расширением `.bin`. Само по себе оно выглядит подозрительно, однако внутри находится обычный PowerShell-код. В скрипте нет примитивной связки из `IEX` и `FromBase64String`, которую часто используют начинающие авторы вредоносных загрузчиков.

Вместо этого применяется более интересная техника: PowerShell скачивает изображения PNG, открывает их через `System.Drawing`, перебирает пиксели и превращает полученные значения в массив байтов. В результате картинка становится контейнером для исполняемого файла.

В скрипте фигурируют два домена, один из которых имеет характерное название `bestsocialmedianewspapper.com`. Подобные домены нередко регистрируют специально под конкретную кампанию, а затем используют для раздачи полезной нагрузки и передачи команд.

Также загрузчик заранее определяет три ресурса с PNG-файлами. Их имена выглядят как случайные последовательности символов и не содержат очевидных признаков вредоносной активности.

Как PNG превращается в бинарный файл

За извлечение данных отвечает отдельная функция. Сначала скрипт подключает библиотеку:

```powershell
Add-Type -AssemblyName System.Drawing
```

Затем файл открывается как изображение. Для каждого пикселя извлекаются четыре значения - красный, зелёный, синий и альфа-канал. Эти байты последовательно записываются в `MemoryStream`.

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

После обработки всей картинки формируется массив. Первые восемь байт интерпретируются как число типа `Int64`. В них хранится длина полезной нагрузки. Затем скрипт проверяет, что указанный размер не выходит за границы полученного массива, и извлекает необходимый фрагмент.

Упрощённо алгоритм выглядит так:

1. скачать PNG;
2. открыть изображение;
3. пройти по всем пикселям;
4. собрать значения каналов в поток;
5. прочитать первые восемь байт как размер;
6. взять указанное количество байтов;
7. сохранить результат на диск.

Это не шифрование и не сложная упаковка. Скорее, простая стеганографическая маскировка, рассчитанная на то, что защитные средства и аналитики будут воспринимать файл как обычную картинку.

Первый этап: EXE под видом компонента Windows

Для хранения извлечённых файлов выбирается стандартная директория Windows. Внутри неё создаётся отдельная папка с названием, имитирующим системный компонент. Такой выбор помогает вредоносной программе затеряться среди легитимных файлов.

Первый PNG сохраняется как:

```text
LockScreenContentServer.exe
```

Название напоминает штатную службу, связанную с экраном блокировки Windows. Однако никакого отношения к настоящим системным компонентам этот файл не имеет. Это лишь попытка визуально замаскировать исполняемый модуль.

Интересно и другое имя, встречающееся в логике загрузчика, - `KeyAuthService`. Оно звучит как служба, работающая с ключами авторизации, но фактически никакого Windows Service скрипт не создаёт. Вместо этого применяется более привычный механизм автозапуска через:

```text
HKCUSoftwareMicrosoftWindowsCurrentVersionRun
```

Такой приём не требует административных прав и позволяет запускать программу при входе конкретного пользователя.

DLL собирается из двух частей

Второй и третий PNG используются иначе. После извлечения они превращаются в два файла, которые затем считываются и объединяются. По сути, библиотека разделена на две части, каждая из которых хранится в отдельном изображении.

После скачивания загрузчик читает оба фрагмента, объединяет их в правильном порядке и сохраняет итоговую DLL. Разделение полезной нагрузки затрудняет автоматический анализ: отдельные файлы могут не иметь корректной сигнатуры PE и не будут распознаны как библиотека.

Такой подход также позволяет менять одну часть цепочки, не перестраивая весь набор файлов. Например, оператор может заменить основной модуль, оставив без изменений вспомогательную составляющую.

Временные файлы удаляются

После извлечения и сохранения содержимого исходные PNG могут удаляться. Это снижает количество артефактов на диске и осложняет последующее расследование.

Такая очистка не делает атаку бесследной: остаются записи в журналах PowerShell, DNS-запросы, обращения к удалённым адресам, ключи автозапуска и следы запуска процессов. Однако отсутствие исходных изображений действительно уменьшает объём доступных материалов для анализа.

Зачем используются два домена

Разделение инфраструктуры по нескольким доменам - распространённая практика. Один адрес может использоваться для загрузки PNG, второй - для получения дополнительных команд или передачи результатов.

Это помогает операторам быстрее менять отдельные части инфраструктуры. Если домен с изображениями заблокирован, его можно заменить, не меняя логику загрузчика целиком. Кроме того, разные домены позволяют разделить доставку компонентов и командное управление.

POST-запросы и передача сведений

Особого внимания заслуживают HTTP-запросы методом `POST`. Вредоносное ПО может применять их для отправки идентификатора заражённого компьютера, сведений о системе, имени пользователя, версии Windows и результатов выполнения команд.

В отличие от обычного `GET`, содержимое `POST` не видно непосредственно в URL. Это не делает передачу невидимой, но усложняет поверхностный анализ сетевого трафика. Для полноценного расследования необходимо изучать тело запросов, заголовки и последовательность обращений.

Маскировка каталога и запуск

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

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

Сам запуск также стараются сделать менее заметным. Вредоносный процесс может выполняться без видимого окна PowerShell, через скрытый режим или посредством загрузки DLL в память. Это уменьшает вероятность того, что пользователь заметит консольное окно.

Логи как источник информации

Наличие журналирования не всегда означает, что автор вредоносной программы заботится о диагностике. Лог может использоваться для контроля этапов заражения: загрузился ли первый файл, удалось ли собрать DLL, сработал ли механизм автозапуска.

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

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

Что искать при анализе

При расследовании подобных инцидентов стоит проверить несколько групп признаков:

- запуск PowerShell после посещения подозрительной страницы;
- команды, загружающие файлы с расширением `.png`;
- использование `System.Drawing` и перебор пикселей;
- чтение первых восьми байт изображения как размера данных;
- появление каталогов и файлов с системоподобными названиями;
- новые записи в `HKCUSoftwareMicrosoftWindowsCurrentVersionRun`;
- обращения к подозрительным доменам;
- POST-запросы с неизвестным содержимым;
- запуск EXE или DLL из недавно созданной пользовательской папки;
- удаление PNG вскоре после загрузки.

Отдельно следует проверить журналы PowerShell Script Block Logging, Sysmon, историю создания процессов и сетевые события. Если используется Microsoft Defender или аналогичная EDR-система, полезно сопоставить дерево процессов: браузер → PowerShell → создание файла → запуск исполняемого модуля.

Как защититься

Главное правило - не выполнять команды, которые неизвестный сайт предлагает вставить в PowerShell или командную строку. Настоящая CAPTCHA не требует запускать скрипты, скачивать файлы или открывать системные утилиты.

Организациям стоит ограничить запуск PowerShell для обычных пользователей, включить журналирование скриптов, контролировать изменения в пользовательских ветках автозапуска и блокировать подозрительные сетевые соединения. Полезно также настроить EDR-правила для случаев, когда PowerShell загружает изображения, а затем создаёт исполняемые файлы.

Итог

TerminalFix не предлагает принципиально новую технику, но удачно комбинирует несколько проверенных приёмов: фальшивую CAPTCHA, ручной запуск PowerShell, маскировку бинарных файлов под PNG, разделение DLL на части, системоподобные имена и автозапуск через реестр.

Главная особенность цепочки - использование изображений не как приманки, а как контейнера для исполняемого содержимого. Сам механизм извлечения довольно простой, однако в связке с социальной инженерией он способен обмануть пользователя и осложнить автоматическое обнаружение. Поэтому защита от таких атак начинается не только с антивируса, но и с запрета на выполнение непонятных команд, которые сайт предлагает вставить "для проверки".

Прокрутить вверх