Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В хакерства , Шеллкод небольшой кусок кода используется в качестве полезной нагрузки в эксплуатации софтверной уязвимости . Он называется « шелл- кодом », потому что обычно запускает командную оболочку, из которой злоумышленник может управлять взломанной машиной, но любой фрагмент кода, выполняющий аналогичную задачу, можно назвать шелл- кодом. Поскольку функция полезной нагрузки не ограничивается простым порождением оболочки, некоторые предположили, что имя шеллкода недостаточно. [1] Однако попытки заменить этот термин не получили широкого распространения. Шелл- код обычно пишется в машинном коде .

Понимание шелл-кода и, в конечном итоге, написание собственного - это важный навык по многим причинам . [ необходима цитата ] Самая важная задача при создании шелл-кода - сделать его маленьким и исполняемым . При создании шелл-кода он должен быть как можно меньше, чтобы его можно было использовать в максимально разнообразных ситуациях. [2] Интересный факт о шеллкоде заключается в том, что это в равной степени искусство и наука. [ необходима цитата ]В ассемблерном коде одну и ту же функцию можно выполнять множеством способов. Некоторые коды операций короче других, и хорошие авторы шелл-кода используют эти небольшие коды операций. [3] Некоторые достигли минимально возможного размера при сохранении стабильности. [4]

Типы шелл-кода [ править ]

Шелл-код может быть локальным или удаленным , в зависимости от того, дает ли он злоумышленнику контроль над машиной, на которой он работает (локальный), или над другой машиной по сети (удаленной).

Местный [ править ]

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

Удаленный [ править ]

Удаленный шелл-код используется, когда злоумышленник хочет атаковать уязвимый процесс, запущенный на другом компьютере в локальной сети , интрасети или удаленной сети . В случае успешного выполнения шелл-код может предоставить злоумышленнику доступ к целевой машине по сети. Удаленные шеллкоды обычно используют стандартные соединения сокетов TCP / IP, чтобы позволить злоумышленнику получить доступ к оболочке на целевой машине. Такой шелл-код можно разделить на категории в зависимости от того, как установлено это соединение: если шелл-код устанавливает соединение, он называется «обратная оболочка» или шелл - код обратного соединения, потому что шелл -код подключается обратно.к машине злоумышленника. С другой стороны, если злоумышленник устанавливает соединение, шелл-код называется привязкой, потому что шелл-код привязывается к определенному порту на машине жертвы. Существует особый шелл-код с именем bindshell random port, который пропускает часть привязки и прослушивает случайный порт, доступный операционной системой . Из-за этого случайный порт bindshell стал самым маленьким и стабильным шелл-кодом bindshell для x86_64, доступным на сегодняшний день. Третий, гораздо менее распространенный тип - повторное использование сокетов.шеллкод. Этот тип шелл-кода иногда используется, когда эксплойт устанавливает соединение с уязвимым процессом, которое не закрывается до запуска шелл-кода. Затем шеллкод может повторно использовать это соединение для связи со злоумышленником. Шелл-код повторного использования сокета является более сложным, поскольку шелл-код должен выяснить, какое соединение использовать повторно, а на машине может быть открыто много соединений. [5]

Межсетевой экран может быть использован для обнаружения исходящих соединений , сделанных подключения обратного шеллкода, а также входящих соединений , сделанных bindshells. Поэтому они могут предложить некоторую защиту от злоумышленника, даже если система уязвима, не позволяя злоумышленнику подключиться к оболочке, созданной шелл-кодом. Это одна из причин, по которой иногда используется повторное использование шелл-кода сокета: он не создает новых соединений и, следовательно, его сложнее обнаружить и заблокировать.

Загрузите и выполните [ редактировать ]

Загрузка и выполнение - это тип удаленного шелл-кода, который загружает и выполняет некоторую форму вредоносного ПО в целевой системе. Этот тип шелл-кода не порождает оболочку, а скорее инструктирует машину загрузить определенный исполняемый файл из сети, сохранить его на диск и выполнить. В настоящее время он обычно используется в атаках с загрузкой по инерции, когда жертва посещает вредоносную веб-страницу, которая, в свою очередь, пытается запустить такую ​​загрузку и выполнить шелл-код, чтобы установить программное обеспечение на машину жертвы. Разновидность этого типа Shellcode загрузки и нагрузки в библиотеке . [6] [7] Преимущества этого метода заключаются в том, что код может быть меньше, что он не требует, чтобы шеллкод порождал новый процесс в целевой системе, и что шеллкоду не нужен код для очистки целевого процесса, поскольку это может быть сделано с помощью библиотека загружена в процесс.

