What's new

Article Meterpreter: Принцип работы. Stageless Payloads

Vander 0

Vander

Staff member
Nov 10, 2019
468
1,158
upgrade-normal-command-shell-metasploit-meterpreter.1280x600.jpg

Что такое Meterpreter?

Meterpreter - это гибкая, динамически расширяемая полезная нагрузка, которая использует стадии внедрения DLL в памяти и распространяется по сети во время выполнения. Он обменивается данными через промежуточный сокет и предоставляет комплексный клиентский Ruby API. В нем есть история команд, завершение вкладок, каналы и многое другое.

Серверная часть реализована на простом C и теперь скомпилирована с помощью MSVC, что делает ее в некоторой степени переносимой. Клиент может быть написан на любом языке, но Metasploit имеет полнофункциональный клиентский API Ruby.

Как работает Meterpreter?
  • Цель иницализирует начальную стадию. Обычно это bind, reverse, findtag, passivex и т. д.
  • Stager (нагрузка разбитая на части) загружает DLL с префиксом Reflective. Заглушка Reflective обрабатывает загрузку / внедрение библиотеки DLL.
  • Ядро Metepreter инициализируется, устанавливает соединение TLS / 1.0 через сокет и отправляет GET. Metasploit получает этот GET и настраивает клиента.
  • Наконец, Meterpreter загружает расширения. Он всегда будет загружать stdapi и priv, если модуль дает права администратора. Все эти расширения загружаются через TLS / 1.0 с использованием протокола TLV.
Примечание:
  • stdapi - Модуль позволяющий взаимодействовать с операционной системой цели путем выполнения команд.
  • priv - Модуль использующийся для повышения привилегий в целевой системе.
  • TLV - Tag-length-value (TLV, также «type-length-value») - широко распространённый метод записи коротких данных в компьютерных файлах и телекоммуникационных протоколах.
Основные полезные нагрузки Metasploit Framework:
  • Inline - это «целиковые» шеллкоды. Они большие, потому не всегда влезают в эксплойты
  • Stager - нагрузки, разделенные на части. В сплоит попадает небольшой шеллкод, в основном для установки соединения, остальное подгружается при подключении;
  • Ord - «заточенные» нагрузки. Маленькие по размеру, но привязанные к статическим адресам в памяти системной DLL’ки;
  • Bind - открытие порта и ожидание соединения;
  • Reverse - бэкконнект-шелл;
  • Findport - происходит поиск сокета, через который работал эксплойт, далее шелл открывается через него. Поиск осуществляется по номеру порта;
  • Findtag - аналогично предыдущему, только определение сокета ведется за счет прослушки всех доступных в ожидании прихода 4-байтового тэга от хакера.;
  • Exec, Download_exec, Up_exec - шеллкод на запуск команды, скачку/закачку и запуск;
  • Meterpreter - продвинутая нагрузка;
  • VNC - запускаем VNC-сервер у жертвы;
  • dllinjection - подгрузка DLL’ок в память процесса. Инжект DLL’ок есть двух видов; «metsvc» — целиком загружает meterpreter жертве и прописывает его как сервис; «PassiveX» — наш шелл выступает элементом ActiveX.
  • NoNX - шеллкоды с обходом механизма защиты памяти DEP;
  • DNS - те, что могут работать по именам хостов, а не по IP;
  • HTTPS - шелл, который общается по шифрованному HTTPS-протоколу.
Цель разработки Meterpreter

Скрытность

  • Meterpreter полностью находится в памяти и ничего не записывает на диск.
  • Никаких новых процессов не создается, поскольку Meterpreter внедряется в скомпрометированный процесс и может легко переноситься на другие запущенные процессы.
  • По умолчанию Meterpreter использует шифрованную связь.
  • Всё это в целом отставляет ограниченные форензик артефакты и импакты на целевой системе.
Мощность
  • Meterpreter использует систему связи с разделением каналов.
  • Протокол TLV имеет несколько ограничений.
Расширяемость
  • Возможности могут быть расширены во время выполнения и загружены по сети.
  • В Meterpreter можно добавлять новые функции без необходимости его перестраивания.
Бесступенчатые (цельные) полезные нагрузки Meterpreter.

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

