(C2-фреймворк Villain + обфускация PowerShell + недетектируемая доставка)

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Использование этих инструментов и методов против хостов, для которых у вас нет явного разрешения на тестирование, является незаконным. Вы несете ответственность за любые последствия, к которым может привести использование этих инструментов и методов.

Антивирусные системы и Windows Defender используют сочетание сигнатурного и поведенческого обнаружения, а также современные решения на основе ИИ для выявления и блокировки вредоносного ПО или попыток подключения к C2-серверу. Как правило, сигнатурное обнаружение проще всего обойти, однако злоумышленникам сложнее преодолеть анализ, выполняемый на хосте в процессе исполнения скрипта, например, с использованием AMSI. Я обнаружил интересный инструмент под названием Villain и решил найти способ использовать его для обхода современных антивирусных решений или, как минимум, актуальной версии Windows Defender, который ориентирован на выявление угроз в реальном времени.

Villain

Villain представляет собой C2-фреймворк, способный работать с несколькими TCP-сокетами и обратными соединениями на базе HoaxShell, а также расширять их функциональность. Этот фреймворк крайне прост в использовании: просто создайте полезную нагрузку и вставьте её на целевой системе — он даже автоматически запускает прослушиватели! Однако при включенном Windows Defender вы заметите, что стандартная мгновенно помечается как вредоносный.

Неудачная первоначальная обратная оболочка
Неудачная первоначальная обратная оболочка

Я решил исследовать техники обфускации и нашел следующий ресурс от того же автора: https://github.com/t3l3machus/PowerShell-Obfuscation-Bible - Сборник техник, примеров и небольшое количество теоретических основ для ручной обфускации PowerShell-скриптов.

Для изменения сигнатуры я сначала проделал несколько действий:

  • Вставил случайные комментарии и пробелы в скрипт

  • Создал переменные с произвольными именами, закодированными в шестнадцатеричном формате

  • Добавил случайные кавычки внутри iex и pwd

Ещё неудачная попытка с обратной оболочкой
Ещё неудачная попытка с обратной оболочкой

Ничего из этого не сработало. Примерно 9 месяцев назад, в 2023 году, можно было просто изменить определенные части скрипта, такие как замена iex на i''e''x или изменение стандартных имен переменных, например, $data на $3e59da34d2. Но в 2024 году создание незаметного вредоносного ПО требует определенных проб и ошибок.

Затем я решил попробовать разбить аргументы команд, чтобы определить момент, когда антивирус обнаруживает их как вредоносные. Я выяснил, что разделение первой переменной, которая создает TCPClient-сокет с хостом атакующего, от остальной части скрипта не вызвало срабатываний, и я получил оболочку на Villain.

Успешная попытка
Успешная попытка
Перехват обратной оболочки через Villain
Перехват обратной оболочки через Villain

Теперь мне нужно было объединить обе части PowerShell-скрипта для Villain таким образом, чтобы они выполнялись по отдельности, но при этом запускались вместе. Я решил использовать технику Get-Command с подстановочными знаками, упомянутую в вышеуказанном ресурсе. Оператор & запускает команды в виде задач (jobs). По сути, он извлекает саму строку из указанного URI (в данном случае наши скрипты) и затем выполняет эту строку (команду) с помощью Invoke-Expression, также использующего подстановочный знак для обхода детекта. Два Get-Command выглядят необычно таким образом, чтобы уменьшить энтропию по Шеннону, которая в противном случае могла бы быть слишком высокой и привести к срабатыванию антивируса:

PowerShell-скрипт для загрузки и выполнения двух PS-скриптов с хоста атакующего
PowerShell-скрипт для загрузки и выполнения двух PS-скриптов с хоста атакующего

Для выполнения этого на хосте под управлением Windows из командной строки мне нужно было выполнить несколько действий:

1. Я создал два PS-скрипта под названиями stage1.ps1 и stage2.ps1, которые содержат первую и вторую части PS-скрипта Villain, соответственно (я добавил другие методы обфускации для демонстрации концепции, хотя это и не обязательно). Эти скрипты будут выполняться на целевом хосте с IP-адресом 10.0.2.5.

2. Разместить эти скрипты на веб-сервере на моем атакующем хосте с IP-адресом 10.0.2.9 (через незаблокированный порт, например, 80 или 443), чтобы передать их жертве.

Подождите — это здорово, но я хочу получить shell, заставив пользователя скачать или открыть что-то неприметное. Для этого я использовал Invoke-PS2EXE на своем Windows-хосте, чтобы преобразовать два скрипта PowerShell выше в исполняемый файл Windows, а затем использовал WinRAR, чтобы заставить его выглядеть как обычный исполняемый файл Chrome (это будет другая публикация, если вы не знаете, как это сделать).

Конвертирование .ps в EXE
Конвертирование .ps в EXE
Фальшивый Chrome с обратным шеллом против настоящего Chrome
Фальшивый Chrome с обратным шеллом против настоящего Chrome

Одна из вещей, которую я заметил, — это то, что когда пользователь открывал зараженный исполняемый файл Chrome, появлялось окно командной строки, которое пользователь мог легко закрыть и прекратить мою сессию shell. Чтобы обойти это, я упаковал простой скрипт VBS с вредоносным исполняемым файлом и чистым браузером Chrome (в WinRaR), который просто запускал вредоносный исполняемый файл без появления окна — не давая пользователю возможности остановить наш shell:)

Скрипт VBS, который запускает вредоносный исполняемый файл
Скрипт VBS, который запускает вредоносный исполняемый файл

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

Когда пользователь дважды щелкает по нашему вредоносному исполняемому файлу chrome, stage1.ps1 и stage2.ps1 загружаются и выполняются с нашего сервера, затем создается сессия на Villain, и в конце концов для пользователя Google Chrome открывается как обычно.

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

БОНУС: C2 через интернет

Pagekite - быстрое и надежное решение для туннелирования локальных хостингов

Pagekite можно использовать для доставки и выполнения наших PS-скриптов через интернет вместо локальной сети. Зарегистрируйтесь с действующим адресом электронной почты для получения 30-дневной бесплатной пробной версии. Также можно использовать дешевый VPS с публичным IP-адресом для получения обратного шелла netcat, сгенерированного с помощью Villain.

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

Затем создайте веб-сервер, который будет размещать файлы stage1.ps1 и stage2.ps1 на нашем домене PageKite FQDN, который будет выглядеть как python3.pagekite.me.

Наконец, измените скрипт test.ps1 так, чтобы он загружал файлы с PageKite, а не с локального хоста. Затем преобразуйте его в исполнимый файл, как ранее, и отправьте его жертве.

На нашем VPS откройте Villain и дождитесь подключения через интернет (возможно, потребуется настроить переадресацию портов).

Теперь мы получаем обратную оболочку, используя PageKite и VPS.

Мы в телеграме

Комментарии (1)


  1. d00m911
    09.11.2024 05:50

    В ps2exe есть параметр "noConsole", чтобы отключить создание окна консоли.

    Без обид, но я бы не рекомендовал так делать, это очень палевный способ, особенно запуск exe-файла после какой бы то ни было нагрузки, это главный триггер для поведенческого анализатора любого нормального антивируса. Ну, и, опять же, антивирусы, которые хотя бы как-то работают, ставят хуки на вызовы api или вообще системные вызовы, и это сразу запалится.

    То есть для 80% антивирусов этот способ как огромный красный флаг под названием "смотрите, я прячу полезную нагрузку".