Как обойти проверку на вирусы

Обновлено: 25.04.2024

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

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

Packer-as-a-service

Хакерская группа, стоящая за распространением RTM, до конца 2020 года регулярно проводила массовые фишинговые рассылки с вредоносными вложениями. Этот процесс, по всей видимости, происходил автоматически.

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

Пример архива RTM

Пример архива RTM

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

Rex3Packer

Первое использование этого пакера группой RTM, которое нам удалось обнаружить, относится к ноябрю 2019 года. Активное же его применение, по нашим данным, приходится на период апрель—май 2020 года.

Фишинговое письмо RTM, январь 2021

Фишинговое письмо RTM, январь 2021

Нам не удалось связать этот упаковщик с каким-либо из ранее описанных публично, поэтому мы дали ему свое название по трем особенностям его устройства: наличию рекурсии (recursion), реверса битов (reverse) и рефлективной загрузки PE-файлов (reflection) — Rex3Packer.

Алгоритм распаковки

Общий алгоритм извлечения полезной нагрузки выглядит так:

С помощью VirtualAlloc выделяется заранее определенное количество памяти с правами на чтение, запись и исполнение.

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

Управление передается на функцию внутри буфера.

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

Выделяется еще один буфер под упакованные данные.

Через вызов VirtualProtect устанавливаются права RWX на весь регион памяти с образом PE-файла.

Упакованные данные копируются в свой буфер.

Происходит декодирование упакованных данных.

Регион памяти с образом PE заполняется нулевыми байтами.

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

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

Непосредственно упакованным данным предшествует заголовок размером 16 байт, который содержит 4 поля по 4 байта:

размер самого заголовка,

размер исходных данных (PE-нагрузки),

позиция в исходных данных (*), по которой происходит их разделение,

режим кодирования (1, 2, либо 4).

Декодирование выполняется следующим образом:

Внутри каждого байта выполняется реверс порядка битов (к примеру, 10011000 становится 00011001).

В зависимости от режима кодирования (1, 2, 4), данные разбиваются на блоки размером N = 9, 5, либо 3 байта соответственно. Результат декодирования блока — это (N – 1) байт (то есть 8, 4, или 2).

В первых N-1 байтах блока отсутствует часть битов: их значения всегда равны нулю. Чтобы восстановить оригинальные байты, с помощью масок вида 00000001, 00010001 или 01010101 из последнего байта блока извлекаются недостающие биты. При этом для каждого следующего байта маска сдвигается. То есть последний байт блока фактически составлен из объединенных логической операцией OR битов, которые извлечены из предыдущих байтов.

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

Схема получения исходных байтов в режиме 4

Схема получения исходных байтов в режиме 4

4. После операции по восстановлению битов во всех блоках полученные данные представляют собой исходный PE-файл, который был разделен по позиции (*) на две части. Эти части, в свою очередь, были переставлены между собой. Обратная перестановка с учетом значения (*) позволяет получить оригинальный файл.

Обфускация

Чтобы усложнить анализ кода, в пакере применяется различного рода запутывание:

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

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

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

Использование

Кроме экземпляров RTM, мы обнаружили использование Rex3Packer для упаковки различного ВПО, в основном из стран СНГ.

Также мы отметили использование пакера для упаковки экземпляров ВПО из семейств Nemty, Pony, Amadey.

HellowinPacker

В мае 2020 группа RTM переключилась на использование нового упаковщика — HellowinPacker, который продолжала активно использовать до начала 2021 года. Ключевой особенностью этого пакера является два уровня мутации кода. Первый из них существенно меняет структуру кода распаковки, делая различные образцы не похожими друг на друга.

Сравнение кода в двух экземплярах разной структуры

Сравнение кода в двух экземплярах разной структуры

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

Сравнение кода в двух экземплярах одной структуры

Сравнение кода в двух экземплярах одной структуры

Так же, как и в случае с Rex3Packer, мы имеем дело с массовым использованием HellowinPacker для упаковки различного ВПО. При этом вредоносное ПО из одного семейства, как правило, имеет в упакованном виде одну и ту же структуру. Это можно пронаблюдать, по крайней мере, на протяжении некоторого времени — затем структура может измениться.

Алгоритм распаковки

Одни из первых действий, которые встречаются во всех упакованных файлах — это попытки открыть ключ реестра HKEY_CLASSES_ROOT\Interface\ (регистр символов в конкретном случае может отличаться) и запросить в нем значение по умолчанию (Default). От успешности этих операций в некоторых модификациях генерируемого кода зависит корректное продолжение работы программы.

GUID интерфейса в разных случаях также может отличаться.

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

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

Схема копирования данных в HellowinPacker

Схема копирования данных в HellowinPacker

