(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.
Теперь мне нужно было объединить обе части PowerShell-скрипта для Villain таким образом, чтобы они выполнялись по отдельности, но при этом запускались вместе. Я решил использовать технику Get-Command с подстановочными знаками, упомянутую в вышеуказанном ресурсе. Оператор & запускает команды в виде задач (jobs). По сути, он извлекает саму строку из указанного URI (в данном случае наши скрипты) и затем выполняет эту строку (команду) с помощью Invoke-Expression, также использующего подстановочный знак для обхода детекта. Два Get-Command выглядят необычно таким образом, чтобы уменьшить энтропию по Шеннону, которая в противном случае могла бы быть слишком высокой и привести к срабатыванию антивируса:
Для выполнения этого на хосте под управлением 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 (это будет другая публикация, если вы не знаете, как это сделать).
Одна из вещей, которую я заметил, — это то, что когда пользователь открывал зараженный исполняемый файл Chrome, появлялось окно командной строки, которое пользователь мог легко закрыть и прекратить мою сессию shell. Чтобы обойти это, я упаковал простой скрипт VBS с вредоносным исполняемым файлом и чистым браузером Chrome (в WinRaR), который просто запускал вредоносный исполняемый файл без появления окна — не давая пользователю возможности остановить наш shell:)
Теперь остается только использовать социальную инженерию, чтобы заставить пользователя скачать этот, на первый взгляд, безвредный исполняемый файл или разместить его там самим с уже существующим доступом. На машине жертвы активирован 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.
d00m911
В ps2exe есть параметр "noConsole", чтобы отключить создание окна консоли.
Без обид, но я бы не рекомендовал так делать, это очень палевный способ, особенно запуск exe-файла после какой бы то ни было нагрузки, это главный триггер для поведенческого анализатора любого нормального антивируса. Ну, и, опять же, антивирусы, которые хотя бы как-то работают, ставят хуки на вызовы api или вообще системные вызовы, и это сразу запалится.
То есть для 80% антивирусов этот способ как огромный красный флаг под названием "смотрите, я прячу полезную нагрузку".