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

Предпосылки

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

WARNING

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

В Сети описывается несколько популярных методов обхода антивирусов. В качестве примеров можно привести сокрытие вредоносного кода в упакованных исполняемых файлах на Python, которое продемонстрировал Дэвид Кеннеди (@TrustedSec), возможность Microsoft Windows PowerShell, позволяющую скрывать природу и само присутствие бинарного файла, выявленную командой PowerSploit, и написанные на C# сервисы Рича Ландина, которые показали себя крайне эффективными в сценариях обхода антивирусов.

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

Обзор фреймворка

Решение нашей проблемы с антивирусами началось со скромной версии Veil 1.0, состоявшей из одного-единственного Python-файла, который генерировал различные пейлоады и упаковывал их в исполняемые файлы с помощью py2exe. Участие Кристофера Трансера, одного из разработчиков Veil-Evasion, в security-подкасте Pauldotcom вызвало огромный ажиотаж вокруг нашего проекта, и вскоре члены сообщества пентестеров начали использовать Veil-Evasion и делиться с нами ценными замечаниями. Затем к команде разработчиков присоединились Майкл Райт и The_Grayhound и полностью переработали код проекта, чтобы сделать из него модульный расширяемый фреймворк без привязки к конкретным языкам и технологиям.

 

VDay

Когда то Veil начал свое существование в виде простого скрипта, который был способен генерировать всего несколько пейлоадов на Python. На данный момент его репертуар включает разнообразные методы генерации пейлоадов на Python, Си, C#, PowerShell и в нативном коде. Пятнадцатого числа каждого месяца, начиная с сентября, мы будем выпускать релиз с поддержкой по меньшей мере одного нового языка либо метода в честь #VDay, нашего «дня победы» над антивирусами. Помимо этого, у нас скопилась обширная база публичных и частных исследований, результаты которых мы планируем регулярно обнародовать; крупнейшие релизы будут приурочены к датам конференций ShmooCon (середина февраля) и BSides / DEF CON (середина-конец июля).


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

  • меню и интерфейс Veil были спроектированы с учетом принципов юзабилити, чтобы корректно обрабатывать как можно больше ошибочных сценариев;
  • дерево пейлоадов Metasploit для Windows обходится с извлечением всех пейлоадов и их обязательных параметров. Это значит, что все генерируемые MsfVenom нагрузки с шелл-кодом Windows могут быть интегрированы в Veil. Для пейлоадов в меню выбора шелл-кода работает автодополнение по Tab в MsfVenom-формате windows/PAYLOAD;
  • автодополнение по Tab было добавлено и в другие части фреймворка, включая большинство меню; также добавлена автоподстановка локального IP-адреса в LHOST и подстановка 4444 в LPORT;
  • почти для всех опций были реализованы ключи командной строки, которые можно просмотреть с помощью команды ./Veil.py -h.

