📌 Консольная самодостаточная утилита для создания архивной exe файловой бомбы с внедренным шеллкодом

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Автор merdock
Статья написана для
Конкурса статей #10


header.jpg



📌 Консольная самодостаточная утилита для создания архивной exe файловой бомбы с внедрённым шеллкодом

С чего все началось

Пару лет назад меня наняли поработать в одном проекте и как то понадобилось раздувать бинарные exe файлы 700 мегабайт и больше, так чтобы при сжатии размер был близким к оригинальному файлу, это позволяло обходить антивирусы и другие проверяющие системы. Самая важная изюминка была в том что данные которыми наполняется раздуваемый блок должен быть не однообразный. И вот я решил для конкурса и для форумчан выложить исходники и бинарники(для тех кому не хочется компилировать) автономной утилиты с реализованной и доработанной идеей. Утилита позволяет создавать большой файл bmp(bitmap) или файл с данными dat для использования в своих целях, так же утилита позволяет в внедрять файл бомбу в exe/dll в секцию или в ресурсы. Это надо чтобы системы которые будут проверять архив не смогли распаковать или проверить файл, потому что у них ограниченные ресурсы, так как проверять надо много, а ресурсов всегда мало. Немного истории: zip-бомба, также известная как файловая бомба, впервые была официально использована в 1996 году в сети Фидонет в виде архива, а ноды обрабатывали все данные путем получения архивов, их распаковки, парсинга и добавления в нужные папки(в те времена базы данных почти не было, роскошь - аж смешно), в итоге когда такой файл попал на ноду не хватило ресурсов и она упала. Данный вид атаки был очень популярен, так как от него не было защиты - просто заканчивалась память или переполнялась файловая система которая не могла сохранить такой объем за раз. Наткнулся на одну современную реализацию zip бомбы https://habr.com/ru/articles/459254/ в ней человек проводит опыты по созданию архивов 281 TB!, 4.5 PB! большинство частных серверов просто здохнут под такими файлами. Но подобное варварство на текущий момент используется редко, так как большинство защитных систем уже научилось контролировать объемы памяти. В нашем же случае мы не варвары, мы прагматики и используем более тонкую вариацию для проталкивания нашей нагрузки через слабенькие автономные защитные системы. Мы будем легетимно заталкивать нагрузку в ресурсы RT_RCDATA или RT_BITMAP. Так же есть возможность внедрить в файл бомбу криптованный внешний файл - шеллкод(двоичный исполняемый код). Для наглядности я создал примеры использования утилиты с исходниками на c++ которые показывают как извлекать и запускать шеллкод из секций или ресурсов. Утилита консольная чтобы можно использовать ее со сторонними приложениями, исходный код предоставляю для тех кто хочет изменить под себя или применить функционал в своем проекте. Утилите не нужны сторонние библиотеки или другие приложения, полностью самодостаточная, размер минимален, сама утилита компилируется на архитектуры x86/x64, работает со всеми PE(Portable Executable) exe/dll и на все архитектуры x86/x64, проект создан и скомпилирован на VS(visual studio). Данная утилита не является криптером, она может является автономным дополнением к вашему криптеру или другому софту, помогает увеличить вариативность выхода из под детекта и других проверок!

Немного мат части

Давайте рассмотрим методы куда можно засунуть большой объем данных в PE(exe/dll) файлах. Для начало посмотрим на структуру PE:
structure_pe1.jpg

structure_pe2.jpg



Данная структура схематично описывает внутренности pe файла, если коротко то у нас идет структура заголовок(Headers), структура секций(Section) и сами данные (Data). Детально описывать все структуры не буду дабы не вгонять в уныние, но любой писатель Зла обязательно наткнутся на них в своей жизни, т.к. чаще всего есть необходимость в них что то изменить, криптеры их наизусть знают, т.к. без этих знаний создать криптер невозможно. Я выбрал наиболее доступных два варианта внедрения: это секция ресурсов (обычное ее название .rsrc) и создание новой секции. Секции бинарного исполняемого кода и секции хранения данных трогать не будем, т.к. любое надругательство над ними вызывает детект антивируса. Аннотация: по факту названия секций не играет роли, т.к. для каждой секции ставятся атрибуты которые и определяют ее предназначение, НО есть исключения для секции ресурсов, ее имя всегда должно быть ".rsrc". Для изменения секций нужно вмешиваться в PE структуру, не буду вдаваться в тонкости всех структур, методики добавления и изменения секций описаны и исходники с описанием легко найти, хорошая статья по PE структуре https://habr.com/ru/articles/266831/ Много лет назад поискав на просторе интернета я подобрал и рефакторил функцию добавления секции addsection, полностью описывать изменение PE структуры не буду(уже не помню, давно делал и там целые книги можно по ней писать) она представлена в исходнике. Самая большая проблема была это найти библиотеку для работы с секцией ресурсов, обычно мне хватало для работы нашей любимой утилиты ResHacker, но захотелось автономности. В итоге я нашел один проект которому 8 лет и он еще поддерживает PE x86/x64, что очень важно portable-executable-resource-editor. В данный проекте я модифицировал, так как там была ошибка чтения ресурсов, если найдете еще какую багу и исправите ее напишите мне. Эта библиотека позволяет добавлять ресурсы (в большинстве подобных библиотек как оказалось этой функции нет), менять, удалять, экспортировать и импортировать любые ресурсы. И вот у нас есть исходники двух инструментов - добавление секции и добавления ресурса с поддержкой х86/х64.Далее написал генератор рандомных данных с возможность сжатия(пример расслоения рандомных данных можно увидеть на скринах ниже), преобразования файла в картинку и внедрения шеллкода. Т.к. это все уже было сделано несколько лет назад, осталось все скомпоновал, оттестировал.

