Перейти к публикации

Exile

Обход Windows Defender ч.1

Рекомендованные сообщения

Обход Защитника Windows (10 способов)

Введение

В этой статье я расскажу о 10 способах/техниках обхода полностью обновленной системы Windows с актуальными данными Windows Defender с целью выполнения произвольного кода (кроме разрешений/ACL).

 

Для тестирования использовалась следующая конфигурация:

  • AWS EC2 с Ubuntu Linux AMI в качестве атакующего C2-сервера.
  • AWS EC2 с Windows Server 2019 AMI в качестве машины жертвы.
  • Локальная машина Windows 10 с Visual Studio 2022 Community для разработки/компиляции вредоносного ПО.
  • Локальная машина Kali Linux для атаки.

Обратите внимание, что я не буду слишком углубляться во многие концепции и в основном буду исходить из базовых знаний. Кроме того, я не стал выбирать слишком сложные техники, например, прямые вызовы системы (direct syscalls) или аппаратные точки останова (hardware breakpoints), поскольку это чрезмерно для антивирусов, и в любом случае их лучше описать в отдельной статье, посвященной EDR.

 

Отказ от ответственности: Информация, представленная в этой статье, предназначена исключительно для образовательных и этических целей. Описанные техники и инструменты предназначены для законного и ответственного использования с явного согласия владельца целевой системы. Любое несанкционированное или злонамеренное использование этих техник и инструментов строго запрещено и может привести к юридическим последствиям. Я не несу ответственности за любой ущерб или юридические проблемы, которые могут возникнуть в результате неправильного использования предоставленной информации.


 

1. In-Memory AMSI/ETW patching

 

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

 

AMSI, или AntiMalware Scan Interface, - это независимый от производителя элемент управления безопасностью Windows, который сканирует PowerShell, wscript, cscript, макросы Office и т.д. и отправляет телеметрию поставщику безопасности (в нашем случае Defender), чтобы тот решил, является ли она вредоносной или нет.

 

ETW, или Event Tracing for Windows, - это еще один механизм безопасности, который регистрирует события, происходящие в пользовательском режиме и драйверах ядра. Поставщики могут анализировать эту информацию, полученную от процесса, чтобы решить, имеет ли он вредоносные намерения или нет.

 

К сожалению, Windows Defender работает с очень малым количеством телеметрии, поступающей от сеансов PowerShell. В частности, исправление AMSI для текущего процесса позволит нам выполнять любые вредоносные программы без файлов, включая инструменты (Mimikatz, Rubeus и т.д.) и ревер-шеллы.

 

Для доказательства концепции я буду использовать встроенную функцию evil-winrm Bypass-4MSI, но очень легко создать собственный патчер AMSI/ETW в виде сценария PowerShell или исполняемого файла, как мы увидим позже.

 

Таким образом, цепочка kill для дампа In-Memory logons с Mimikatz из процесса LSASS работает следующим образом:

 

In-Memory AMSI Patching PoC

e6dfa1329d7d940d1128c.png
 

Для лучшего понимания набор команд может быть объяснен на более высоком уровне следующим образом:

  • Попробуйте написать известный триггер "Invoke-Mimikatz" как способ проверить, активен ли Defender.
  • Выполните функцию evil-winrm Bypass-4MSI для исправления AMSI в текущем сеансе PowerShell.
  • Снова вызовите триггер AV, чтобы проверить, работает ли телеметрия AMSI (как мы видим, уже нет).
  • Загрузите реальный модуль Invoke-Mimikatz PowerShell в память с помощью Invoke-Expression.
  • Выполните Mimikatz для дампа паролей входа в систему из LSASS.

Обратите внимание, что выполнение Mimikatz было просто в демонстрационных целях, но вы можете делать практически все, что хотите из терминала PowerShell без телеметрии AMSI.


 

2. Обфускация кода

 

