- Главная
- Блог
- Информационная безопасность
- Утилита Shellter: Подготовка и настройка shelltera вручную. Сравнение ручного и auto режима по тестам
Утилита Shellter: Подготовка и настройка shelltera вручную. Сравнение ручного и auto режима по тестам
В предыдущей статье были кратко рассмотрены принципы, по которым работают современные антивирусы и показана работа утилиты shellter в автоматическом режиме. Результаты работы утилиты оказались интересными, но малоприменимыми в практическом тестировании на проникновение. Очевидно, требуется внести изменения. Зная принципы работы антивирусов (анализ поведения, сигнатуру и прочую теорию мы разобрали в прошлой статье), попробуем улучшить результат работы shellter.
Подготовка для настройки shellter вручную
Для начала генерируем нагрузку самостоятельно с помощью известной msfvenom. Генерируем такую же по функционалу нагрузку, reverse-shell. Как и в режиме auto, открываем соединение на порт 443 по адресу 103.86.96.23 (адрес выбран случайно), где расположен наш сервер. Кодируем нагрузку с использованием кодировщика shikata ga nai, повторяя кодирование 10 раз. Дополнительно: exitfunc=thread, что позволит нашему процессу продолжить работу, когда файл-инсталлятор завершит работу (это обязательная опция, если мы планируем сохранять функционал, который несёт “чистый” файл).
Файл несколько больше, чем незакодированный, но надеемся, что у части антивирусов нет такой сигнатуры. Запускаем shellter и выбираем ручной режим работы.
Запуск shellter: отвечаем на вопросы утилиты
Сразу shellter начинает задавать вопросы. Первый из них: включать ли сбор Dynamic Thread Context Info? Отвечаем “NO”. Иначе этот сбор снизит количество доступных точек внедрения. Включайте эту опцию только в том случае, если собираетесь тщательно протрассировать большой файл. Опция включает дополнительную фазу фильтрации.
Затем указываем количество инструкций, которые shellter должен трассировать, чтобы перейти к следующему этапу. Количество лучше указать с запасом: в любой момент будет возможность прервать трассировку и перейти к следующей фазе работы. Важна процессорная мощность, на нее и ориентируемся.
Проверку на самомодифицирующийся код включаем: иначе мы рискуем получить нерабочий эксплойт. Конечно, shellter делает такие проверки в любом случае: этот вопрос относится к обнаружению кода, который модифицирует себя обратно к исходному коду перед сбрасыванием логов исполнения. Такая проверка слегка замедлит поиск точек входа, но не повредит. Если вы уверены, что в исходном файле эта функциональность отсутствует — смело отключайте проверку.
Все ли треды трассировать? В зависимости от процессорной мощности. Отвечаем нет, чтобы ускорить поиск. И указываем не показывать трассировку в реальном времени, так как это тоже замедляет процесс трассировки.
Фильтрация результатов после трассировки и обфускация декодера
После трассировки наступает первый этап фильтрации результатов. Включаем “скрытный” режим, то есть сохраняем имеющийся функционал, затем указываем “custom payload”. Это не reflective DLL, конечно. Просим дополнительно обфусцировать декодер, который shellter использует, чтобы распаковать код, и используем свою последовательность для кодирования. Эту последовательность генерируем любым простым скриптом. Грубый пример на python:
import random random.seed() line=" "
for i in range(0,300) : r=random.randrange(4)
if r==0 and line[-1]!="x": line=line+"x"
elif r==1 and line[-1]!="!": line=line+"!"
elif r==2 and line[-1]!="-":
line=line+"+"
elif r==3 and line[-1]!="+": line=line+"-"
Желательно, чтобы последовательность была длинной и уникальной. Обфускация нужна, чтобы антивирус не распознал знакомый паттерн reverse shell’a, который мы использовали ранее (пусть он закодирован при создании, но дополнительная гарантия не помешает).
Shellter “подумает” и перейдёт к этапу IAT Handler. Это методы загрузки закодированной полезной нагрузки. В зависимости от исходного файла-носителя, выбор будет разниться. В авто-режиме shellter выбирал один из доступных методов случайным образом. Мы же выберем выберем LoadLibrary.
Добавляем полиморфный код перед полезной нагрузкой. Используем автоматически генерируемый код, примерно равный по размеру половине нагрузки. Длина полиморфного кода зависит от того, насколько далеко трассирует код антивирус, против которого мы работаем.
Последний шаг: завершение внедрения
На второй стадии Shellter сообщает, что найдено 44 подходящих точки внедрения. Посмотрим на них.
Выберем 32-ю. Shellter заканчивает внедрение кода и проверяет, что код из нашего файла запускается.
Заметим, что поскольку используем вставку из полиморфного кода, проверяется достижимость первой инструкции этой вставки, а не полезной нагрузки. Проверим наш файл так же, как и в первом материале, на Virustotal. Ситуация немного улучшилась.
Полученный файл можно встраивать, например, в систему с установленными антивирусами: Касперский, McAfee, Clam AV, Symantec. Интересно, что Windows Defender по-прежнему определяет файл как троян. Скорее всего, вышеуказанные антивирусы перестали трассировать файл примерно в середине внедренного полиморфного кода.
Вывод: если мы предполагаем, что на тестовой системе (на цели) используются антивирусы, трассирующие инструкции, то внедряем длинный участок полиморфного кода перед полезной нагрузкой.
Обратите внимание на анализ поведения файла в песочнице, проводимый Virustotal. Этот анализ показывает, что будет знать антивирус об итоговом файле. Как видно на скриншоте, попытка установления удаленного соединения хорошо заметна.
Что делаем с антивирусами, которые определили вредоносный файл?
Увеличение итераций кодирования в msfvenom до трёхсот положительного результата не принесло, лишь усложнило поиск точки входа (размер нагрузки составил почти 9 килобайт). Об этом эксперименте и других попытках обойти антивирусы расскажем в следующем материале.
Внимание! Данный материал предоставлен в ознакомительных целях. Ни автор, ни участники портала codeby.net не несут ответственности за любой вред, причинённый применением информации из данного материала.