Что касается структуры Veil, то она стала выглядеть следующим образом:

  • пейлоад-модули, помещаемые в ./modules/payloads/[language], автоматически загружаются в фреймворк;
  • функции общего назначения хранятся в ./modules/common/*;
  • исходники и скомпилированные файлы сохраняются в ./output/source/ и./output/compiled/ соответственно;
  • используемые пейлоадами внешние инструменты хранятся в ./tools/;
  • папка ./doc/* содержит документацию для фреймворка, сгенерированную утилитой pydoc.

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

Чтобы запустить Veil, необходимо воспользоваться командой $ ./Veil.py. При первоначальном запуске Veil выполнит код из ./config/update.py, который попытается определить установочные директории фреймворка, получить подробные сведения об ОС и другие важные параметры, а затем сохранить их в конфигурационный файл./config/veil.py, который также можно в случае необходимости отредактировать и вручную.

После этого попадаем в основное меню. В нем отображается количество загруженных модулей и список полезных команд. Достаточно набрать list, чтобы вывести список всех пейлоадов, list langs— чтобы вывести список доступных языков пейлоадов, либо list [язык], чтобы вывести список всех пейлоадов для конкретного языка. Также можно набратьlist и нажать Tab для автодополнения из списка доступных языков.

Рис. 1. Список доступных пейлоадов
Рис. 1. Список доступных пейлоадов

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

Рис. 2. Меню пейлоада Python/Base64 Encoded
Рис. 2. Меню пейлоада Python/Base64 Encoded

В нем представлены детальные сведения и обязательные опции для выбранной полезной нагрузки, а также доступные команды. В подразделе required options (обязательные опции) для каждой опции отображается ее имя, описание и значение по умолчанию — если оно отсутствует, то для генерации пейлоада придется самостоятельно ввести значение опции. Для этого достаточно набрать set [имя опции] и указать нужное значение.

После ввода обязательных опций для генерации пейлоада необходимо выполнить командуgenerate. Если в пейлоаде используется шелл-код, то попадаем в меню шелл-кода, где можно выбрать MsfVenom или произвольный шелл-код. При выборе произвольного шелл-кода его необходимо будет ввести в виде \x01\x02... без кавычек и переводов строки (\n). Если выбран MsfVenom, то по умолчанию будет предложен windows/meterpreter/reverse_tcp. Если нужен другой шелл-код, то надо будет ввести имя любого Windows шелл-кода, используя синтаксис MsfVenom (windows/...), либо выбрать его из списка с помощью Tab. После выбора шелл-кода будет предложено указать обязательные опции (пользуясь автозаполнением по Tab, можно подставить в опцию LHOST локальный IP, а в LPORT — 4444, номер порта, используемый по умолчанию в MSF). После ввода обязательных опций можно ввести значения дополнительных опций MsfVenom в формате OPTION=value.

По нажатию Enter будет сгенерирован шелл-код и собран пейлоад. После этого попадаем в меню вывода, где можно выбрать базовое имя для генерируемых файлов. Если пейлоад использует Python и была установлена опция compiletoexe, пользователю предоставляется выбор между pyinstaller (компиляцией в EXE-файл на Kali Linux) и генерацией исполняемых файлов с помощью py2exe. Последний экран отображает информацию о сгенерированном пейлоаде, включающую местоположение файлов с исходным и скомпилированным кодом. Нажатие любой клавиши вернет главное меню.

Разработка пейлоадов

В проекте Veil-Evasion большое внимание уделяется разработке расширяемого фреймворка, в который пользователи могут быстро и с легкостью интегрировать свои собственные методы уклонения от антивирусов, пользуясь при этом всеми возможностями фреймворка для ускорения разработки. Для того чтобы создать свой пейлоад, можно воспользоваться готовым шаблоном — ./modules/payloads/template.py:

Рис. 3. Готовый шаблон для создания своего пейлоада template.py
Рис. 3. Готовый шаблон для создания своего пейлоада template.py

Чтобы было понятней, что собой представляет пейлоад и как его создавать, кратко рассмотрим основные моменты. В начале каждого модуля находится строка-комментарий, в которой описывается механизм работы модуля, содержатся ссылки на используемые модули и имя автора. Далее следуют команды импортирования общих модулей Veil, содержащихся в./modules/common/*, в виде from modules.common import MODULE. Ниже перечислены некоторые базовые модули и методы, которые могут пригодиться при разработке собственных пейлоадов:

  • common.randomizer — различные методы рандомизации строк/переменных;
  • common.encryption — методы шифрования (AES-шифрование, подстановочные шифры и так далее);
  • common.crypters — средства для шифрования и обфускации отдельных языков (пока что доступен только Pyherion);
  • common.shellcode — наиболее часто используемый модуль, предназначенный для генерации шелл-кода;
  • config.veil — значения настроек; получаются в виде veil.CONFIG_SETTING. Импортируется командой from config import veil.

В методе __init__() обязательно нужно инициализировать следующие опции:

  • self.shortname — сокращенное имя, используемое для обращения к пейлоаду;
  • self.description — более подробное описание пейлоада, максимальная длина равна 12 предложениям;
  • self.language — язык, на котором написан пейлоад (на данный момент можно выбрать из python/cs/powershell/c#/native);
  • self.rating — оценка того, насколько хорошо метод обходит антивирусы (на данный момент устанавливается самим автором);
  • self.extension — расширение, с которым сохраняется файл пейлоада.

При необходимости можно использовать и другие опции:

  • self.shellcode = shellcode.Shellcode() — инициализируется, если требуется генерировать шелл-код;
  • self.notes — дополнительные примечания (например, инструкции по ручной компиляции), которые показываются пользователю при генерации;
  • self.required_options — опции пейлоада, для которых обязательно указывать значение. Записываются в формате {имя_опции : ["значение_по_умолчанию", "описание"]}. Если значение по умолчанию не указано, Veil автоматически запросит у пользователя значение опции перед генерацией пейлоада.

Метод generate() — это то место, где и творится все «волшебство». Шелл-код может быть создан внутренними методами Veil путем обращения к внутреннему объекту shellcode через вызов self.shellcode.generate(). При этом генерируется шелл-код по указанной пользователем спецификации. В строках 36 и 37 (см. рис. 3) демонстрируется использование криптора для шифрования исходного кода. В результате возвращается исходный код, который может быть использован в Veil.

Создав свой собственный модуль для генерации пейлоадов, можно сохранить его в любом месте внутри папки ./modules/payloads/. Любой модуль, помещенный в эту папку (или одну из ее дочерних), автоматически подгружается и становится доступен в основном интерфейсе Veil, а отдельные папки для каждого языка внутри данной директории существуют просто ради удобства.

 

Внедрение шелл-кода

Для инъекции шелл-кода в память Veil задействует два основных метода. Первый заключается в использовании нескольких API-вызовов с помощью MARKDOWN_HASH9960df83cc4b129c52232808951f3108MARKDOWN_HASH. Второй метод — преобразование к void-указателю.

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

  • MARKDOWN_HASH9960df83cc4b129c52232808951f3108MARKDOWN_HASH — выделяет область памяти, равную по объему нашему шелл-коду, и «помечает» ее как исполняемую. Выделение памяти этим методом гарантирует, что она будет исполняемой и не будет замечена механизмом DEP (Data Execution Prevention), если только в нем не выставлен максимально высокий уровень защиты;
  • MARKDOWN_HASHe78d61e1f3e89e48ca0996979e4ef1d2MARKDOWN_HASH — копирует шелл-код в выделенную вызовом MARKDOWN_HASH9960df83cc4b129c52232808951f3108MARKDOWN_HASH область исполняемой памяти;
  • MARKDOWN_HASHbf9b56f528e0386e4434013f123f8c13MARKDOWN_HASH — создает на атакуемой машине поток, в котором выполняется шелл-код, внедренный в память;
  • MARKDOWN_HASH1d0e7ad368f82232484c1707bb22d23bMARKDOWN_HASH — ждет, пока поток не завершит выполнение кода.

Преобразование к void-указателю — еще один широко распространенный и подробно задокументированный метод инъекции и выполнения шелл-кода. Чтобы было понятней, как он работает, рассмотрим следующий код:

unsigned char buffer[]= “\x…”;
int main(void) { ((void (*)())buffer)();}

В этом примере адрес массива buffer используется в качестве указателя на функцию, выполняющую шелл-код, который хранится в этом массиве. Хотя это, вероятно, уже давно самый популярный способ инъекции шелл-кода, у него есть недостаток: память, в которую попадает шелл-код, не всегда оказывается исполняемой (и, скорее всего, не будет таковой). Поэтому такой способ внедрения прекрасно работает на XP и предыдущих версиях Windows, но начатая в Windows Vista интеграция DEP существенно ограничивает его эффективность, а вероятность вызвать ошибку доступа становится гораздо выше.

Интеграция внешних инструментов

Команда Veil стремится к тому, чтобы максимально облегчить интеграцию любого метода обхода антивирусов в фреймворк. Еще на ранних стадиях разработки нас просили сделать возможной интеграцию внешних инструментов генерации. Благодаря модульной структуре пейлоадных модулей, мы с легкостью удовлетворили эту просьбу, что позволило реализовать поддержку инструментов от сторонних авторов (например, PESscrambler и Hyperion). Посмотреть, как это делается, можно в листинге ./modules/payloads/native/Hyperion.py.

Интеграции сторонних инструментов в Veil-фреймворк на примере Hyperion
Интеграции сторонних инструментов в Veil-фреймворк на примере Hyperion

Мы лишь отметим основные моменты:

  • в методе __init__() свойству self.extension нужно присвоить значение exe (строка 26);
  • следует инициализировать обязательную опцию original_exe (строка 29) примерно таким образом:
    self.required_options = {"original_exe" : ["", "имя exe-файла, пропускаемого через Hyperion"]}
    
  • внешние инструменты нужно поместить в ./tools/, а код для их вызова должен быть примерно таким, как в строке 43 (…cwd=veil.VEIL_PATH+"tools/hyperion/"…);
  • сгенерированный бинарный код будет содержаться в возвращаемом значении PayloadCode.

 

Языки

Первым поддерживаемым в Veil языком стал Python. Наши первоначальные исследования были направлены на поиск методов инъекции шелл-кода в память с помощью Python, с целью выявить среди них наиболее надежные. С тех пор мы исследовали и другие языки, пытаясь заложить фундамент для их использования обоими описанными выше методами инъекции шелл-кода. Наша цель — позволить пользователям расширять фреймворк под свои нужды и, в перспективе, использовать его как базис для своих собственных пейлоадов. Вот лишь часть нагрузок, которые способен генерировать Veil.

Python

  • FlatInjection — этот пейлоад не использует обфускацию шелл-кода. При просмотре исходного кода можно видеть шелл-код, который будет внедрен пейлоадом в память для последующего выполнения.
  • Base64 — получает от Veil шелл-код, преобразует его к Base64 и помещает его в исполняемый файл. В среде выполнения шелл-код декодируется, внедряется в память и выполняется.
  • Letter Substitution — получает от Veil шелл-код и заменяет его символы другими, делая его невалидным. При выполнении пейлоада символы невалидного кода заменяются символами оригинала, шелл-код внедряется и выполняется в памяти.
  • ARCEncrypted — сгенерированный Veil шелл-код шифруется ARC4 (Alleged RC4) со случайным ключом, а затем преобразуется в Base64. При выполнении пейлоада шелл-код декодируется из Base64, расшифровывается с помощью хранящегося в исполняемом файле ключа, внедряется в память и выполняется.
  • MeterHTTP[s]Contained — включает meterpreter.dll в файл Python и внедряет его, что позволяет обойтись без его скачивания из Сети.

С

  • VirtualAlloc/Void Pointer — реализация на Си техники FlatInjection.

C#

  • VirtualAlloc — реализация на C# техники FlatInjection.
  • b64SubVirtualAlloc — метод инъекции, в котором для обфускации шелл-кода используются кодирование base64 и рандомизированный подстановочный шифр.
 

PowerShell

  • VirtualAlloc — реализация на PowerShell техники FlatInjection.
  • PsexecVirtualAlloc — строит файл ресурсов Metasploit для удаленного выполнения VirtualAlloc на нескольких машинах с помощью утилиты PsExec.
  • DownloadVirtualAlloc — создает файл пейлоада для размещения на веб-сервере с указанным IP-адресом. PowerShell-пейлоад соединится с указанным веб-сервером, скачает с него пейлоад и выполнит его в памяти.

Крипторы

На данный момент единственный доступный в Veil криптор предназначен для пейлоадов на Python. Он появился, когда мы задались вопросом, как далеко мы сможем зайти с обфускацией кода на Python. Существуют AES, DES и другие прекрасные стандарты шифрования, но дешифрующие их куски кода остаются почти одинаковыми во всех генерируемых файлах. Как мы можем максимально рандомизировать файл пейлоада?

Воспользовавшись идеями превосходного криптора Hyperion PEcrypter, сделанного ребятами из nullsecurity, мы решили зашифровать код пейлоада целиком, используя AES-шифрование со случайным ключом. Поскольку это Python, а не, допустим, Си, нам пригодился AES-режим утилиты pycrypto, позволяющий шифровать код целиком. Вызвав Python-функцию exec(), мы можем выполнить сразу весь файл, предварительно динамически дешифровав его.

Однако и после первоначальной AES-обфускации в получившемся коде даже при беглом просмотре обнаруживается немало повторяющихся фрагментов. Мы решили эту проблему, преобразовав код к Base64 и завернув результат в еще один вызов exec(), чтобы как можно больше затруднить его чтение. Результат представляет собой единственную инструкцию exec(), вызывающую переименованный метод base64.b64decode().

Этот код прекрасно работает в обычном Python-файле, но при попытке запаковать его в EXE-файл с помощью pyinstaller или py2exe возникают проблемы. Поскольку мы динамически дешифруем целый файл во время выполнения, pyinstaller не может догадаться заранее, какие библиотеки (например, AES-библиотека pycrypto) нужны для файла. Наше решение заключается в том, чтобы удалить все директивы импорта из шифруемого файла, перемешать их и поместить в начало уже зашифрованного файла.

У нас получается набор рандомизированных import-директив, за которыми следует одна-единственная команда exec(), выполняющая преобразованную в Base64 и шифрованную AES-алгоритмом (со случайным ключом) текстовую строку, в которой содержится наш первоначальный код пейлоада. Таким образом, всякий раз при генерации мы получаем новый код, даже для одного и того же исходника (из кода, представленного на рис. 5, мы получаем представленный на рис. 6).

Рис. 5. Исходный код пейлоада
Рис. 5. Исходный код пейлоада
Рис. 6. Зашифрованный с помощью AES и Base64 код пейлоада
Рис. 6. Зашифрованный с помощью AES и Base64 код пейлоада

Код криптора содержится в ./modules/common/crypters.py и может использоваться всеми Python-пейлоадами Veil. Чтобы включить его, надо перед генерацией пейлоада установить в меню для опции use_pyherion значение Y. Независимая от фреймворка версия криптора находится в ./tools/pyherion.py. Она принимает на вход любой (ну, почти) файл на Python и выдает его зашифрованную версию. Мы надеемся и дальше изобретать новые «крипторы» по мере появления в Veil поддержки новых языков.

Заключение

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

С точки зрения этики мы склонны рассматривать появление фреймворка Veil и сопутствующих технологий в позитивном свете, и на то есть несколько причин. Во-первых, сообщество пентестеров как минимум на пять лет отстает от профессиональных создателей вредоносного ПО в вопросах шифрования и обфускации; нам еще очень далеко до эксплуатации 0-day-уязвимостей в антивирусах. Во-вторых, мы работаем на благо общества. Если уж мы, поначалу обладавшие только поверхностным знанием Python и фреймворка Metasploit, смогли собрать и выпустить первую версию Veil примерно за шесть месяцев, то можно быть уверенным, что и другие за это же время могли разработать свои методы (и наверняка это сделали) для достижения тех же целей. Сокрытие этих методов не поможет защитить общество от серьезных киберпреступников, которые по изощренности методов уже обогнали Veil на световые годы; все, чего мы этим достигнем, — оставим всех остальных в неведении относительно методов, с помощью которых можно обойти инструменты, используемые нами для защиты информации.

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

4 комментария

  1. 07.09.2014 at 21:08

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

  2. 08.09.2014 at 12:08

    «Производителям антивирусов следует поторопиться с переходом на более полные поведенческие эвристики обнаружения» — никуда они торопиться не будут. А будет как с некоторыми файлами PE, генерируемыми FASM, которые казнят без суда и следствия только за объединение нескольких секций в одну.

  3. 21.09.2014 at 22:21

    Интересная статья

  4. 22.09.2014 at 19:20

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

Оставить мнение

Check Also

Заметаем следы. Как уничтожить данные быстро и безвозвратно

Уничтожать улики и заметать следы — удел не самых законопослушных граждан. Мы же сегодня п…