Обфускация кода обычно не нужна или не стоит тратить на нее время для изначально компилируемых языков, таких как C/C++, поскольку компилятор в любом случае будет применять множество оптимизаций. Но большая часть вредоносных программ и инструментов написана на C# и, иногда, Java. Эти языки компилируются в байткод/MSIL/CIL, который легко поддается реверс-инженерии. Это означает, что вам придется применить некоторую обфускацию кода, чтобы избежать обнаружения сигнатур.

 

Существует множество обфускаторов с открытым исходным кодом, но я буду основывать доказательство концепции этого раздела на инструменте обфускатора InvisibilityCloak C# от h4wkst3r.

 

Например, используя инструмент GhostPack's Certify, который обычно используется для поиска уязвимых сертификатов в домене, мы можем использовать вышеупомянутый инструмент для обхода защитника следующим образом.

 

Убедитесь, что Defender запущен и блокирует сборку Certify по умолчанию

fcfec81eb5eeef87c8955.png
 

Обфускация кода Certify с помощью InvisibilityCloak

594fa2b29dcf32b04e4c6.png
 


Попытайтесь запустить обфусцированный Certify

1a94f7909c90c1f4227e5.png
 


Мы видим, что теперь все работает без проблем, однако выдает ошибку, поскольку виртуальная машина не подключена к домену или не является контроллером домена.

 

Мы можем сделать вывод, что все получилось, однако, обратите внимание, что некоторые инструменты могут нуждаться в более глубокой обфускации, чем другие. Например, в данном случае я выбрал Certify вместо Rubeus, поскольку это было проще для простых демонстрационных целей.


 

3. Обфускация во время компиляции

 

Для изначально компилируемых языков, таких как C, C++, Rust и т.д., вы можете использовать обфускацию во время компиляции, чтобы скрыть реальное поведение подпрограмм и общий поток инструкций.

 

В зависимости от языка, могут существовать различные методы. Поскольку для разработки вредоносных программ я использую C++, я расскажу о двух из них, которые я пробовал: обфускация LLVM и метапрограммирование шаблонов.

 

Для обфускации LLVM самым большим публичным инструментом в настоящее время является Obfuscator-LLVM. Этот проект представляет собой форк LLVM, который добавляет уровень безопасности через обфускацию к создаваемым двоичным файлам. В настоящее время реализованы следующие дополнительные возможности:

  • Подмена инструкций. Обфускация инструкций ассемблера для получения эквивалентного поведения при большей вычислительной сложности.
  • Поддельный поток управления. Добавление нежелательных блоков инструкций для скрытия оригинального потока кода инструкций.
  • Сглаживание потока управления. Делает ветвления и переходы более трудно предсказуемыми для того, чтобы скрыть намеренный поток инструкций.

В заключение можно сказать, что инструмент генерирует двоичные файлы, которые в целом гораздо труднее поддаются статическому анализу человеком/антивирусами/EDRs.

 

С другой стороны, метапрограммирование шаблонов - это техника C++, которая позволяет разработчикам создавать шаблоны, генерирующие исходный код во время компиляции. Это дает возможность генерировать различные двоичные файлы при каждой компиляции, создавать бесконечное количество ветвей и блоков кода и т.д.

 

Два общедоступных фреймворка, которые я знаю и использовал для этой цели, следующие:

 

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

 

Более того, для PoC я буду использовать AMSI_patch от TheD1rkMtr в качестве двоичного файла по умолчанию для обфускации, так как это довольно простой проект на C++. Код обфусцированного двоичного файла можно найти здесь.

 

Сначала давайте посмотрим на базовое дерево бинарных функций под Ghidra.

 

Дерево двоичных функций по умолчанию

9779d2de2a2734d62b04b.png
 

Как мы видим, его не так уж сложно проанализировать. И вы можете найти главную функцию под 3-й рутиной FUN_.

 

Главная функция бинарной функции по умолчанию

f8bba9e48e3d1a987e03a.png
 


Которая выглядит довольно простой для анализа и понимания ее поведения (патч AMSI через AMSIOpenSession в данном случае).

 

Теперь давайте посмотрим на обфусцированное дерево бинарных функций.

 

Обфусцированное дерево бинарных функций

0c6bdfca2c68e1972ef9c.png
 

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

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...