stringtranslate.com

Шеллкод

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

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

Типы шеллкода

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

Местный

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

Удаленный

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

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

Загрузите и выполните

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

Постановочный

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

Охота за яйцами

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

Омлет

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

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

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

Кодирование шеллкода

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

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

Процентное кодирование

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

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

90 НОП90 НОП

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

Шелл-код без нулей

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

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

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

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

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

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

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

Буквенно -цифровой шелл-код — это шелл-код, который состоит или при выполнении полностью состоит из буквенно-цифровых символов ASCII или Unicode , таких как 0–9, A–Z и a–z. [11] [12] Этот тип кодирования был создан хакерами , чтобы скрыть работающий машинный код внутри того, что выглядит как текст. Это может быть полезно, чтобы избежать обнаружения кода и позволить коду проходить через фильтры, удаляющие небуквенно-цифровые символы из строк (частично такие фильтры были ответом на небуквенно-цифровые эксплойты шеллкода). Подобный тип кодировки называется печатным кодом и использует все печатаемые символы (0–9, A–Z, a–z, !@#%^&*() и т. д.). Аналогичным ограниченным вариантом является код ECHO, не содержащий символов, которые не принимаются командой ECHO . Было показано, что можно создать шеллкод, который выглядит как обычный текст на английском языке. [13] Написание буквенно-цифрового или печатного кода требует хорошего понимания архитектуры набора команд машины(ов), на которой этот код должен выполняться. Было продемонстрировано, что можно писать буквенно-цифровой код, который может выполняться более чем на одной машине, [14], тем самым создавая исполняемый код с несколькими архитектурами .

В определенных обстоятельствах целевой процесс будет фильтровать любой байт введенного шеллкода, который не является печатным или буквенно-цифровым символом. В таких обстоятельствах набор инструкций, которые можно использовать для написания шелл-кода, становится очень ограниченным. Решение этой проблемы было опубликовано Риксом в 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 , который включает в себя базовую оболочку отладки и встроенные функции отчетности.

Смотрите также

Рекомендации

  1. ^ Фостер, Джеймс С.; Прайс, Майк (12 апреля 2005 г.). Сокеты, шелл-код, портирование и кодирование: методы обратного проектирования и инструментальное кодирование для специалистов по безопасности. Книги Elsevier по науке и технологиям. ISBN 1-59749-005-9.
  2. ^ Энли, Крис; Козиол, Джек (2007). Справочник шеллкодера: обнаружение и использование дыр в безопасности (2-е изд.). Индианаполис, Индиана, Украина: Уайли. ISBN 978-0-470-19882-7. ОСЛК  173682537.
  3. ^ Фостер, Джеймс К. (2005). Атаки переполнения буфера: обнаружение, использование, предотвращение . Рокленд, Массачусетс, США: Syngress. ISBN 1-59749-022-9. OCLC  57566682.
  4. ^ «Tiny Execve sh — Язык ассемблера — Linux/x86» . Гитхаб . Проверено 1 февраля 2021 г.
  5. ^ КНБК (6 июня 2013 г.). «Шеллкод/повторное использование сокетов» . Проверено 7 июня 2013 г.
  6. ^ SkyLined (11 января 2010 г.). «Выпущен шелл-код загрузки и загрузки библиотеки». Архивировано из оригинала 23 января 2010 г. Проверено 19 января 2010 г.
  7. ^ «Загрузить и загрузить шелл-код LoadLibrary для Windows x86» . 11 января 2010 г. Проверено 19 января 2010 г.
  8. ^ Скейп (9 марта 2004 г.). «Безопасный поиск в виртуальном адресном пространстве процесса» (PDF) . нологин . Проверено 19 марта 2009 г.
  9. ^ SkyLined (16 марта 2009 г.). «Шеллкод омлета w32 SEH». Скайфер.com. Архивировано из оригинала 23 марта 2009 г. Проверено 19 марта 2009 г.
  10. ^ «Обнаружено большое количество шаблонов unescape в JavaScript» . Архивировано из оригинала 3 апреля 2015 г.
  11. ^ Аб Рикс (11 августа 2001 г.). «Написание буквенно-цифровых шеллкодов ia32». Фрак . 0x0b (57). Phrack Inc. № 0x0f из 0x12. Архивировано из оригинала 8 марта 2022 г. Проверено 26 мая 2022 г.
  12. ^ ab obscou (13 августа 2003 г.). «Создание шелл-кодов IA32, защищенных от Юникода». Фрак . 11 (61). Phrack Inc. № 0x0b из 0x0f. Архивировано из оригинала 26 мая 2022 г. Проверено 29 февраля 2008 г.
  13. ^ Аб Мейсон, Джошуа; Маленький, Сэм; Монроуз, Фабиан; Макманус, Грег (ноябрь 2009 г.). Английский шеллкод (PDF) . Материалы 16-й конференции ACM по компьютерной и коммуникационной безопасности. Нью-Йорк, штат Нью-Йорк, США. стр. 524–533. Архивировано (PDF) из оригинала 26 мая 2022 г. Проверено 10 января 2010 г.(10 страниц)
  14. ^ «Описание мультиархитектуры (x86) и 64-битного буквенно-цифрового шелл-кода» . Академия Блэкхэт. Архивировано из оригинала 21 июня 2012 г.
  15. ^ Евгений (11 августа 2001 г.). «Шелл-код, охватывающий архитектуру». Фрак . Phrack Inc. № 0x0e из 0x12. Архивировано из оригинала 09.11.2021 . Проверено 29 февраля 2008 г.
  16. ^ Немо (13 ноября 2005 г.). «OSX — многоарочный шеллкод». Полное раскрытие . Архивировано из оригинала 26 мая 2022 г. Проверено 26 мая 2022 г.
  17. ^ Ча, Санг Кил; Пак, Брайан; Брамли, Дэвид ; Липтон, Ричард Джей (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])

Внешние ссылки