Затем происходит процесс дешифровки блоками по 4 байта:

очередной блок интерпретируется как целое число (DWORD),

к его значению прибавляется индекс первого байта в блоке,

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

Обфускация

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

Точка входа в одной из упакованных библиотек

Точка входа в одной из упакованных библиотек

Дополнительным эффектом от такого использования WinAPI становится невозможность детектирования по списку импортируемых функций и imphash.

При работе с различными числовыми значениями часто встречается некоторая арифметическая обфускация: необходимые константы представляются в виде суммы или разности других констант (в определенных случаях равной нулю). При этом для получения констант могут быть использованы и вызовы функций WinAPI, дающие предсказуемый результат (например, 0 в случае неудачи).

Использование

HellowinPacker существует по крайней мере с 2014 года. За это время он был использован в различном массовом вредоносном ПО. Вот лишь несколько примеров:

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

Антивирусы-лузеры

Примеры будут извлечены из нашей любимой зверюшки — бота-руткита TDSS, о котором в последнее время много говорят. Что и не удивительно: это один из наиболее распространенных, технически продвинутых и активно развивающихся ботов.

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

  1. Исходные данные — статистика от пользователей утилиты TDSS Remover за первый квартал 2010 г.
  2. Всего было обработано порядка тысячи зараженных машин
  3. Из них 12% были оснащены известными нам антивирусами
  4. На диаграмме не отображена статистика по антивирусам, которые провалили лечение, но при этом не блокируют и не скрывают свои файлы. Факт блокировки или скрытия файлов попадает в статистику, как значимая для антируткита аномалия.

Несколько слов о зверюшке

Появившись около двух лет назад, бот-руткит TDSS (также известный как Alureon, Tidserv, TDL/TDL2/TDL3+) тихо и незаметно размножился до тревожных цифр.

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

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

Примеры техник обхода защиты

Техники приведены в том порядке, в каком мы находили их в эволюционирующем TDSS. Все описанные приемы уже не столь эффективны, как были на момент их появления.

Пример №1. Системный кеш динамических библиотек

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

// 1. размещаем вредоносный код в кеше часто используемых библиотек
NtCreateSection(”\knowndlls\dll.dll”)
// 2. обеспечиваем переход на этот код из легитимной библиотеки,
// пока что - в ее копии на диске
CopyFile(”msi.dll”, "patched_msi.dll")
WriteFile("patched_msi.dll", )
// 3. подменяем эту библиотеку в кеше
NtOpenSection(”\knowndlls\msi.dll”)
NtMakeTemporaryObject(. ) // секция стала временной, и теперь может быть.
CloseHandle(. ) // удалена
NtCreateSection(”patched_msi.dll”)
// 4. вызов системного сервиса, который исполнит код msi.dll => dll.dll
StartService (”Windows Installer (msiexec.exe)”)

Пример №2. Диспетчер печати

Суть техники та же, что и в предыдущем примере — пассивное внедрение в системный процесс. Механизм несколько иной: вредоносный код подсовывается сервису диспетчера печати под видом его служебной библиотеки.

//1. копируем вредоносный код в служебную директорию диспетчера печати
GetPrintProcessorDirectory(. )
GetTempFileName(. )
CopyFile(,)
// 2. сервис диспетчера печати должен быть запущен
StartService("spooler")
// 3. передаем ему вредоносный код
AddPrintProcessor()

Пример №3. Заражение легитимного драйвера

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

В конце апреля бот в очередной раз обновился.

version= 3.273
builddate= 20.4.2010 16:17:53

  1. Файлы atapi.sys/iastor.sys под бдительным наблюдением защиты? — В новой версии заражается случайный драйвер.
  2. Поведенческие защиты научились замечать вызов функции AddPrintProcessor — он был заменен на вызов схожей функции AddPrintProvidor. (!)
  3. Некоторые утилиты-лечилки добирались до защищенных областей руткита на диске через интерфейс SCSI Pass Through — в новой версии руткита соответствующие этому механизму IRP фильтруются.

Техники же сложные (как в Примере №3) или хитрые (Примеры №1 и 2) больше характерны для хорошо финансируемых целевых руткитов. Открытым остается вопрос, потеряла ли команда TDSS своего лучшего разработчика, или все же изрядную долю финансирования.

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

image

Глава 1. Вступление

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

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

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

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

Глава 2 Структура PE файлов

Формат файла PE (Portable Executable) используется Windows для обработки бинарных файлов по умолчанию (Рис. 2.1). Стоит отметить, что не все бинарные файлы состоят из 5 секций. Они также могут состоять из 4, 6 или 7 секций, в зависимости от их построения.

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


Рис. 2.1: Структура PE файла

2.1 – Антивирусные сигнатуры и PE формат

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

