Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Если тебе знакома фраза «Этот сценарий содержит вредоносное содержимое и был заблокирован антивирусным программным обеспечением», то сегодняшняя статья — для тебя. Такое сообщение генерирует встроенный в Windows 10 механизм AMSI, блокирующий выполнение вредоносных сценариев и скриптов. Можно ли его обойти? Запросто, и сейчас я расскажу, как это сделать.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Аббревиатура AMSI расшифровывается как Anti-Malware Scan Interface. Эту технологию Microsoft разработала в качестве метода защиты пользователей от вредоносных программ и впервые внедрила в Windows 10. AMSI в реальном времени перехватывает скрипты и команды PowerShell, JavaScript, VBScript, VBA или .NET и отсылает на проверку антивирусному программному обеспечению (это необязательно Defender, более десяти вендоров поддерживают AMSI). Но в наших примерах мы рассмотрим все же Defender.
Когда пользователь запускает скрипт или инициализирует процесс PowerShell (либо PowerShell_ISE), в процесс автоматически загружается библиотека AMSI.DLL
. Она‑то и предоставляет необходимый API для взаимодействия с антивирусным ПО. Прежде чем выполниться, скрипт или команда при помощи удаленного вызова процедур (RPC) отправляется Microsoft Defender, он, в свою очередь, анализирует полученную информацию и отсылает ответ обратно AMSI.DLL
. Если обнаружена известная сигнатура, выполнение прерывается и появляется сообщение о том, что скрипт заблокирован антивирусной программой.
Примерно так работает AMSI
На приведенной выше схеме обозначены две функции — AmsiScanString()
и AmsiScanBuffer()
, они, по сути, главные в цепочке AmsiInitialize
, AmsiOpenSession
, AmsiScanString
, AmsiScanBuffer
и AmsiCloseSession
. Если глянуть exports для amsi.dll
, то мы увидим следующее.
Экспорты библиотеки amsi.dll
Однако значительная часть этого списка нам сегодня не пригодится.
Итак, мы запустили PowerShell. До того как мы сможем вводить какие‑либо команды, будет загружена AMSI.DLL и произойдет вызов AmsiInitialize()
.
HRESULT AmsiInitialize( LPCWSTR appName, HAMSICONTEXT *amsiContext);
Тут используются два аргумента: имя приложения и указатель на структуру CONTEXT
. Параметр amsiContext
будет использоваться в каждом последующем вызове AMSI API.
После того как мы ввели команду или попытались выполнить скрипт, происходит вызов AmsiOpenSession
():
HRESULT AmsiOpenSession( HAMSICONTEXT amsiContext, HAMSISESSION *amsiSession);
Тут тоже передаются два аргумента: amsiContext
, полученный на шаге AmsiInitialize()
, и указатель на структуру SESSION
. Параметр amsiSession
будет использоваться в каждом последующем вызове AMSI API внутри этой сессии.
Далее в дело вступают те самые AmsiScanString()
и AmsiScanBuffer()
. По названию, в принципе, понятно, что они передают для проверки, да и синтаксис у них почти одинаков.
HRESULT AmsiScanBuffer( HAMSICONTEXT amsiContext, PVOID buffer, ULONG length, LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT *result);
HRESULT AmsiScanString( HAMSICONTEXT amsiContext, LPCWSTR string, LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT *result);
Defender проверяет буфер или строку и возвращает результат. Если ответ от Defender — 32768, то малварь обнаружена, единичка сигнализирует, что все чисто.
Малварь обнаружена
Малварь не обнаружена
Ну и после всех перечисленных выше проверок текущая сессия закрывается с использованием AmsiCloseSession
.
Механизм AMSI использует сигнатурное (rule-based) детектирование угроз. Зная этот факт, можно придумывать разные тактики и техники. Некоторые известные способы уже не сработают, но, используя модификацию кода, обфускацию и криптование, можно добиться интересных результатов.
info
Для верификации детекта я буду использовать строки AmsiUtils либо Invoke-Mimikatz. Разумеется, сами по себе эти слова безобидны, но на них срабатывает детект, так как они ловятся сигнатурами. Если уж на AmsiUtils нет детекта, то можно смело грузить, например, PowerView и использовать его возможности по максимуму.
Итак, поехали.
Первый способ, который иногда срабатывает, тривиален. PowerShell 2.0 устарел, но Microsoft не спешит удалять его из операционной системы. У старой версии PowerShell нет таких защитных механизмов, как AMSI, поэтому для обхода детекта иногда достаточно использовать команду powershell -version 2
.
Используем PowerShell 2.0
Источник: xakep.ru