Статистика
Для наглядного примера была выбрана генерация картинки, шеллкод x64 с запуском калькулятора, и внедрением картинки в ресурсы.

Сгенерированная картинка bmp на 100Mb
stat_bmp100.jpg



Сгенерированная картинка bmp на 5Mb
stat_bmp5.jpg



Тестовый оригинал
stat_ori.jpg



Свойства файлов с внедренными данными
stat_gen.jpg



Общий размер по архивам zip, rar, 7zip
stat_zip.jpg

stat_rar.jpg

stat_7zip.jpg



Скрин запуска измененного example3_x64.exe, в него добавлена картинка 800Мб с шифрованным шеллкодом shell_x64.bin
stat_run.jpg



Как вы видите, размеры укладываются в заданные параметры, ресурс в exe файле создан как предполагалось, запускается нормально, без нарушений работоспособности.

Описание параметров
Использовать: bomb.exe <имя создаваемого файла бомбы> [параметры]
Параметры:
size - полный размер файл бомбы, указывается мегабайтах, по умолчанию 700Мб
pack - примерный не пакуемый размер который хотим видеть после сжатия, по умолчанию 2Мб
mode - метод генерации файла бомбы, параметр может быть 0,1,2 (с параметром 2 не сжимается зипом), по умолчанию 0
ext - формат файла, картинка bmp или бинарный файл dat, по умолчанию dat
pefile - указываем exe/dll файл в который внедряем данные, по умолчанию не внедряет
pestor - указываем куда в файле pefile внедрять данные, в секцию sec или ресурсы res, по умолчанию sec
shellcode - указываем имя файла с шеллкодом, по умолчанию не использует внедрение шеллкода
cryptkey - ключ xor - шифрования шеллкода, по умолчанию qwerty
h - вывод описания утилиты

Примеры использования
Для тестов добавлены скомпилированные шеллкоды shell_x64.bin и shell_x86.bin, при запуске они запускают калькулятор. Саму генерацию шеллкода в с++ добавлять не стал, так как это на еще одну большую статью с мат частью и пояснениями, что в данный контекст не укладывается.
Добавлен архив с backup.zip, в нем все те же бинарники для тестов, так как при запуске батника утилита перезаписывает exe файл.

Пример 0
example0_bmp.bat - батник генерирует файл-картинку "_tmp.bmp" размером 800Мб и 1-2Мб при сжатии
bomb.exe _tmp.bmp -size=800 -pack=1 -ext=bmp

example0_dat.bat - батник генерирует бинарный файл "_tmp.dat" размером 800Мб и 1-2Мб при сжатии
bomb.exe _tmp.dat -size=800 -pack=1 -ext=dat
Нажмите, чтобы раскрыть...

Пример 1
example1 - vs с++ проект с примером запуска шеллкода из ресурсов
Данный пример генерирует бинарный файл "_tmp.dat" размером 800Мб с внедрением в него шифрованного шеллкода,1-2Мб при сжатии, с внедрением в exe в виде data ресурса (смотрим структуру ресурсов pe файла)
example1_x86.bat - для exe файла x86 с соответствующим шеллкодом
bomb.exe _tmp.dat -size=800 -pack=1 -ext=dat -pestor=res -shellcode=shell_x86.bin -pefile=example1_x86.exe
example1_x64.bat - для exe файла x64 с соответствующим шеллкодом
bomb.exe _tmp.dat -size=800 -pack=1 -ext=dat -pestor=res -shellcode=shell_x64.bin -pefile=example1_x64.exe
Нажмите, чтобы раскрыть...

Пример 2
example2 - vs с++ проект с примером запуска шеллкода из секции
Данный пример генерирует бинарный файл "_tmp.dat" размером 800Мб с внедрением в него шифрованного шеллкода,1-2Мб при сжатии, с внедрением в exe в виде data в новую секцию (смотрим структуру pe файла)
example2_x86.bat - для exe файла x86 с соответствующим шеллкодом
bomb.exe _tmp.dat -size=800 -pack=1 -ext=dat -pestor=sec -shellcode=shell_x86.bin -pefile=example2_x86.exe
example2_x64.bat - для exe файла x64 с соответствующим шеллкодом
bomb.exe _tmp.dat -size=800 -pack=1 -ext=dat -pestor=sec -shellcode=shell_x64.bin -pefile=example2_x64.exe
Нажмите, чтобы раскрыть...

Пример 3
example3 - vs с++ проект с примером запуска шеллкода из ресурсов
Данный пример генерирует бинарный файл "_tmp.dat" размером 800Мб с внедрением в него шифрованного шеллкода,1-2Мб при сжатии, с внедрением в exe в виде bitmap ресурса (смотрим структуру ресурсов pe файла)
example3_x86.bat - для exe файла x86 с соответствующим шеллкодом
bomb.exe _tmp.bmp -size=800 -pack=1 -ext=bmp -pestor=res -shellcode=shell_x86.bin -pefile=example3_x86.exe
example3_x64.bat - для exe файла x64 с соответствующим шеллкодом
bomb.exe _tmp.bmp -size=800 -pack=1 -ext=bmp -pestor=res -shellcode=shell_x64.bin -pefile=example3_x64.exe
Нажмите, чтобы раскрыть...

Исходники и бинарные файлы можно Скачать

View hidden content is available for registered users!
 
Сверху Снизу