Иногда сигнатуры находятся очень просто, например, при использовании ncx99.exe. ncx99.exe – это простой netcat listener, привязывающий cmd.exe к 99 порту на внешнем сетевом интерфейсе. На рис. 2.1.1 показана основная сигнатура между смещениями E77E и E78F.


Рис 2.1.1 Просмотр бинарного файла в шестнадцатеричной кодировке

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

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

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


Рис 2.1.2 – Обзор части списка PE заголовков в Ollydbg

2.2 – Изменение сигнатур антивируса в PE файлах

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

В случае с ncx99.exe, есть возможность изменения, как слушающего порта, так и программы, которая будет выполняться. Конечно, если заменить его, например на calc.exe, при взломе это не поможет, а вот замена номера порта с 99, например, на 81 может оказаться полезной. Таким образом, можно успешно обойти механизмы обнаружения некоторых антивирусов.


Рис. 2.2.1 – проверка исходного файла ncx99.exe


Рис. 2.2.2 – проверка ncx99.exe с п ривязкой к 81 порту

Как показано на рис 2.2.2, антивирусы Avast и Ikarus удалось успешно обойти. При атаке компьютеров, которые используют один из этих антивирусов, нам достаточно будет всего лишь изменить один из слушающих портов.

2.3 – Полиморфные техники и взломы

Полиморфные методы

Некоторые полиморфные вирусы имеют одинаковый функционал, но различные опкоды. В этом заключается очередной прием, применяемый опытными хакерами. Например, вместо инструкции PUSH -1, хакер может использовать DEC ESI, PUSH ESI, INC ESI, если регистр ESI равен 0. Если он не равен нулю, злоумышленнику придется сохранить значение ESI путем перемещения его в стек, и обнулить его с помощью оператора XOR (XOR ESI, ESI). Затем его можно использовать для записи в стек вместо PUSH -1.

После этого необходимо восстановить исходное значение ESI, с помощью оператора POP.

Взломы

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

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

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

Один хакер может причинить столько же вреда, сколько 10 000 солдат! Подпишись на наш Телеграм канал, чтобы узнать первым, как выжить в цифровом кошмаре!



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


Но, сперва, disclaimer:
1) Многое из написанного ниже, для экспертов, несомненно - боян. Но автор и не претендует на "срыв покровов". Статья призвана предостеречь тех пользователей, которые полагаются на антивирус как на панацею, при этом забывая о необходимости комплексного подхода к безопасности.
2) Статья написана исключительно в образовательных целях. Не нужно использовать эту информацию для совершения противоправных действий.
3) Статья не пытается бросить тень на производителей антивирусов. Уверен, что они делают все возможное, чтобы совершенствовать свои продукты.

Как-то раз нелегкая судьба безопасника (от которого часто требуют уметь все) занесла меня в пентесты. Была поставлена задача проверить уязвимость организации к вирусной атаке.

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

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



Как видим, антивирусы, в подавляющем большинстве, детектировали Meterpreterкак вредоносное ПО. Это и не удивительно: ему уже много лет.
Означает ли это победу антивируса над скрипт-кидди? Не совсем.

Антивирусы выходят из игры
После 5 минут поиска в Google находится сразу несколько готовых решений для обхода антивирусов. Познакомимся поближе с инструментом под названием Shellter ( сайт ).


Если создать зараженный файл при помощи Shellter и попытаться проверить его через VirusTotal, то увидим следующее:



Показатель детектирования просто катастрофически упал. Это означает, что большинство антивирусов, установленных на рабочих местах и серверах не определят данный файл как опасный! На все про все, включая установку Shellter, ушло от силы 5 минут.
Таким образом, хотя сигнатура трояна известна уже много лет (Metasploit и Meterpreter входят в стандартную сборку Kali Linux), благодаря Shellter популярные антивирусы ничего не могут с ним поделать.


А как на практике?
Но тест на VirusTotal без испытаний "в поле" не показатель. Может быть при работе троян будет обнаружен по поведенческим признакам? Чтобы проверить это, протестируем файл на двух популярных антивирусах: Eset (5.0.21.26) и Kaspersky Internet Securiy (17.0.0.611).

Беглое тестирование показывает следующее:

1) Копирование и запуск файла не детектируется.
2) При запуске инфециорованного файла сессия до сервера управления (Metasploit) успешно открывается.
3) При выполнении некоторых действий (например, при попытке "миграции" Meterpreter в другие процессы), процесс Meterpreter’а детектируется как угроза.
4) При попытке использования веб-камеры, KIS запрашивает разрешение пользователя.
5) Большое количество функций Meterpreter’а все равно работает без обнаружения. В частности, прекрасно работает кейлоггер, скрипты сбора учетных данных, выгрузка информации из браузеров, скриншоты рабочего стола, копирование файлов. В принципе, этого достаточно для решения злоумышленником своих задач.

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



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

