‘Generate’ payloads для Metasploit

Во время разработки эксплоита вам наверняка необходимо генерировать shell код использующийся в вашем эксплоите. В Metasploit payloads может быть сгенерирована изнутри msfconsole. Когда вы используете определенный payload, Metasploit добавляет команды ‘generate‘, ‘pry‘ и ‘reload‘. Generate станет основным центром данной статьи, изучения использования Metasploit.

Используем генерирование в Metasploit
Dante

 

Давайте начнем с рассмотрения различных опций команды ‘ganerate’, запустим его с ‘-h’.

Команда -h с generate
Dante

 

Для генерации shell кода без каких-либо опций, просто выполните команду ‘generate’.

Генерируем shell код без параметров
Dante

 

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

Пример кода выше содержит практически универсальный плохой символ, нулевой байт (\x00). Предоставленные некоторые эксплоиты позволяют его использовать, но не многие. Давайте сгенерируем, тот же shell код, только на этот раз мы будем давать Metasploit инструкции для удаления этого нежелательного байта.

Чтобы этого достичь, мы задаем команду ‘ganerate’ за которой следует ‘-b’ с сопровождающими байтами которым мы хотим отказать в процессе генерации.

Отказываем байтам в генерации
Dante

 

Глядя на этот shell код, можно легко увидеть что по сравнению с ранее генерируемым shell, нулевые байты были успешно удалены. Это дает нам нулевой байт свободным payload. Так же мы видим иные существенные различия связанные с насильным изменением генерации.

Одним из различий является общий байт размер shell кодов. В предыдущей интеграции размер был 328 байт, в новом shell коде он на 27 байт больше.

Различия длины shell кода
Dante

 

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

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

При указании нежелательных символов, framework будет использовать лучший кодер для работы. Был использован кодер x86/shikata_ga_nai, когда был ограничен нулевой байт, во время генерации кода. Если мы добавим еще несколько нежелательных символов, может быть использован иной символ для выполнения той же самой задачи. Давайте добавим еще несколько байт в список и посмотрим, что происходит.

Удаляем генерацию еще нескольких байт из shell
Dante

 

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

 

Payload генерация не удалась

Имея возможность генерировать shell код без использования определенных символов, является одной из огромных возможностей предлагаемых этим framewark. Это совсем не означает что они безграничны.

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

Ограничили кодером много байт
Dante

 

Это подобно тому как удалить много букв из алфавита и попросить кого-то написать полное предложение. Иногда он просто не сможет этого сделать.

 

Использование кодера во время генерации payloads

Как упоминалось ранее, framework выберет лучший доступный кодер при генерации payload. Однако бывают случаи когда необходимо использовать определенный тип кодера независимо от того что думает Metasploit. Представьте себе, что эксплоит выполнится успешно только при условии что он не содержит буквенно цифровых символов. Кодер ‘shikata_ga_nai‘ в данном случае окажется бесполезен, так как он использует довольно много символов для кодирования. Посмотрев список кодеров мы видим что кодер ‘x86/nonalpha‘ присутствует.

Список кодеров
Dante

 

Давайте заново привяжем sheel payload но в этот раз скажем framework использовать кодер ‘nonalpha‘. Мы делаем это при помощи переключения с помощью ‘-e‘ и последующим именем кодера, как показано в списке ниже.

Генерируем с кодером nonalpha
Dante

 

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

Наша следующая опция в списке это переключатель ‘-f‘. Она дает нам возможность сохранить вывод сгенерированного payload в фаил вместо отображения его на экране. Как всегда он следует за командой ‘generate‘ с путем файла.

Сохраняем вывод payload в фаил
Dante

 

Используя команду ‘cat‘ мы можем увидеть payload который сохранили в нашем файле. Как мы видим мы так же можем использовать более чем одну опцию при генерации shell кода.

 

Генерация payload с несколькими потоками

Следующий переключатель в нашем списке опций это переключатель итерации ‘-i‘. В двух словах он говорит framework, сколько проходов кодирования он должен сделать прежде чем производить окончательную payload. Одной из причин для этого может быть стелс или анти-вирус уклонение. Более подробно антивирусное уклонение я буду рассматривать в ином разделе MSFU.

Итак давайте сравним наш shell payload сгенерированный с использованием 1 итерации по сравнению с таким же shell кодом с 2 итерации.

Генерация payload с одной итерацией
Dante

 

Генерируем payload с двумя итерациями
Dante

 

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

производим генерацию с пятью итерациями
Dante

 

Изменения являются существенными при сравнении со всеми предыдущими выводами. Он несколько больше и отсутствуют схожие байты рядом. Который делает в теории этот вариант нашего payload наименее склонным к обнаружению.

Мы потратили много времени, генерируя shell код с самого начала от значения по умолчанию. В случае привязки shell по умолчанию прослушивает порт 4444. Часто это необходимо изменить. Мы можем это сделать при помощи переключателя ‘-o‘ перед значением которое мы хотим изменить. Давайте посмотрим какие опции мы можем изменить для этого payload. Из msfconsole мы задаем команду ‘show options‘.

Просмотр возможных параметров для payload
Dante

 

По умолчанию наш shell прослушивает порт ‘4444‘ и выход функции ‘process‘. Мы изменим этот порт на ‘1234‘ и выход функции ‘seh‘ используя ‘-o‘. Синтаксис переменная=значение разделенные запятой между каждой опцией. В этом случае оба порта прослушиваются и выход функции изменяется следующим синтаксисом ‘LPORT=1234,EXITFUNC=seh’.

Меняем порт на 1234
Dante

 

Payload генерируется используя NOP Sled

Наконец давайте взглянем NOP sled длину и вывод формата опций. Когда генерируем payloads по умолчанию формат вывода дается в ‘ruby‘. Хотя ruby язык является чрезвычайно мощным и популярным, это не все коды. У нас есть возможность сообщить framework, для того чтобы дать наш payload в различных форматах кодирования таких как Perl, C и Java, для примера. Добавить NOP sled можно так же в начале при генерации shell кода.

Сначала давайте посмотрим на несколько различных выходных форматов и посмотрим как используется переключатель ‘-t‘. Как и все иные опции, все что необходимо сделать это ввести переключатель с последующим именем формата, как это показано в меню справки.

Генерируем payload командой
Dante

 

Производим generate в языке c
Dante

 

Генерируем payload на java
Dante

 

Глядя на вывод из различных языков программирования мы видим что каждый вывод придерживается из соответствующего языкового синтаксиса. Хеш ‘#‘ используется для комментариев в Ruby, но в C он заменен косой чертой и астериском ‘/*‘. Глядя на все три вывода, массивы правильно объявляют формат выбранного языка. Что делает его готовым для копирования и вставки в ваш скрипт.

Добавление NOP sled (нет операции или следующей операции)осуществляется с переключателем ‘-s‘, перед числом NOPs. Это добавит sled в начале вашего payload. Имейте ввиду что чем больше sled тем больше будет shell код. Поэтому добавление 14 NOPs добавит 14 байт к общему размеру.

Генерируем payload командой
Dante

 

Добавление NOP sled к generate
Dante

 

Желтым цветом выделен наш NOP sled в начале payload. Сравнивая следующие строки в shell коде выше мы видим что они точно такие же. Всего как и ожидалось стало на 14 байт больше.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *