
Система доставки полезной нагрузки, которая внедряет полезную нагрузку в файл значка исполняемого файла!

Blenny — это инструмент обфускации полезной нагрузки уровня proof-of-concept для Windows, который скрывает данные исполняемой полезной нагрузки внутри значка исполняемого файла. Он назван в честь саблезубой собачки, которая подражает поведению и внешнему виду рыбы-чистильщика, чтобы охотиться на ничего не подозревающих рыб.
Я уже не вспомню точно, как развивалась эта история, но хакер по имени retr0id (@DavidBuchanan314) предложил идею прятать полезную нагрузку внутри значка исполняемого файла. Из-за различных особенностей PNG-файлов — а также потому, что файлы значков Windows могут содержать внутри данные PNG — я понял, что смогу реализовать эту идею довольно легко, просто потребуется немного усилий. Именно для этого я создал библиотеку Facade — библиотеку, предназначенную специально для генерации полезных нагрузок в PNG-файлах.
Конечный результат — это компактный файл полезной нагрузки и система сборки, которые можно использовать для настройки базовой полезной нагрузки дроппера/исполнителя для Windows.
Blenny использует библиотеку Facade для создания полезных нагрузок из файлов значков, поэтому при получении репозитория необходимо инициализировать подмодуль (и его подмодули):
$ git clone https://github.com/frank2/blenny.git
$ cd blenny
$ git submodule update --init --recursive
Этого должно быть достаточно для инициализации репозитория перед сборкой.
Этот проект буквально создавался с расчётом на CMake, поэтому перед сборкой этого проекта абсолютно необходимо установить CMake. Скорее всего, без него ничего не заработает (если только вы действительно не настроены вручную задавать все определения CMake самостоятельно). Также вам понадобится копия Visual Studio для компиляции проекта.
Этот проект использует множество переменных CMake для настройки процесса сборки. Чтобы получить базовую демонстрационную полезную нагрузку, в результате которой на вашем рабочем столе появится милый друг-овечка, выполните следующее в главном каталоге проекта:
$ mkdir build
$ cd build
$ cmake -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
$ ./Release/blenny.exe
По умолчанию этот процесс извлекает исполняемый файл с именем «blenny.exe» из значка исполняемого файла во временный каталог текущего пользователя, а затем запускает его. Полезная нагрузка по умолчанию — это DesktopPet от @AdrianoTiger, специальная пересборка классического esheep.exe из 90-х.
Все переменные, которые обеспечивают это, настраиваются! Должна быть задана одна переменная полезной нагрузки (BLENNY_TRAILING_PAYLOAD, BLENNY_TEXT_PAYLOAD, BLENNY_ZTEXT_PAYLOAD или BLENNY_STEGO_PAYLOAD). Она управляет тем, как полезная нагрузка в конечном итоге помещается в значок. Подробнее об этих методах см. в библиотеке Facade. Например, чтобы использовать собственную полезную нагрузку, сделайте следующее:
$ cmake -D BLENNY_PAYLOAD_FILE="path/to/your/payload.exe" -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
Вот таблица всех различных параметров конфигурации, которые можно задать, их значения по умолчанию и назначение.
| Флаг | Тип | Значение по умолчанию | Назначение |
|---|
| BLENNY_PAYLOAD_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaultpayload.exe" | Полезная нагрузка для встраивания в файл значка. Примечание: поскольку итоговый метод запуска — ShellExecuteA, это может быть любой файл, который можно запустить из Проводника, например пакетный сценарий! |
| BLENNY_ICON_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaulticon.ico" | Значок для исполняемого файла, в который также встраивается полезная нагрузка. Примечание: подойдут не все значки! В файле значка должен присутствовать раздел PNG. Проверьте данные целевого значка в шестнадцатеричном редакторе, чтобы убедиться, что изображение PNG включено! |
| BLENNY_TRAILING_PAYLOAD | Boolean | OFF | Включить полезную нагрузку в виде завершающих данных в PNG-файле значка. |
| BLENNY_TEXT_PAYLOAD | Boolean | OFF | Включить полезную нагрузку в разделе tEXt в PNG-файле значка. |
| BLENNY_ZTEXT_PAYLOAD | Boolean | OFF | Включить полезную нагрузку в разделе zTXt в PNG-файле значка; это сжатая полезная нагрузка tEXt. |
| BLENNY_STEGO_PAYLOAD | Boolean | OFF | Включить стеганографическую полезную нагрузку в PNG-файле значка. Примечание: из-за того, что размер изображения большинства значков ограничен 256x256, не все полезные нагрузки поместятся в этом варианте! |
| BLENNY_PAYLOAD_KEYWORD | String | "blenny" | Для полезных нагрузок text/ztext задаёт ключевое слово, помечающее данные полезной нагрузки. |
| BLENNY_ADMIN | Boolean | OFF | Включает ключевое слово runas для запуска полезной нагрузки от имени администратора. |
| BLENNY_PATH | String | "%TEMP%" | Путь для сохранения полезной нагрузки перед запуском. Переменные среды раскрываются во время выполнения. |
| BLENNY_FILENAME | String | "blenny" | Имя файла, присваиваемое полезной нагрузке при извлечении. |
| BLENNY_RANDOM_FILENAME | Boolean | OFF | Включить генерацию случайного имени файла для полезной нагрузки при извлечении. |
| BLENNY_RANDOM_FILENAME_LENGTH | Integer | 8 | Настраивает длину случайного имени файла. |
| BLENNY_RANDOM_FILENAME_RANDOM_LENGTH | Boolean | OFF | Задаёт случайную длину имени файла при извлечении. |
| BLENNY_PAYLOAD_ARGS | String | "" | Аргументы, передаваемые файлу полезной нагрузки при запуске. |
| BLENNY_FILE_ATTRIBUTES | Integer | 0x80 (aka FILE_ATTRIBUTE_NORMAL) | Атрибуты файла, присваиваемые файлу при создании. |
| BLENNY_CMD_SHOW | Integer | 5 (aka SW_SHOW) | Визуальное состояние файла полезной нагрузки при запуске. Другой пример — SW_HIDE, равный 0. |