День 2. Полезные нагрузки в Metasploit
Автор статьи никого не призывает к правонарушениям и отказывается нести ответственность за ваши действия. Вся информация предоставлена исключительно в ознакомительных целях. Все действия происходят на виртуальных машинах и внутри локальной сети автора. Спасибо!
Вчера открыл для себя сайт offensive-security.com Продолжим разбираться с Metasploit вместе с этим ресурсом.
Перейдем к разделу «USING EXPLOITS IN METASPLOIT» (Использование эксплойтов в Metasploit). Итак, если «заюзать» какой-то эксплойт, то становятся доступны две новые команды: exploit
, которую я уже использовал check
, которая, как я догадываюсь по названию, проверяет применимость выбранного эксплойта к целевой машине. Уже что-то. Можно не тыкать пальцем в небо.
Так же добавляются дополнительные команды к ключевому слову show
. Далее представлены примеры использования расширенной команды show. Мало что мне это дало, но хотя бы узнал о возможности проверять применимость эксплойта при помощи команды check
.
Полезная нагрузка относится к модулю эксплойта. Существует три модуля полезной нагрузки: одиночные, какие-то бывалые (мой английский не позволяет это понять) и стадийные. Полезная нагрузка представлена слэшем в имени полезной нагрузки. Что означает эта фраза я не понял. Далее, как я понял, слэш позиционирует стадии этой нагрузки. То есть windows/shell_bind_tcp
без стадий (или с одной стадией?), а windows/shell/bind_tcp
состоит из двух стадий.
А, вот дальше понятнее расписано про виды полезной нагрузки.
Одиночная нагрузка – это автономная полезная нагрузка (логично). Примером одиночной нагрузки является какое-то простое действие, например, открытие калькулятора или добавление нового пользователя в целевую систему. Далее написано, так как они автономные, то их можно перехватить другими обработчиками, например, netcat
.
Второй модуль Stagers, то ли стажер, то ли бывалый, не знаю как правильно он обзывается. Небольшая и надежная нагрузка, которая способна подстраиваться под ситуацию.
Третий модуль (этапы или стадии) – это все остальное. Нагрузка из нескольких нагрузок.
Чем дальше, тем интереснее (и непонятнее). Оказывается, эти три типа не единственные, на которые делится полезная нагрузка. И вот этот раздел об этом.
Встроенная (не стадийная) нагрузка. Является более стабильной, так как она монолитная, то есть содержит все в одном. Однако такие нагрузки поддерживают не все эксплойты. Здесь вроде все понятно (в теории).
Снова написано про непереводимый (мной) модуль Stager. Он работает вкупе со стадийными нагрузками.»
Следующий Meterpreter. Видимо сокращение от двух слов «мета интерпретатор». Является расширенной нагрузкой, работающей через внедрение dll. Звучит красиво, но пока я вообще не представляю, что это означает на практике и как это работает. Метапритер полностью находится в памяти целевой машине, тем самым не оставляет следов. Скрипты и плагины могут загружаться и выгружаться динамически по мере необходимости. Эта тема постоянно развивается.
PassiveX – это полезная нагрузка, которая может помочь обойти ограничения брандмауэра для исходящих соединений. Создается скрытый экземпляр Internet Explorer. Используя ActiveX, он связывается с атакующей машиной. (Возьму на заметку, интересно разобраться как это работает).
NONX – бит NX (невыполняемый) – это функция, встроенная в некоторые процессоры для предотвращения выполнения кода в определенных областях памяти. В Windows NX реализован как DEP. Именно эта полезная нагрузка позволяет обойти DEP (Предотвращение выполнения данных). Это аналогично с exec в PHP или что-то в этом роде? Грубо говоря, чтобы сторонний код не был случайно (или специально) запушен? Потом нужно разобраться с этим.
ORD – полезная нагрузка, которая работает на всех Windows, но имеет недостатки: подгружает ws2_32.dll в процессе и является менее стабильным.
IPV6 – полезная нагрузка для работы в сетях IPv6. Вероятно, пока не так актуальна.
REFLECTIVE DLL INJECTION – это метод, при котором стадийная полезная нагрузка внедряется в скомпрометированный хост-процесс, работающий в памяти, не оседая в жестком диске. Далее ссылаются на Стивена Фьюэра (создателя метода рефлексивного внедрения DLL).
Из всей этой информации я понял, что необходимо разбираться очень во многих вещах, чтобы понимать, как работают эксплойты. Радует, что могу проводить параллели с тем, с чем уже сталкивался. Но этого мало…
О, уже что-то более практическое. Сейчас, думаю, превратим красивые слова в практический опыт. Во время разработки эксплойта наверняка потребуется сгенерировать шелл-код (это двоичный исполняемый код, который может дать доступ к командной строке). Когда в Metasploit используется нагрузка, добавляются команды generate
, pry
и reload
. Далее в статье обещают рассказать про генерацию.
Юзаем полезную нагрузку:
msf6 > use payload/windows/shell_bind_tcp
Далее генерируем шелл-код:
msf6 payload(windows/shell_bind_tcp) > generate
Итак, сгенерировался шелл-код, который по умолчанию содержит символ «нулевой бит» (\x00), который может привести к проблемам при использовании некоторых эксплойтов. Поэтому используем ту же команду, но с другим ключом:
msf6 payload(windows/shell_bind_tcp) > generate -b '\x00'
Теперь нет нулевого байта, но размер шелл-кода увеличился. Стоит понимать, что возможности по генерации шелл-кода без использования определенных символов не безграничны. В таком случае появится следующая ошибка:
[-] Payload generation failed: No encoders encoded the buffer successfully.
Так же написано, что фреймворк выберет лучший кодировщик для выполнения задачи. Иногда необходимо выбрать конкретный кодировщик. Судя по выходным данным, у нас использовался кодировщик # Encoder: x86/shikata_ga_nai
. Чтобы посмотреть все кодировщики, введем команду show encoders.
О, есть знакомый для меня php/base64
. На сайте предлагается использовать другой кодировщик, для чего используется все та же команда и ключ -e:
msf6 payload(windows/shell_bind_tcp) > generate -e x86/nonalpha
Если кодировщик справится, то наша последовательность не будет содержать буквенно-цифровых значений. Но это значительно увеличивает размер. Чтобы сохранить последовательность в файл, необходимо использовать ключ -f
(так в документации, у меня -o
). Использование стандартной команды cat позволяет просмотреть содержимое файла.
Можно сделать несколько проходов кодирования. Для чего используется ключ -i
, чтобы, например, уклониться от антивируса. А, вот для чего это все делается. Это, наверное, в теории. На практике, думаю (уверен) антивирусы не такие примитивные.
При помощи команды generate
и ключа -o
можно изменить значения по умолчанию (номер порта и хост). Чтобы увидеть какие данные установлены, используем команду show options
.
msf6 payload(windows/shell_bind_tcp) > generate -o RHOST=192.168.56.101
По умолчанию, форматом вывода полезной нагрузки является язык Ruby, который я не знаю. Сейчас попробую перекодировать в Си формат, используя ключ -t
. Стоп. Какая-то несостыковка с документацией. Кажется, она немного устарела. Если обратиться к хэлпу. Необходимо использовать ключ -f
.
msf6 payload(windows/shell_bind_tcp) > generate -f c
Только сейчас понял, что генерируется не просто набор символов, а полноценный код. Это все из-за Ruby. Далее предлагается добавить NOP последовательность. Далее пошли какие-то специальные фразы. Дословно. NOP – это сани в начале полезной нагрузки. NOP – это локомотив полезной нагрузки, что ли?
Ключ -s
, указанный в документации тоже изменился на -P
(или наоборот, не знаю у кого версия новее). Если честно, у меня не получилось добавить NOP последовательность. Команда выполнилась, но шелл-код не изменился.
На этом про полезные нагрузки информация закончилась. Очень многое осталось непонятным. Возможно, далее станет яснее.
Подведем итог дня. Весь день ушел на полезные нагрузки. Как оказалось, их огромное множество (в смысле, их типов).