Pentesting с powershell: как отключить amsi (anti malware scan interface)

Tartuga

Бывалый
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
PREMIUM USER

Tartuga

Бывалый
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
PREMIUM USER
Регистрация
7 Фев 2020
Сообщения
525
Реакции
98
Репутация
147
При использовании Powershell для выполнения действий после эксплуатации в тесте Ethical Hacking, где вы должны нарушить безопасность Windows 10, мы можем столкнуться с определенными проблемами при выполнении определенных сценариев. Очень часто пытаться загрузить скрипт с Mimikatz непосредственно в память, с кодом, который позволяет нам пройти хэш или сделать дамп хэша, и в Powershell появляется красное сообщение, в котором говорится: «This script contains malicious content and has been blocked…”.

Это то, что называется AMSI или Anti Malware Scan Interface. Работа AMSI заключается в том, чтобы обрабатывать записи в Powershell или сканировать и блокировать любые действия, которые подозреваются в том, что могут быть плохими. Powershell «приветствовал» возможность запускать что-либо и был вектором, все более интересным для запуска вредоносного кода. По этой причине Microsoft сосредоточила внимание на этом и выпустила AMSI. Короче говоря, AMSI использует строковое обнаружение, чтобы определить, является ли код плохим или нет в Powershell.

Именно здесь возникает игра обход AMSI. Сегодня мы можем сказать, что AMSI способен обнаруживать подавляющее большинство сценариев pentesting, написанных в Powershell, которые являются общедоступными. Опять же, я прокомментировал, что именно здесь начинается игра от байпаса до AMSI.


Мы уже видели это на протяжении всей истории: вредоносная программа, обнаруженная антивирусом, изменяется и больше не обнаруживается, и мы возвращаемся к циклу антивирусом. Метод, который пропускает защиту UAC, защиту AppLocker. И уже некоторое время AMSI. Чтобы показать, что AMSI существует и есть, мы можем увидеть его на рисунке выше.. Это консоль Powershell в debbugger.

Понимание AMSI
В этом первом примере мы увидим, как слово запрещено в Powershell. Если мы напишем «amsiutils» в Powershell, мы получим красное сообщение о том, что выполнение было заблокировано. Избегайте этого слова в любом скрипте.


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


Это в конце концов закончится в зависимости от текущей версии сборки Windows 10, то есть Microsoft приложит усилия, чтобы охватить такие методы уклонения и появятся новые методы. То есть, мы не будем перед первыми, ни последними, методами обхода AMSI.

В качестве примера мы можем обсудить несколько способов выполнения “запретного » кода после его восстановления. Первый использует B a s e 6 4, чтобы избежать обнаружения строк:

  1. Переменная создается с текстом, который требуется выполнить. Вы можете использовать вышеупомянутый трюк разделения строк для достижения этого.
2. После сохранения кода в переменной используется преобразование в base 64: $b = [Convert]:: ToBase64String([Text.encoding]::UTF8.GetBytes ($varCode))

3. На этом этапе код имеет переменную $b. Теперь давайте снова преобразуем код и он будет показан на Powershell: [Text.Encoding]::UTF8.GetString([Convert]:: From Base 64 String ($b))


Второй простой способ — использовать XOR, чтобы обмануть AMSI. Шифрование и дешифрование могут быть эффективной техникой, так как вам нужна большая абстракция для вашего обнаружения.


Эти методы предназначены для предотвращения обнаружения строк в форме «Get Around». Вы действительно не хотите этого, когда мы говорим об обходе AMSI. Предполагается, что вы сможете запустить скрипт так, как есть, без необходимости играть с обфускацией строк или символов. Вы хотите запустить скрипт в состоянии, в котором AMSI блокирует его.

Одним из методов, используемых в последние месяцы, и который будет действителен в зависимости от сборки Windows 10, является исправление памяти или патч памяти. Это настоящий обход. Да, мы должны понимать, что то, что делается, — это отключение AMSI.

Обход AMSI
AMSI имеет различные функции, которые выполняются перед любым кодом Powershell, начиная с Powershell 3.0 и далее. Чтобы обойти, то есть сделать обход, полностью и запустить код, вам нужно исправить его в памяти, чтобы полностью отключить его. Другой метод заключается в том, чтобы исправить счетчик буфера сканирования AMSI, чтобы он считывал 0 входных символов, а не считывал N символов, которые пользователь или процесс вводят в Powershell.

Чтобы использовать метод исправления в памяти и отключить AMSI, вы можете использовать код в C#, чтобы скомпилировать его и достичь DLL. Эта DLL применит такую технику, и AMSI будет отключен. Как логично, этот метод может работать или нет, так как обновления охватывают и эти пути.

Чтобы упростить процесс, можно найти функцию Powershell под названием Bypass-AMSI. Эта функция реализует загрузку кода DLL в Base 64. Проблема может заключаться в том, что AMSI обнаруживает его как нечто вредоносное.


Функция проста. Здесь вы можете попробовать использовать и все работает непосредственно в памяти, или если AMSI обнаруживает его как вредоносную функцию, вам нужно будет проверить метод генерации DLL и импортировать его из процесса Powershell.

В следующем примере вы можете увидеть, как мы загружаем DLL, которая реализует код Memory Patching для AMSI. Он пытается запустить вредоносный код переменной $V, и мы получаем блокировку AMSI.


Запуск метода «Disable ()» исправляет память и позволяет отключить AMSI. Поэтому мы тестируем запуск кода, который хранится в переменной, и получаем выполнение, без необходимости изменять код или обфускать его.

Вывод

Несомненно, исследование и исследования в AMSI интересны и принесут более одной новости в ближайшие месяцы. Microsoft улучшает безопасность Powershell, но всегда нужно искать пробелы, чтобы эта безопасность улучшилась.
 
Сверху