Vander
Staff member
- Nov 10, 2019
- 468
- 1,158
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») - широко распространённый метод записи коротких данных в компьютерных файлах и телекоммуникационных протоколах.
- 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 использует систему связи с разделением каналов.
- Протокол TLV имеет несколько ограничений.
- Возможности могут быть расширены во время выполнения и загружены по сети.
- В 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.
В случае Meterpreter stage1 - это DLL с именем metsrv.
В случае 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кб.
Наиболее распространенный пример того, когда это не удается, - это случай, когда тестеры на проникновение находятся в средах с низкой пропускной способностью или высокой задержкой и предварительно сгенерировали поэтапный двоичный файл Meterpreter, который затем размещается за пределами машины злоумышленника. Цели загружают и вызывают этот двоичный файл, в результате чего злоумышленник получает оболочку Meterpreter на целевой машине.
Данные или временные затраты на загрузку metsrv, stdapi и priv для каждой отдельной оболочки становятся громоздкими или совершенно невозможными даже для небольшого количества оболочек. Для крупномасштабного сценария с помощью таких подходов, как обновления GPO или пакеты SCCM, одновременная обработка большого количества входящих соединений может быть достаточно плохой.
Добавьте к этому миксу три загрузки DLL, и вы получите рецепт утерянных оболочек и печали.
Бесступенчатый 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 завершает работу, используя соответствующий метод, в зависимости от того, что было выбрано.
- Загружает DLL расширения в память.
- Вычисляет размер библиотеки DLL.
- Записывает размер библиотеки DLL как 32-битное значение в конец буфера полезной нагрузки.
- Записывает все тело библиотеки DLL как есть в конец буфера полезной нагрузки.
Окончательный макет полезной нагрузки выглядит следующим образом:
Как использовать бесступенчатый Meterpreter?
Во-первых, у него другое название. Он следует тому же соглашению, что и все другие поэтапные и бесступенчатые полезные нагрузки:
Payload | Staged | Stageless |
---|---|---|
Reverse TCP | windows/meterpreter/reverse_tcp | windows/meterpreter_reverse_tcp |
Reverse HTTPS | windows/meterpreter/reverse_https | windows/meterpreter_reverse_https |
Bind TCP | windows/meterpreter/bind_tcp | windows/meterpreter_bind_tcp |
Reverse TCP IPv6 | windows/meterpreter/reverse_ipv6_tcp | windows/meterpreter_reverse_ipv6_tcp |
Чтобы создать полезную нагрузку с использованием одного из этих малышей, вы используете msfvenom так же, как и любую другую полезную нагрузку.
Чтобы создать бесступенчатую полезную нагрузку, содержащую только metsrv, мы делаем следующее:
Чтобы добавить расширения к полезной нагрузке, мы можем использовать параметр EXTENSIONS, который принимает список имен расширений, разделенных запятыми.
Также обратите внимание на отсутствие сообщения «Sending stage …»! Это показывает, что загрузка stage1 не произошла, поскольку она не нужна. Если вызванная полезная нагрузка также содержала stdapi и priv, то на этом этапе загрузки не происходило.
Если вы работаете с meterpreter_reverse_https, вы заметите, что когда появляются новые оболочки, они выглядят так же, как осиротевший экземпляр. Это ожидаемое поведение, потому что бесступенчатый сеанс не может и не будет выглядеть иначе, чем старый сеанс, который какое-то время не был связан с Metasploit.