Постановочный [ править ]

Когда объем данных, которые злоумышленник может ввести в целевой процесс, слишком ограничен для непосредственного выполнения полезного шелл-кода, его можно выполнять поэтапно. Сначала выполняется небольшой фрагмент шелл-кода (этап 1). Затем этот код загружает больший фрагмент шелл-кода (этап 2) в память процесса и выполняет его.

Охота за яйцами [ править ]

Это еще одна форма поэтапного шелл-кода, которая используется, если злоумышленник может внедрить шелл-код большего размера в процесс, но не может определить, где в процессе он окажется. Небольшой шелл- код для поиска яиц вводится в процесс в предсказуемом месте и выполняется. Затем этот код ищет в адресном пространстве процесса более крупный шелл-код ( яйцо ) и выполняет его. [8]

Омлет [ править ]

Этот тип шелл-кода похож на шелл- код охоты за яйцами , но ищет несколько небольших блоков данных ( яйца ) и рекомбинирует их в один больший блок ( омлет ), который впоследствии выполняется. Это используется, когда злоумышленник может ввести в процесс только несколько небольших блоков данных. [9]

Стратегия выполнения шеллкода [ править ]

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

Кодировка шелл-кода [ править ]

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

  • Оптимизация дизайна и реализации для уменьшения размера шелл-кода.
  • Модификации реализации, чтобы обойти ограничения в диапазоне байтов, используемых в шеллкоде.
  • Самомодифицирующийся код, который изменяет несколько байтов своего собственного кода перед их выполнением, чтобы воссоздать байты, которые обычно невозможно внедрить в процесс.

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

Процентное кодирование [ править ]

Эксплойты, предназначенные для браузеров, обычно кодируют шелл-код в строке JavaScript с использованием процентного кодирования , кодирования escape-последовательностей «\ uXXXX» или кодировки сущности . [10] Некоторые эксплойты также затемняют закодированную строку шелл-кода, чтобы предотвратить обнаружение IDS .

Например, в архитектуре IA-32 вот как NOPбудут выглядеть две (нерабочие) инструкции, сначала не закодированные:

90 NOP90 NOP

Эта инструкция используется на слайдах NOP .

Шелл-код без нулей [ править ]

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

Чтобы создать шелл-код без нулей из шелл-кода, который содержит нулевые байты, можно заменить машинные инструкции, содержащие нули, на инструкции, которые имеют тот же эффект, но не содержат нулей. Например, на архитектуре IA-32 можно было бы заменить эту инструкцию:

B8 01000000 MOV EAX, 1 // Установить регистр EAX на 0x000000001

который содержит нули как часть литерала ( 1 расширяется до 0x00000001 ) с помощью следующих инструкций:

33C0 XOR EAX, EAX // Установите регистр EAX на 0x00000000040 INC EAX // Увеличиваем EAX до 0x00000001

которые имеют тот же эффект, но требуют меньше байтов для кодирования и не содержат нулей.

Буквенно-цифровой и печатаемый шелл-код [ править ]

В определенных обстоятельствах целевой процесс будет фильтровать любой байт введенного шелл-кода, который не является печатным или буквенно-цифровым символом. В таких условиях набор инструкций, которые можно использовать для написания шелл-кода, становится очень ограниченным. Решение этой проблемы было опубликовано Риксом в Phrack 57 [11].в котором он показал, что можно превратить любой код в буквенно-цифровой. Часто используется методика создания самомодифицирующегося кода, поскольку это позволяет коду изменять свои собственные байты, чтобы включить байты за пределы обычно разрешенного диапазона, тем самым расширяя диапазон инструкций, которые он может использовать. Используя этот трюк, можно создать самомодифицирующийся декодер, который изначально использует только байты из разрешенного диапазона. Кодируется основной код шелл-кода, также только с использованием байтов в разрешенном диапазоне. Когда выходной шелл-код запущен, декодер может изменить свой собственный код, чтобы иметь возможность использовать любую инструкцию, которая требуется для правильного функционирования, а затем продолжает декодировать исходный шелл-код. После декодирования шелл-кода декодер передает ему управление, поэтому он может выполняться в обычном режиме.Было показано, что можно создать произвольно сложный шелл-код, который выглядит как обычный текст на английском языке.[12]

Устойчивый к Unicode шелл-код [ править ]

Современные программы используют строки Unicode для интернационализации текста. Часто эти программы преобразуют входящие строки ASCII в Unicode перед их обработкой. Строки Unicode, закодированные в UTF-16, используют два байта для кодирования каждого символа (или четыре байта для некоторых специальных символов). Когда строка ASCII ( в общем, Latin-1 ) преобразуется в UTF-16, нулевой байт вставляется после каждого байта в исходной строке. Обскоу доказал в Phrack 61 [13].что можно написать шелл-код, который может успешно работать после этого преобразования. Существуют программы, которые могут автоматически кодировать любой шелл-код в буквенно-цифровой, устойчивый к UTF-16 шелл-код, основанный на том же принципе, что и небольшой самомодифицирующийся декодер, который декодирует исходный шелл-код.

Платформы [ править ]

Большая часть шелл- кода написана в машинном коде из-за низкого уровня, на котором эксплуатируемая уязвимость предоставляет злоумышленнику доступ к процессу. Поэтому шелл-код часто создается для одной конкретной комбинации процессора , операционной системы и пакета обновления , называемой платформой . Для некоторых эксплойтов из-за ограничений, накладываемых на шелл-код целевым процессом, должен быть создан очень специфический шелл-код. Однако не исключено, что один шеллкод может работать с несколькими эксплойтами, пакетами обновления, операционными системами и даже процессорами. [14]Такая универсальность обычно достигается за счет создания нескольких версий шелл-кода, предназначенных для различных платформ, и создания заголовка, который разветвляется на правильную версию для платформы, на которой выполняется код. При выполнении код ведет себя по-разному для разных платформ и выполняет правильную часть шелл-кода для платформы, на которой он запущен.

Анализ шелл-кода [ править ]

Шелл-код не может быть выполнен напрямую. Чтобы проанализировать, что пытается сделать шелл-код, его необходимо загрузить в другой процесс. Один из распространенных методов анализа - написать небольшую программу на C, которая хранит шелл-код в виде байтового буфера, а затем использовать указатель на функцию или встроенный ассемблер для передачи ей выполнения. Другой метод заключается в использовании онлайн-инструмента, такого как shellcode_2_exe, для встраивания шелл-кода в предварительно созданную исполняемую оболочку, которая затем может быть проанализирована в стандартном отладчике. Также существуют специализированные инструменты анализа шелл-кода, такие как проект iDefense sclog, который был первоначально выпущен в 2005 году как часть пакета Malcode Analyst Pack. Sclog предназначен для загрузки внешних файлов шелл-кода и их выполнения в рамках системы ведения журналов API.Также существуют инструменты анализа шелл-кода на основе эмуляции, такие как приложение sctest, которое является частью кросс-платформенного пакета libemu. Еще один инструмент анализа шелл-кода на основе эмуляции, созданный на основе библиотеки libemu, - scdbg, который включает в себя базовую оболочку отладки и встроенные функции отчетности.

См. Также [ править ]

  • Буквенно-цифровой код
  • Компьютерная безопасность
  • Переполнение буфера
  • Эксплойт (компьютерная безопасность)
  • Переполнение кучи
  • Проект Metasploit
  • Оболочка (вычисления)
  • Лопатой для снарядов
  • Переполнение буфера стека
  • Уязвимость (вычисления)

Ссылки [ править ]

  1. ^ Фостер, Джеймс С .; и Прайс, Майк (12 апреля 2005 г.). Сокеты, шелл-код, перенос и кодирование: методы обратного проектирования и кодирование инструментов для профессионалов в области безопасности . Книги о науке и технологиях Elsevier. ISBN 1-59749-005-9.
  2. ^ Справочник шеллкодера: обнаружение и использование дыр в безопасности . Энли, Крис, Козиол, Джек. (2-е изд.). Индианаполис, ИН: Wiley Pub. 2007. ISBN 978-0-470-19882-7. OCLC  173682537 .CS1 maint: другие ( ссылка )
  3. ^ Атаки переполнения буфера: обнаружение, использование, предотвращение . Фостер, Джеймс С. Рокленд, Массачусетс: Syngress. 2005. ISBN 1-59749-022-9. OCLC  57566682 .CS1 maint: others (link)
  4. ^ "Tiny Execve sh - язык ассемблера - Linux / x86" . GitHub . Проверено 1 февраля 2021 .
  5. BHA (6 июня 2013 г.). «Шелл-код / ​​Повторное использование сокетов» . Проверено 7 июня 2013 .
  6. ^ SkyLined (11 января 2010). «Выпущен шеллкод Download и LoadLibrary» . Архивировано из оригинала 23 января 2010 года . Проверено 19 января 2010 .
  7. ^ SkyLined (11 января 2010). «Скачать и загрузить шелл-код библиотеки для x86 Windows» . Проверено 19 января 2010 .
  8. ^ Skape (9 марта 2004). «Безопасный процесс поиска в виртуальном адресном пространстве» (PDF) . нологин . Проверено 19 марта 2009 .
  9. ^ SkyLined (16 марта 2009). "w32 SEH шелл-код омлета" . Skypher.com. Архивировано из оригинального 23 марта 2009 года . Проверено 19 марта 2009 .
  10. ^ JavaScript большой unescape Системы интернет-безопасности IBM
  11. ^ Рикс (8 ноября 2001). «Написание буквенно-цифровых шелл-кодов ia32» . Phrack . Проверено 29 февраля 2008 .
  12. ^ Мейсон, Джошуа; Маленький, Сэм; Монроуз, Фабиан; Макманус, Грег (ноябрь 2009 г.). «Английский шеллкод» (PDF) . Проверено 10 января 2010 .
  13. ^ Obscou (13 августа 2003). «Создание кодов оболочки IA32, устойчивых к Unicode» . Phrack . Проверено 29 февраля 2008 .
  14. Евгений (11 августа 2001 г.). «Архитектура, покрывающая шеллкод» . Phrack . Проверено 29 февраля 2008 .

Внешние ссылки [ править ]

  • Shell-Storm База данных шеллкодов Мульти-платформенность.
  • Введение в переполнение буфера и шеллкод
  • Основы Shellcoding (PDF) Обзор shellcoding x86 от Анджело Росиелло
  • Введение в разработку шеллкода
  • Содержит образцы шелл-кода x86 и не x86, а также онлайн-интерфейс для автоматического создания и кодирования шелл-кода из проекта Metasploit.
  • архив шеллкода, отсортированный по операционной системе .
  • Руководство по созданию шелл-кода для Microsoft Windows и Linux - от начального до продвинутого .
  • Руководство по шеллкоду Windows и Linux, содержащее пошаговые примеры .
  • Демистификация разработки шеллкода
  • ALPHA3 Кодировщик шелл-кода, который может преобразовать любой шелл-код как в Unicode, так и в ASCII, в верхний и смешанный регистр, в буквенно-цифровой шелл-код.
  • Написание небольшого шелл-кода от Dafydd Stuttard Технический документ, объясняющий, как сделать шелл-код как можно меньше, оптимизировав как дизайн, так и реализацию.
  • Написание циклов декодера шелл-кода с ограниченным набором инструкций IA32 от SkyLined Технический документ, объясняющий, как создать шелл-код, когда количество байтов, разрешенных в шелл-коде , очень ограничено.
  • BETA3 Инструмент, который может кодировать и декодировать шелл-код , используя множество кодировок, обычно используемых в эксплойтах.
  • Shellcode 2 Exe - онлайн-конвертер для встраивания шелл-кода в оболочку exe
  • Sclog - Обновленная сборка инструмента анализа шеллкода iDefense sclog (Windows).
  • Libemu - библиотека анализа шеллкода на основе эмуляции (* nix / Cygwin)
  • Scdbg - отладчик шеллкода, созданный на основе библиотеки эмуляции libemu (* nix / Windows)