Что такое поэтапная полезная нагрузка?

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

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

В терминах Metasploit эта полезная нагрузка называется reverse_tcp, а второй этап (stage1) может быть стандартной командной оболочкой или чем-то более сложным, например, оболочкой Meterpreter или сеансом VNC. Существуют и другие поэтапные параметры, такие как reverse_https и bind_tcp, оба из которых предоставляют разные варианты транспорта для открытия дверного проема для второго этапа.

Эксплуатация (recap) с помощью поэтапной нагрузки Meterpreter

Поэтапный (Staged) Meterpreter - это Meterpreter в том виде, в каком мы его знаем сейчас. Каждый раз, когда мы устанавливаем PAYLOAD windows/meterpreter/…, мы просим Metasploit подготовить полезную нагрузку, которая разбивается на два этапа, второй из которых дает нам сеанс Meterpreter. Для тех, кто не знаком с процессом эксплуатации с поэтапной полезной нагрузкой, давайте посмотрим, что происходит, когда мы используем эту полезную нагрузку для эксплуатации машины Windows с помощью ms08_067_netapi.

На следующем изображении представлены две машины: атакующий и цель. Первый запускает Metasploit с эксплойтом ms08_067_netapi, настроенным на использование поэтапной полезной нагрузки Meterpreter, для которой для stage0 установлено значение reverse_tcp с использованием порта 4444.

Последний является экземпляром Windows, на котором запущена уязвимая реализация SMB, прослушивающая порт 445.

Screen Shot 2015-03-25 at 4.07.36 pm.png

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

Screen Shot 2015-03-25 at 4.08.23 pm.png

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

Screen Shot 2015-03-25 at 4.08.48 pm.png

На этом этапе злоумышленник имеет контроль над выполнением в службе SMB, но на самом деле не имеет возможности сделать с ней что-то еще из-за ограничения размера. Когда выполняется stage0 (reverse_tcp), он подключается обратно к злоумышленнику через требуемый порт, который готов и ожидает с stage1.

В случае Meterpreter stage1 - это DLL с именем metsrv.

Screen Shot 2015-03-25 at 5.51.44 pm.png

Затем через обратное соединение на целевой компьютер отправляется библиотека metsrv. Вот что происходит, когда мы видим сообщение «Sending stage ..» в msfconsole.

Screen Shot 2015-03-25 at 5.52.54 pm.png

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

Screen Shot 2015-03-25 at 4.10.09 pm.png

Как только stage1 находится в памяти, stage0 передает ему управление, просто перескакивая в то место, куда была записана полезная нагрузка.

В случае metsrv первые 60 (ish) байтов представляют собой шелл-код, который также похож на действительный заголовок DOS. Этот шелл-код при выполнении использует Reflective DLL Injection для переназначения и загрузки metsrv в память таким образом, чтобы он мог правильно функционировать как обычная DLL без записи на диск или регистрации в хост-процессе. Затем он вызывает DllMain () для этой загруженной библиотеки DLL, и Meterpreter, который мы знаем и любим, вступает во владение.

Отсюда MSF выдвигает две библиотеки DLL расширения Meterpreter: stdapi и priv. Оба они также загружаются рефлексивно так же, как и исходная библиотека metsrv. На этом этапе Meterpreter готов выполнять ваши команды.

Что не так с Staged Meterpreter?

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

Для примера был запущен следующий сценарий:
  • stage0: большой буфер мусора плюс примерно 350 байт шелл-кода.
  • stage1: metsrv DLL примерно 755кб.
  • stage2: DLL stdapi примерно 370 КБ.
  • stage3: Priv DLL примерно 115кб.
Это весит примерно 1240 КБ! Немалая сумма, особенно для тех, кто не в локальной сети.

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

Данные или временные затраты на загрузку metsrv, stdapi и priv для каждой отдельной оболочки становятся громоздкими или совершенно невозможными даже для небольшого количества оболочек. Для крупномасштабного сценария с помощью таких подходов, как обновления GPO или пакеты SCCM, одновременная обработка большого количества входящих соединений может быть достаточно плохой.

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

Screen Shot 2015-03-25 at 4.04.35 pm.png

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

Бесступенчатый Meterpreter - это именно то, что вам нужно. Это двоичный файл, который включает в себя все необходимые части Meterpreter, а также все необходимые расширения, объединенные в одно целое.

Как выглядит бесступенчатый Meterpreter?

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

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

Чтобы прояснить это, давайте посмотрим на процесс.

При создании полезной нагрузки Metasploit сначала считывает копию библиотеки metsrv DLL в память. Затем он перезаписывает заголовок DOS библиотеки DLL выбранным шелл-кодом, который выполняет следующие действия:
  • Выполняет простую процедуру GetPC.
  • Вычисляет расположение функции ReflectiveLoader () в metsrv.
  • Вызывает функцию ReflectiveLoader () в metsrv.
  • Вычисляет место в памяти, которое указывает начало списка предварительно загруженных расширений. Это значение - просто местоположение, которое следует сразу за концом metsrv.
  • Вызывает DllMain () для metsrv, передавая DLL_METASPLOIT_ATTACH вместе с указателем на список расширений. Здесь на смену приходит metsrv.
  • Когда metsrv завершается, загрузчик снова вызывает DllMain () с DLL_METASPLOIT_DETACH вместе с выбранным идентификатором EXITFUNC. Здесь metsrv завершает работу, используя соответствующий метод, в зависимости от того, что было выбрано.
С помощью этой заглушки шелл-кода, подключенной к заголовку DOS, Metasploit добавляет весь двоичный большой двоичный объект в буфер полезной нагрузки в памяти, а затем выполняет итерацию по списку выбранных расширений. Для каждого указанного расширения Metasploit выполняет следующие действия:
  • Загружает DLL расширения в память.
  • Вычисляет размер библиотеки DLL.
  • Записывает размер библиотеки DLL как 32-битное значение в конец буфера полезной нагрузки.
  • Записывает все тело библиотеки DLL как есть в конец буфера полезной нагрузки.
По достижении конца списка расширений последнее, что записывается в буфер полезной нагрузки, - это 32-битное представление 0 (NULL), которое указывает, что список расширений завершен. Это значение NULL - это то, что metsrv будет искать при итерации по списку расширений, чтобы знать, когда остановиться.

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

Screen Shot 2015-03-25 at 5.14.34 pm.png

Эту полезную нагрузку можно встроить в exe-файл, закодировать, использовать в эксплойте (при условии, что там есть место!) И неизвестно во что еще! Важно то, что теперь у нас есть все биты, которые нам нужны в одной полезной нагрузке.

Как использовать бесступенчатый Meterpreter?

Во-первых, у него другое название. Он следует тому же соглашению, что и все другие поэтапные и бесступенчатые полезные нагрузки:

PayloadStagedStageless
Reverse TCPwindows/meterpreter/reverse_tcpwindows/meterpreter_reverse_tcp
Reverse HTTPSwindows/meterpreter/reverse_httpswindows/meterpreter_reverse_https
Bind TCPwindows/meterpreter/bind_tcpwindows/meterpreter_bind_tcp
Reverse TCP IPv6windows/meterpreter/reverse_ipv6_tcpwindows/meterpreter_reverse_ipv6_tcp

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

Чтобы создать бесступенчатую полезную нагрузку, содержащую только metsrv, мы делаем следующее:

Screen Shot 2015-03-25 at 3.57.36 pm.png

Здесь мы используем двоичный файл программы Immunity Debugger, потому что он имеет достаточно большой раздел .text.

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

Screen Shot 2015-03-25 at 3.58.30 pm.png

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

Screen Shot 2015-03-25 at 4.03.31 pm.png

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

Также обратите внимание на отсутствие сообщения «Sending stage …»! Это показывает, что загрузка stage1 не произошла, поскольку она не нужна. Если вызванная полезная нагрузка также содержала stdapi и priv, то на этом этапе загрузки не происходило.

Если вы работаете с meterpreter_reverse_https, вы заметите, что когда появляются новые оболочки, они выглядят так же, как осиротевший экземпляр. Это ожидаемое поведение, потому что бесступенчатый сеанс не может и не будет выглядеть иначе, чем старый сеанс, который какое-то время не был связан с Metasploit.
 
Top Bottom