История закончилась для пользователей легким "троллингом": на рабочем столе появилось приглашение на корпоративный тренинг по ИБ. На тренинге им было рекомендовано:

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

На этом, пожалуй, все.

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


Ан­тивирус — край­не полез­ная шту­ка, но толь­ко не тог­да, ког­да тебе нуж­но остать­ся незаме­чен­ным в ата­куемой сети. Сегод­ня мы погово­рим о том, как при пен­тесте мож­но обма­нуть анти­вирус­ные прог­раммы и избе­жать обна­руже­ния в ском­про­мети­рован­ной сис­теме.

Эта статья — про­дол­жение цик­ла пуб­ликаций, пос­вящен­ных пос­тэкс­плу­ата­ции. В пре­дыду­щих сери­ях:

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

warning

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

Во­обще, задача обхо­да анти­виру­са может воз­никнуть в двух слу­чаях:

  • при ата­ке. Тут полез­ную наг­рузку запус­кает либо уяз­вимое при­ложе­ние, либо, что чаще, поль­зователь (соци­аль­ная инже­нерия). Глав­ным обра­зом это будет некое средс­тво зак­репле­ния и обес­печения пос­тоян­ного при­сутс­твия. Самое важ­ное — не спа­лить­ся;
  • при пос­тэкс­плу­ата­ции. В этом слу­чае мы сами запус­каем прог­рамму на ском­про­мети­рован­ной сис­теме. Это может быть сниф­фер, средс­тво повыше­ния при­виле­гий или прос­то какой‑то хакер­ский софт, исполь­зуемый для прод­вижения по сети. И при этом для нас важ­нее запус­тить прог­рамму, даже если это получи­лось не с пер­вой попыт­ки и анти­вирус выкинул нес­коль­ко алер­тов.

В пер­вом слу­чае дос­таточ­но лишь при­менить извес­тную тех­нику — полимор­физм. Изме­няем код, не меняя его фун­кци­ональ­ность. Хорошая так­тика — написать код самому. Нап­ример, с помощью двад­цати строк кода на VBS мож­но реали­зовать прос­той reverse shell и успешно обой­ти любой анти­вирус. Нас же боль­ше будет инте­ресо­вать вто­рой слу­чай, и имен­но это и будет темой дан­ной статьи.

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

По боль­шому сче­ту мы име­ем дело с дву­мя механиз­мами защиты:

  • сиг­натур­ным;
  • эв­ристи­чес­ким (поведен­ческим).

При сиг­натур­ном ана­лизе анти­вирус учи­тыва­ет мно­жес­тво фак­торов, в час­тнос­ти боль­шое вли­яние на резуль­тат ока­зыва­ет ком­пилятор. Вот дос­таточ­но забав­ные резуль­таты VirusTotal для безобид­ного helloworld-при­ложе­ния, написан­ного на С:

  • i686-w64-mingw32-gcc — 11/68 детек­тов;
  • msvc — 2/64 детек­та;
  • win-gcc — 0 детек­тов.

Что же каса­ется ана­лиза поведе­ния прог­раммы, тут нуж­но понимать, что, даже если тебе уда­лось обой­ти сиг­натуры, ты все еще можешь спа­лить­ся, пос­коль­ку вся­кий migrate PID или sekurlsa:: logonPasswords может быть перех­вачен по при­чине исполь­зования харак­терных сочета­ний WinAPI-фун­кций, которые анти­виру­сы очень вни­матель­но монито­рят.

Legal

Shellcode injecting

Тех­ника встра­ива­ния кода в уже запущен­ные, а зна­чит, про­шед­шие про­вер­ку про­цес­сы широко извес­тна. Идея сос­тоит в том, что мы име­ем отдель­ную прог­рамму shellcode_inject. exe и сам shellcode в раз­ных фай­лах. Анти­виру­су слож­нее рас­познать угро­зу, если она рас­кидана по нес­коль­ким фай­лам, тем более по отдель­нос­ти эти фай­лы не пред­став­ляют угро­зы.

shellcode_inject.exe не содержит угроз

shellcode_inject.exe не содер­жит угроз

В свою оче­редь, наш shellcode выг­лядит еще более безобид­но, если мы пре­обра­зуем его в печат­ные сим­волы.

Cоздание автономного (не staged) шелл-кода. Выглядит безобидно

Cоз­дание авто­ном­ного (не staged) шелл‑кода. Выг­лядит безобид­но

Гля­дя на содер­жимое meter. txt , я бы ско­рее решил, что это стро­ка в Base64, чем шелл‑код.

Продолжение доступно только участникам

Вариант 2. Открой один материал

Читайте также: