Шеллкод
В хакерстве шеллкод — это небольшой фрагмент кода, используемый в качестве полезной нагрузки при эксплуатации программного обеспечения уязвимости . Он называется «шеллкодом», поскольку обычно запускает командную оболочку , из которой злоумышленник может управлять взломанной машиной, но любой фрагмент кода, выполняющий аналогичную задачу, можно назвать шеллкодом. Поскольку функция полезной нагрузки не ограничивается простым созданием оболочки, некоторые полагают, что имени шеллкода недостаточно. [1] Однако попытки заменить этот термин не получили широкого признания. Шелл-код обычно пишется в машинном коде .
При создании шеллкода, как правило, желательно сделать его одновременно небольшим и исполняемым, что позволяет использовать его в максимально широком диапазоне ситуаций. [2] В ассемблерном коде одна и та же функция может выполняться множеством способов, и для этой цели можно использовать различные длины кодов операций; хорошие авторы шеллкода могут использовать эти небольшие коды операций для создания более компактного шеллкода. [3] Некоторые достигли минимально возможного размера, сохранив при этом стабильность. [4]
Типы шеллкода
[ редактировать ]Шелл-код может быть локальным или удаленным , в зависимости от того, дает ли он злоумышленнику контроль над машиной, на которой он запущен (локальный), или над другой машиной через сеть (удаленный).
Местный
[ редактировать ]Локальный шеллкод используется злоумышленником, который имеет ограниченный доступ к машине, но может воспользоваться уязвимостью, например переполнением буфера , в процессе с более высоким уровнем привилегий на этой машине. В случае успешного выполнения шелл-код предоставит злоумышленнику доступ к машине с теми же более высокими привилегиями, что и целевой процесс.
Удаленный
[ редактировать ]Удаленный шелл-код используется, когда злоумышленник хочет атаковать уязвимый процесс, запущенный на другом компьютере в локальной сети , интрасети или удаленной сети . В случае успешного выполнения шелл-код может предоставить злоумышленнику доступ к целевой машине по сети. Удаленные шелл-коды обычно используют стандартные TCP/IP, соединения сокетов чтобы позволить злоумышленнику получить доступ к оболочке на целевой машине. Такой шелл-код можно классифицировать в зависимости от того, как установлено это соединение: если шелл-код устанавливает соединение, его называют «обратным шеллом» или шелл-кодом с обратным соединением , поскольку шелл-код подключается обратно к машине злоумышленника. С другой стороны, если злоумышленник устанавливает соединение, шелл-код называется « bindshell», поскольку шелл-код привязывается к определенному порту на компьютере жертвы. Существует своеобразный шелл-код под названием «Bindshell Случайный порт» , который пропускает часть привязки и прослушивает случайный порт, доступный операционной системой . Из-за этого случайный порт привязки стал самым маленьким стабильным шеллкодом для x86_64, доступным на сегодняшний день. Третий, гораздо менее распространенный тип — это шеллкод с повторным использованием сокетов . Этот тип шеллкода иногда используется, когда эксплойт устанавливает соединение с уязвимым процессом, который не закрывается до запуска шеллкода. Затем шелл-код может повторно использовать это соединение для связи с злоумышленником. Повторное использование шелл-кода сокета более сложное, поскольку шелл-коду необходимо выяснить, какое соединение использовать повторно, а на машине может быть открыто много соединений. [5]
Брандмауэр . можно использовать для обнаружения исходящих соединений, создаваемых шелл-кодом обратного подключения, а также входящих соединений, создаваемых бинд-шеллами Таким образом, они могут обеспечить некоторую защиту от злоумышленника, даже если система уязвима, не позволяя злоумышленнику подключиться к оболочке, созданной шеллкодом. Одна из причин, по которой иногда используется повторное использование шелл-кода сокета, заключается в том, что он не создает новых соединений и, следовательно, его труднее обнаружить и заблокировать.
Загрузите и выполните
[ редактировать ]Загрузка и выполнение — это тип удаленного шелл-кода, который загружает и выполняет ту или иную форму вредоносного ПО в целевой системе. Этот тип шеллкода не создает оболочку, а скорее дает команду машине загрузить из сети определенный исполняемый файл, сохранить его на диск и выполнить. В настоящее время он обычно используется в атаках с попутной загрузкой , когда жертва посещает вредоносную веб-страницу, которая, в свою очередь, пытается запустить такую загрузку и выполнить шеллкод для установки программного обеспечения на компьютер жертвы. Вариант этого типа шеллкода загружает загружает библиотеку и . [6] [7] Преимущества этого метода заключаются в том, что код может быть меньше, что он не требует, чтобы шелл-код запускал новый процесс в целевой системе, и что шелл-коду не нужен код для очистки целевого процесса, поскольку это может быть сделано с помощью библиотека загружена в процесс.
Постановочный
[ редактировать ]Когда объем данных, которые злоумышленник может внедрить в целевой процесс, слишком ограничен для непосредственного выполнения полезного шеллкода, его можно выполнить поэтапно. Сначала выполняется небольшой фрагмент шеллкода (этап 1). Затем этот код загружает больший фрагмент шеллкода (этап 2) в память процесса и выполняет его.
Охота за яйцами
[ редактировать ]Это еще одна форма поэтапного шеллкода, которая используется, если злоумышленник может внедрить в процесс более крупный шеллкод, но не может определить, в каком месте процесса он окажется. Небольшой шеллкод для поиска яиц вводится в процесс в предсказуемом месте и выполняется. Затем этот код ищет в адресном пространстве процесса более крупный шелл-код ( egg ) и выполняет его. [8]
Омлет
[ редактировать ]Этот тип шеллкода похож на шеллкод поиска яиц , но ищет несколько небольших блоков данных ( яйца ) и объединяет их в один более крупный блок ( омлет ), который впоследствии выполняется. Это используется, когда злоумышленник может внедрить в процесс только несколько небольших блоков данных. [9]
Стратегия выполнения шеллкода
[ редактировать ]Эксплойт обычно внедряет шелл-код в целевой процесс до или одновременно с эксплуатацией уязвимости для получения контроля над счетчиком программы . Счетчик программы настраивается так, чтобы указывать на шеллкод, после чего он запускается и выполняет свою задачу. Внедрение шелл-кода часто осуществляется путем сохранения шелл-кода в данных, отправляемых по сети уязвимому процессу, путем предоставления его в файле, который читается уязвимым процессом, или через командную строку или среду в случае локальных эксплойтов.
Кодирование шеллкода
[ редактировать ]Поскольку большинство процессов фильтруют или ограничивают данные, которые могут быть введены, часто приходится писать шелл-код, учитывающий эти ограничения. Это включает в себя уменьшение размера кода, отсутствие нулей или буквенно-цифровой код . Для обхода таких ограничений были найдены различные решения, в том числе:
- Оптимизация дизайна и реализации для уменьшения размера шеллкода.
- Модификации реализации, позволяющие обойти ограничения на диапазон байтов, используемых в шелл-коде.
- Самомодифицирующийся код , который изменяет ряд байтов собственного кода перед их выполнением для воссоздания байтов, которые обычно невозможно внедрить в процесс.
Поскольку обнаружение вторжений может обнаруживать сигнатуры простых шелл-кодов, отправляемых по сети, их часто кодируют, делают саморасшифровывающими или полиморфными , чтобы избежать обнаружения.
Процентное кодирование
[ редактировать ]Эксплойты, нацеленные на браузеры, обычно кодируют шеллкод в строке JavaScript с использованием процентного кодирования , кодирования escape-последовательности " \uXXXX » или кодировка объекта . [10] Некоторые эксплойты также дополнительно запутывают закодированную строку шеллкода, чтобы предотвратить обнаружение IDS .
Например, на архитектуре IA-32 вот как два NOP
Инструкции (без операции) будут выглядеть сначала в незакодированном виде:
90 NOP 90 NOP
процентное кодирование | unescape("%u9090")
|
---|---|
литерал Юникода | "\u9090"
|
HTML/XML-объект | "邐" или "邐"
|
Эта инструкция используется в слайдах NOP .
Шелл-код без нулей
[ редактировать ]Большинство шелл-кодов пишутся без использования нулевых байтов, поскольку они предназначены для внедрения в целевой процесс через строки с нулевым завершением . Когда копируется строка с нулевым завершением, она будет скопирована до первого нуля включительно, но последующие байты шелл-кода не будут обработаны. При таком способе внедрения шелл-кода, содержащего нули, будет внедрена только часть шелл-кода, что сделает его невозможным для успешной работы.
Чтобы создать шеллкод без нулей из шеллкода, содержащего нулевые байты, можно заменить машинные инструкции, содержащие нули, инструкциями, которые имеют тот же эффект, но не содержат нулей. Например, на архитектуре IA-32 можно заменить эту инструкцию:
B8 01000000 MOV EAX,1 // Set the register EAX to 0x00000001
который содержит нули как часть литерала ( 1
расширяется до 0x00000001
) с этими инструкциями:
33C0 XOR EAX,EAX // Set the register EAX to 0x00000000 40 INC EAX // Increase EAX to 0x00000001
которые имеют тот же эффект, но требуют меньшего количества байтов для кодирования и не содержат нулей.
Буквенно-цифровой и печатный шелл-код
[ редактировать ]Буквенно -цифровой шелл-код — это шелл-код, который состоит или при выполнении полностью состоит из буквенно-цифровых символов ASCII или Unicode, таких как 0–9, A–Z и a–z. [11] [12] Этот тип кодирования был создан хакерами , чтобы скрыть работающий машинный код внутри того, что выглядит как текст. Это может быть полезно, чтобы избежать обнаружения кода и позволить коду проходить через фильтры, удаляющие небуквенно-цифровые символы из строк (частично такие фильтры были ответом на небуквенно-цифровые эксплойты шеллкода). Подобный тип кодировки называется печатным кодом и использует все печатаемые символы (0–9, A–Z, a–z, !@#%^&*() и т. д.). Аналогичным ограниченным вариантом является код ECHO, не содержащий символов, которые не принимаются командой ECHO . Было показано, что можно создать шеллкод, который выглядит как обычный текст на английском языке. [13] Написание буквенно-цифрового или печатного кода требует хорошего понимания архитектуры набора команд машины(ов), на которой этот код должен выполняться. Было продемонстрировано, что можно написать буквенно-цифровой код, который будет выполняться более чем на одной машине. [14] тем самым образуя исполняемый код с мультиархитектурой .
В определенных обстоятельствах целевой процесс будет фильтровать любой байт введенного шеллкода, который не является печатным или буквенно-цифровым символом. В таких обстоятельствах набор инструкций, которые можно использовать для написания шелл-кода, становится очень ограниченным. Решение этой проблемы было опубликовано Rix в Phrack 57. [11] в котором он показал, что любой код можно превратить в буквенно-цифровой код. Часто используемый метод заключается в создании самомодифицирующегося кода, поскольку это позволяет коду изменять свои собственные байты, включая байты за пределами обычно разрешенного диапазона, тем самым расширяя диапазон инструкций, которые он может использовать. Используя этот трюк, можно создать самомодифицирующийся декодер, который изначально использует только байты в разрешенном диапазоне. Основной код шеллкода кодируется, также используя только байты в разрешенном диапазоне. Когда запускается выходной шеллкод, декодер может изменить свой собственный код, чтобы иметь возможность использовать любую инструкцию, необходимую для правильной работы, а затем продолжить декодирование исходного шеллкода. После декодирования шеллкода декодер передает ему управление, поэтому он может выполняться как обычно. Было показано, что можно создать сколь угодно сложный шеллкод, который выглядит как обычный текст на английском языке. [13]
Шелл-код с подтверждением Unicode
[ редактировать ]Современные программы используют строки Unicode для интернационализации текста. Часто эти программы преобразуют входящие строки ASCII в Unicode перед их обработкой. Строки Unicode, закодированные в UTF-16, используют два байта для кодирования каждого символа (или четыре байта для некоторых специальных символов). Когда строка ASCII ( в целом Latin-1 ) преобразуется в UTF-16, после каждого байта в исходной строке вставляется нулевой байт. Обскуу оказался в Phrack 61 [12] что можно написать шеллкод, который сможет успешно работать после этого преобразования. Существуют программы, которые могут автоматически кодировать любой шелл-код в буквенно-цифровой шелл-код, защищенный UTF-16, и основаны на том же принципе, что и небольшой самомодифицирующийся декодер, который декодирует исходный шелл-код.
Платформы
[ редактировать ]Большая часть шелл-кода написана в машинном коде из-за низкого уровня, на котором эксплуатируемая уязвимость дает злоумышленнику доступ к процессу. Поэтому шелл-код часто создается для одной конкретной комбинации процессора , операционной системы и пакета обновлений , называемой платформой . Для некоторых эксплойтов из-за ограничений, налагаемых на шеллкод целевым процессом, необходимо создать очень специфический шеллкод. Однако вполне возможно, что один шеллкод будет работать с несколькими эксплойтами, пакетами обновлений, операционными системами и даже процессорами. [15] [16] [17] Такая универсальность обычно достигается путем создания нескольких версий шелл-кода, предназначенных для различных платформ, и создания заголовка, который разветвляется до правильной версии для платформы, на которой выполняется код. При выполнении код ведет себя по-разному для разных платформ и выполняет правильную часть шелл-кода для платформы, на которой он работает.
Анализ шеллкода
[ редактировать ]Шелл-код не может быть выполнен напрямую. Чтобы проанализировать, что пытается сделать шеллкод, его необходимо загрузить в другой процесс. Один из распространенных методов анализа — написать небольшую программу на языке C, которая хранит шелл-код в виде байтового буфера, а затем использовать указатель на функцию или использовать встроенный ассемблер для передачи ей выполнения. Другой метод — использовать онлайн-инструмент, такой как шеллкод_2_exe, для встраивания шеллкода в готовую исполняемую оболочку, которую затем можно проанализировать в стандартном отладчике. Также существуют специализированные инструменты анализа шелл-кода, такие как проект iDefense sclog, который первоначально был выпущен в 2005 году как часть Malcode Analyst Pack. Sclog предназначен для загрузки внешних файлов шелл-кода и их выполнения в рамках системы ведения журналов API. Также существуют инструменты анализа шеллкода на основе эмуляции, такие как sctest , которое является частью кроссплатформенного пакета libemu. Еще один инструмент анализа шеллкода на основе эмуляции, построенный на основе библиотеки libemu: scdbg , который включает в себя базовую оболочку отладки и встроенные функции отчетности.
См. также
[ редактировать ]- Буквенно-цифровой код
- Компьютерная безопасность
- Переполнение буфера
- Эксплойт (компьютерная безопасность)
- Переполнение кучи
- Проект Метасплоит
- Шелл (вычисления)
- Расчистка ракушек
- Переполнение буфера стека
- Уязвимость (вычисления)
Ссылки
[ редактировать ]- ^ Фостер, Джеймс С.; Прайс, Майк (12 апреля 2005 г.). Сокеты, шелл-код, портирование и кодирование: эксплойты обратного проектирования и инструментальное кодирование для специалистов по безопасности . Книги Elsevier по науке и технологиям. ISBN 1-59749-005-9 .
- ^ Энли, Крис; Козиол, Джек (2007). Справочник шеллкодера: обнаружение и использование дыр в безопасности (2-е изд.). Индианаполис, Индиана, Украина: Уайли. ISBN 978-0-470-19882-7 . OCLC 173682537 .
- ^ Фостер, Джеймс К. (2005). Атаки переполнения буфера: обнаружение, использование, предотвращение . Рокленд, Массачусетс, США: Syngress. ISBN 1-59749-022-9 . OCLC 57566682 .
- ^ «Tiny Execve sh — Язык ассемблера — Linux/x86» . Гитхаб . Проверено 1 февраля 2021 г.
- ^ КНБК (06.06.2013). «Шеллкод/повторное использование сокетов» . Проверено 7 июня 2013 г.
- ^ SkyLined (11 января 2010 г.). «Выпущен шелл-код загрузки и загрузки библиотеки» . Архивировано из оригинала 23 января 2010 г. Проверено 19 января 2010 г.
- ^ «Загрузка и загрузка шеллкода библиотеки для Windows x86» . 11 января 2010 г. Проверено 19 января 2010 г.
- ^ Скейп (9 марта 2004 г.). «Безопасный поиск в виртуальном адресном пространстве процесса» (PDF) . нологин . Проверено 19 марта 2009 г.
- ^ SkyLined (16 марта 2009 г.). «Шеллкод омлета w32 SEH» . Скайфер.com. Архивировано из оригинала 23 марта 2009 г. Проверено 19 марта 2009 г.
- ^ «Обнаружено большое количество шаблонов unescape в JavaScript» . Архивировано из оригинала 3 апреля 2015 г.
- ^ Jump up to: а б Рикс (11 августа 2001 г.). «Написание буквенно-цифровых шеллкодов ia32» . Фрак . 0x0b (57). Phrack Inc. № 0x0f из 0x12. Архивировано из оригинала 8 марта 2022 г. Проверено 26 мая 2022 г.
- ^ Jump up to: а б обску (13 августа 2003 г.). «Создание шелл-кодов IA32, защищенных от Юникода» . Фрак . 11 (61). Phrack Inc. № 0x0b из 0x0f. Архивировано из оригинала 26 мая 2022 г. Проверено 29 февраля 2008 г.
- ^ Jump up to: а б Мейсон, Джошуа; Маленький, Сэм; Монроуз, Фабиан; Макманус, Грег (ноябрь 2009 г.). Английский шеллкод (PDF) . Материалы 16-й конференции ACM по компьютерной и коммуникационной безопасности. Нью-Йорк, штат Нью-Йорк, США. стр. 524–533. Архивировано (PDF) из оригинала 26 мая 2022 г. Проверено 10 января 2010 г. (10 страниц)
- ^ «Описание мультиархитектуры (x86) и 64-битного буквенно-цифрового шеллкода» . Академия Блэкхэт. Архивировано из оригинала 21 июня 2012 г.
- ^ Евгений (11 августа 2001 г.). «Шеллкод, охватывающий архитектуру» . Фрак . Phrack Inc. № 0x0e из 0x12. Архивировано из оригинала 09.11.2021 . Проверено 29 февраля 2008 г.
- ^ Немо (13 ноября 2005 г.). «OSX — многоарочный шеллкод» . Полное раскрытие . Архивировано из оригинала 26 мая 2022 г. Проверено 26 мая 2022 г.
- ^ Ча, Санг Киль; Пак, Брайан; Брамли, Дэвид ; Липтон, Ричард Джей (8 октября 2010 г.) [04 октября 2010 г.]. Платформонезависимые программы (PDF) . Материалы 17-й конференции ACM по компьютерной и коммуникационной безопасности (CCS'10). Чикаго, Иллинойс, США: Университет Карнеги-Меллона , Питтсбург, Пенсильвания, США / Технологический институт Джорджии , Атланта, Джорджия, США. стр. 547–558. дои : 10.1145/1866307.1866369 . ISBN 978-1-4503-0244-9 . Архивировано (PDF) из оригинала 26 мая 2022 г. Проверено 26 мая 2022 г. [1] (12 страниц) (См. также: [2] )
Внешние ссылки
[ редактировать ]- Shell-Storm База данных шелл-кодов Мультиплатформенная.
- Введение в переполнение буфера и шеллкод
- Основы шеллкодинга (PDF) Обзор шеллкодинга x86, автор Анджело Розиелло.
- Введение в разработку шеллкода
- Содержит образцы шелл-кода x86 и не x86, а также онлайн-интерфейс для автоматического создания и кодирования шелл-кода из проекта Metasploit.
- архив шеллкода, отсортированный по операционной системе .
- Учебное пособие по проектированию шеллкода для Microsoft Windows и Linux, начиная с базового и заканчивая продвинутым .
- Учебное пособие по шеллкоду для Windows и Linux, содержащее пошаговые примеры .
- Проектирование шелл-кода раскрыто
- ALPHA3 Кодировщик шелл-кода, который может преобразовать любой шелл-код в Unicode и ASCII, буквенно-цифровой шелл-код в верхнем регистре и в смешанном регистре.
- Написание небольшого шеллкода, автор Дэфидд Стуттард. Технический документ, объясняющий, как сделать шеллкод как можно меньшим за счет оптимизации дизайна и реализации.
- Написание циклов декодера шеллкода с ограниченным набором команд IA32 от SkyLined. Архивировано 3 апреля 2015 г. на Wayback Machine. Технический документ, объясняющий, как создавать шеллкод, когда количество байтов, разрешенных в шеллкоде, очень ограничено.
- БЕТА3 Инструмент, который может кодировать и декодировать шеллкод, используя различные кодировки, обычно используемые в эксплойтах.
- Shellcode 2 Exe - Онлайн-конвертер для встраивания шеллкода в exe-оболочку
- Sclog — обновленная сборка инструмента анализа шелл-кода iDefense sclog (Windows).
- Libemu — библиотека анализа шеллкода на основе эмуляции (*nix/Cygwin)
- Scdbg — отладчик шеллкода, построенный на основе библиотеки эмуляции libemu (*nix/Windows)