• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Генерация полезных нагрузок (Payload)

Привет, в этой статье я продолжу освещать тему полезных нагрузок (Payloads) и их применение. В первой части мы ознакомились с типами Payloads, в этой разберемся с их созданием. В качестве примера будем использовать Metasploit Framework и Kali Linux в качестве ОС. В Metasploit мы можем, создать полезную нагрузку используя msfconsole.

> msfconsole

upload_2016-12-10_21-32-19.png


Когда мы используем пайлоад (use), Metasploit при вводе команды help покажет доступные действия:

upload_2016-12-10_21-33-5.png


> help

upload_2016-12-10_21-34-7.png


Посмотрим возможные опции, которые доступны, при использовании команды ‘generate’:

> generate -h


upload_2016-12-10_21-36-11.png


Для создания шеллкода, без каких либо опций, выполним команду ‘generate’:

> generate

upload_2016-12-10_21-36-38.png


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

Для этого выполняем команду ‘generate –b’ это своего рода переключатель байтов, которые мы хотим исключить в процессе создания.

> generate –b ‘\x00’


upload_2016-12-10_21-37-23.png


Глядя на этот шеллкод в глаза бросаются два существенных различия, первое, предыдущий имел размер 328 байт, новый – 355 байт. Так же, были успешно исключены нулевые байты.

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

Теперь про кодирование, по умолчанию Metasploit будет использовать лучший кодер для выполнения этой задачи. Кодер будет отвечать за удаление нежелательных байтов, при использовании переключателя «-b». Исходя их этого, как только фреймворк находит плохие символы, подключится кодер. Таковым является ‘x86/shikata_ga_nai’, он выполнит свою работу в отношении помеченных плохих байтов. Если мы добавим еще плохих байтов в список, другой кодер должен справиться с этой задачей так же.

Попробуем на практике, добавим в список еще несколько байт и посмотрим, что произойдет:
> generate -b '\x00\x44\x67\x66\xfa\x01\xe0\x44\x67\xa1\xa2\xa3\x75\x4b'
upload_2016-12-10_21-39-3.png


Видим, что на этот раз в работу включился другой кодер - Fnstenv_mov, так как, вероятно Shikata не смог справится с поставленной задачей.

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

> generate -b '\x00\x44\x67\x66\xfa\x01\xe0\x44\x67\xa1\xa2\xa3\x75\x4b\xFF\x0a\x0b\x01\xcc\6e\x1e\x2e\x26'

upload_2016-12-10_21-40-13.png


Эта задача не может быть выполнена из-за абсурдности самих условий.

Выбор кодера.

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

> show encoders

upload_2016-12-10_21-40-48.png


Теперь, используя приведенные ниже опции, выберем нужный нам кодер. К примеру x86/nonalpha:

> generate –e x86/nonalpha


upload_2016-12-10_21-41-33.png


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

Следующая опция, которую мы рассмотрим это возможность импортировать шеллкод в файл, а не вывод его на экран консоли. Используем флаг –f:

> generate -b '\x00' -e x86/shikata_ga_nai -f /root/ shell.txt

upload_2016-12-10_21-42-20.png


Получаем код в файле:

upload_2016-12-10_21-42-43.png


Создание полезных нагрузок с множеством проходов.

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

> generate -b '\x00' -i 2 (2 – количество проходов)

upload_2016-12-10_21-43-20.png


И в 2 итерации:

upload_2016-12-10_21-43-42.png


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

upload_2016-12-10_21-44-8.png


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

Теперь обратим внимание на другие опции, которые Metasploit может нам позволить применить к нашим нагрузкам.

> show options

upload_2016-12-10_21-45-1.png


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

> generate -o LPORT=1234,EXITFUNC=seh -b '\x00' -e x86/shikata_ga_nai

upload_2016-12-10_21-45-49.png


И в конце рассмотрим NOP slide и опции формата вывода.

Про NOP slide можно прочитать тут -

При создании полезной нагрузки по умолчанию используется язык Ruby, хоть он и гибкий и мощный, но не универсальный. Metasploit дает возможность изменить выходной формат данных используя флаг –t. Нам доступны Perl, C, Java к примеру. Проверим это следующей командой:

> generate –t c


upload_2016-12-10_21-46-35.png


> generate –t java

upload_2016-12-10_21-47-8.png


Python тоже присутствует:

> generate –t python

upload_2016-12-10_21-47-40.png


Глядя на результат для различных языков программирования, мы видим, что каждый выход придерживается синтаксиса соответствующего языка. Хэш '#' используется для комментариев в Ruby, но в C он заменен звездочкой с косой чертой, для Python - #. Это делает наш шеллкод готовым к вставке в скрипт.

Добавление NOP (No Operation or Next Operation) осуществляется с помощью флага '-s' с последующим числом NOP. NOP добавляется в начале нашей полезной нагрузки. Имейте в виду, чем больше NOP тем больше будет выходной размер кода. Таким образом, добавив 10 NOP, мы добавим 10 байт к общему размеру.

> generate

upload_2016-12-10_21-48-31.png


> generate –s 10

upload_2016-12-10_21-49-13.png


Результат без NOP байтов:

upload_2016-12-10_21-49-36.png


Результат с добавленными 10 байтами NOP:

upload_2016-12-10_21-49-51.png


Полезная нагрузка, как и ожидалось, увеличилась в размере на 10 байт.

На этом не все, будем учиться работать с шеллкодами далее.

Спасибо за внимание.
 

Вложения

  • upload_2016-12-10_21-40-58.png
    upload_2016-12-10_21-40-58.png
    83,2 КБ · Просмотры: 410
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!