Шеллкод
В информатике шелл - код — это программа на языке ассемблера , которая традиционно запускает оболочку , такую как оболочка Unix ‘/bin/sh’ или оболочка command.com в операционных системах DOS и Microsoft Windows . Шелл-код может использоваться для использования ошибки посредством эксплойта , позволяющего хакеру или взломщику получить доступ к командной строке компьютера или , в более общем смысле, выполнить произвольный код .
Описание
Типы шелл-кода
Существует два разных типа шеллкода: локальный и удаленный. Различие зависит от типа управления, которое обеспечивает выполнение шелл-кода на целевой машине, которое может быть локальным или удаленным (если это происходит по сети).
Местный
Локальный шеллкод используется злоумышленником, имеющим ограниченный доступ к машине, но который, эксплуатируя уязвимость в процессе с более высокими привилегиями, например переполнение буфера, может получить такие же привилегии в случае успешного выполнения шеллкода.
Удаленный
Удаленный шеллкод используется вместо этого, когда злоумышленник хочет использовать уязвимость процесса другой машины в локальной сети или интрасети. Если шелл-код выполнен правильно, он возвращает контроль над целевой машиной по сети. Удаленные шелл-коды обычно используют стандартный сокет TCP/IP , чтобы разрешить доступ к оболочке целевой машины. Дальнейшие различия можно классифицировать в зависимости от способа установления связи. Если сам шелл-код может установить соединение, это называется «обратным шеллом» или шелл -кодом с обратным подключением , потому что шелл-код, работающий на удаленной машине, подключается к машине злоумышленника. Если, с другой стороны, злоумышленнику необходимо создать соединение, шелл-код называется bindshell , так как шелл-код привязывается к определенному порту, который будет использоваться злоумышленником для подключения и управления целевой машиной. Третий, менее распространенный тип шеллкода — шеллкод с повторным использованием сокетов . Этот тип шелл-кода обычно используется, когда эксплойт устанавливает соединение с уязвимым процессом, который не закрывается до выполнения шелл-кода. Шелл-код может повторно использовать это соединение для связи с злоумышленником. Шелл-код с повторным использованием сокетов реализовать сложнее, потому что шелл-код должен определять, какое соединение он может использовать (среди возможных, открытых на машине). [1] Брандмауэр можно использовать для идентификации исходящих соединений, созданных шелл -кодом с обратным подключением, и попыток входящего соединения с помощью bindshell. Брандмауэр может обеспечить дополнительную защиту от злоумышленника, даже если система уязвима, путем превентивного предотвращения доступа к оболочке, созданной путем выполнения шелл-кода. Это одна из причин, по которой иногда используется повторное использование шелл-кода сокета, потому что отсутствие создания новых соединений труднее идентифицировать и заблокировать.
Загрузите и выполните
Загрузить и выполнить — это тип удаленного шеллкода, который выполняет загрузку и запускает некоторую форму вредоносного ПО в целевой системе. Этот тип шелл-кода не создает оболочку, а дает указание машине загрузить из сети определенный исполняемый файл, сохранить его на диск, а затем запустить. В настоящее время он обычно используется в атаках с загрузкой , когда жертва посещает вредоносный сайт, который пытается инициировать загрузку и выполнить шелл-код для установки программного обеспечения на машине жертвы. Разновидностью этого типа шеллкода является «загрузка и загрузка библиотеки». [2] [3] Преимущество этого метода заключается в том, что код шелл-кода может быть меньше, он не требует создания нового процесса на целевой машине и что шелл-коду не нужно реализовывать код для очистки целевого компьютера. process , но это можно сделать из библиотеки, загруженной в процесс.
Постановка
Когда объем данных, которые злоумышленник может внедрить в целевой процесс, слишком мал для корректной работы шелл-кода, его можно запускать поэтапно. Сначала выполняется небольшой фрагмент шелл-кода (стадия 1). Этот код выгружает большую часть шелл-кода (этап 2) в память процесса и запускает его.
Охота за яйцами
Egg-hunt — еще один тип поэтапного шеллкода. Он используется, когда злоумышленник имеет возможность вставить в процесс большой шелл-код, но не может определить, где в памяти он будет размещен. Затем в процесс вставляется небольшая охота за яйцами в предсказуемом месте, а затем выполняется. Код ищет в памяти больший шеллкод (яйцо) и выполняет его.
Омлет
Этот тип шеллкода похож на охоту за яйцами, но ищет более мелкие блоки (яйца) и рекомбинирует их в более крупный (омлет), который затем выполняется. Этот метод используется, когда злоумышленник по какой-то причине ограничен вставкой небольших блоков данных в процесс. [4]
Операция
Стратегия выполнения шелл-кода
Эксплойт обычно вставляет шелл-код в целевой процесс до или одновременно с использованием уязвимости, чтобы получить контроль над счетчиком программ . Счетчик программ указывает на исполняемый шелл-код. Внедрение шелл-кода часто осуществляется путем сохранения кода в данных, отправляемых по сети уязвимому процессу, делая его доступным в файле, который считывается процессом, или через командную строку или переменные среды в случае локальных эксплойтов.
Кодирование шеллкода
Поскольку многие процессы фильтруют или ограничивают вводимые данные, часто приходится писать шелл-код для преодоления этих ограничений, делая код небольшим, свободным от нулей или буквенно-цифровых символов. Было найдено несколько решений, позволяющих обойти эти ограничения:
- Оптимизация дизайна и реализации для уменьшения размера шеллкода.
- Реализация изменена, чтобы обойти ограничения в диапазоне байтов, используемых в шелл-коде.
- Самомодифицирующийся код , который изменяет количество байтов своего кода перед их выполнением, чтобы воссоздать байты, которые обычно не могут быть вставлены в процесс.
Поскольку инструменты обнаружения вторжений могут идентифицировать сигнатуру простых шелл-кодов, отправляемых по сети, они кодируются и делаются саморасшифровывающимися или полиморфными , чтобы избежать распознавания.
Процентное кодирование
Эксплойты, нацеленные на браузеры, обычно кодируют шелл-код в строку JavaScript, используя процентное кодирование или нотацию URL-кодирования, экранируя «\ uXXXX» или используя entity . Некоторые эксплойты дополнительно запутывают шелл-код, закодированный строкой, чтобы избежать обнаружения инструментами IDS . Например, в архитектуре IA-32 две инструкции (без операции) NOPимеют эту форму до кодирования.
90 НЕТ 90 НЕТ
Они закодированы в строку с процентным кодированием. (используя метод unescape() для декодирования)
unescape("%u9090");
Затем он кодируется в обозначении «\uXXXX»:
"\u9090";
И, наконец, в кодировке сущности.
"邐"
или же
"& # 37008;"
Шеллкод Null-Free
Многие шелл-коды написаны без использования нулевых байтов , потому что они предназначены для вставки в целевой процесс через строку с завершающим нулем. Когда копируется строка с нулевым символом в конце, копия будет включать первый нулевой символ , но следующие за ним байты не будут обрабатываться. Когда шелл-код, содержащий ноль, вводится таким образом, будет вставлена только часть шелл-кода, что делает невозможным его выполнение позже. Чтобы создать шелл-код без нулей, начиная с того, который содержит нулевые байты, машинные инструкции, содержащие нули, можно заменить инструкциями, которые производят тот же эффект, но не содержат нулевых байтов. Например, в архитектуре IA-32 эту замену можно выполнить:
B8 01000000 MOV EAX, 1 // Установить регистр EAX в 0x000000001
этот оператор содержит нули как часть литерала (1 расширяется до 0x000000001) со следующими операторами:
33C0 XOR EAX, EAX // Установить регистр EAX в 0x000000000 40 INC EAX // Увеличить значение EAX до 0x00000001
которые имеют тот же эффект, но требуют меньше байтов для кодирования и не содержат нулевых байтов.
Буквенно-цифровые и печатные шелл-коды
При определенных обстоятельствах целевой процесс может отфильтровать все байты из введенного шелл-кода, которые не являются печатными или буквенно-цифровыми. В этих условиях набор инструкций, которые можно использовать для написания шелл-кода, становится очень ограниченным. Решение этой проблемы было опубликовано Rix в Phrack 57 [5] , где показано, как можно преобразовать любой тип кода в буквенно-цифровой. Широко используемый метод заключается в создании самомодифицирующегося кода, потому что это позволяет коду изменять свои собственные байты, чтобы включать другие, не включенные в число разрешенных, и расширять диапазон используемых инструкций. С помощью такого трюка можно изначально создать самомодифицирующийся декодер, используя только байты в пределах допустимого диапазона. Когда исходящий шелл-код начинает выполняться, декодер может модифицировать свой код, чтобы иметь возможность использовать любую требуемую инструкцию, позволяющую ему работать правильно, и в то же время продолжать декодировать исходный шелл-код. После выполнения декодирования декодер передает управление шелл-коду, чтобы он мог нормально работать. Было показано, как можно создавать шелл-коды произвольной сложности, напоминающие обычный английский текст. [6]
Шеллкод с защитой от символов Unicode
Многие современные программы используют кодировку строк в формате Unicode, чтобы обеспечить интернализацию текста. Часто эти программы преобразуют входные строки ASCII перед их обработкой. Строки Unicode, закодированные в UTF-16, используют два байта для декодирования каждого символа (или четыре байта для некоторых специальных символов). Когда строка ASCII преобразуется в UTF-16, нулевой байт вставляется после каждого байта исходной строки. Обску показал в Phrack 61 [7] , что можно писать шелл-коды, которые могут выполняться правильно даже после этого преобразования. Существуют программы, которые могут автоматически изменять каждый шелл-код на шелл-код в кодировке UTF-16 и основаны на том же принципе, что и самомодифицирующийся декодер, декодирующий исходный шелл-код.
Платформы
Многие шелл-коды написаны в машинном коде из-за низкого уровня, на котором уязвимость становится эксплуатируемой. Шелл-код часто создается для атаки на определенную комбинацию процессора, операционной системы и пакета обновлений, которые обычно называют платформой. Для некоторых эксплойтов из-за ограничений, накладываемых целевым процессом, необходимо создать определенный шеллкод. Однако шеллок не всегда может работать с несколькими эксплойтами, пакетами обновлений, операционными системами и, возможно, процессорами. [8] Универсальность может быть обеспечена за счет создания различных версий шелл-кода в зависимости от различных атакуемых платформ и создания заголовка, определяющего правильную версию для используемой платформы. При выполнении код ведет себя по-разному в зависимости от платформы и может выполнять правильную версию шелл-кода.
Примечания
- ↑ BHA, Shellcode/Socket-reuse , на blackhatlibrary.net , 6 июня 2013 г. Проверено 7 июня 2013 г.
- ↑ Выпущен шелл-код SkyLined , Download и LoadLibrary на сайте skypher.com , 11 января 2010 г. Получено 19 января 2010 г. (архивировано из оригинала 23 января 2010 г.) .
- ^ Шелл- код SkyLined, Download and LoadLibrary для x86 Windows , на code.google.com , 11 января 2010 г. Проверено 19 января 2010 г.
- ↑ SkyLined , шелл- код омлета w32 SEH , на skypher.com , 16 марта 2009 г. Проверено 19 марта 2009 г. (архивировано из оригинала 23 марта 2009 г.) .
- ↑ Rix, Написание буквенно-цифровых шелл-кодов ia32 , phrack.org , Phrack, 8 ноября 2001 г. Проверено 29 февраля 2008 г.
- ↑ Джошуа Мейсон, Смолл, Сэм, Монроуз, Фабиан и Макманус, Грег, английский шеллкод ( PDF ), cs.jhu.edu , ноябрь 2009 г. Проверено 10 января 2010 г.
- ↑ Obscou , Building IA32 «Unicode-Proof» Shellcodes , phrack.org , Phrack, 13 августа 2003 г. Проверено 29 февраля 2008 г.
- ↑ Юджин, Архитектура , охватывающая шеллкод , phrack.org , Phrack, 11 августа 2001 г. Проверено 29 февраля 2008 г.
Связанные элементы
- Переполнение буфера
- Переполнение кучи
- ИТ-безопасность
- Сборка
- самоизменяющийся код
- Система обнаружения вторжений
Внешние ссылки
- Shell-Storm.org Мультиплатформенная база данных шеллкодов.
- https://web.archive.org/web/20080302111910/http://www.metasploit.com/shellcode/ Содержит примеры шелл -кода x86 и не- x86 , а также онлайн-интерфейс для автоматического создания и кодирования шелл-кода.
- http://www.vividmachines.com/shellcode/shellcode.html Учебник по шеллкодам в Windows и Linux с пошаговыми примерами.
- http://www.orkspace.net/software/libShellCode/ библиотека с открытым исходным кодом для автоматического создания ShellCode. Его можно использовать для создания динамических шелл-кодов внутри эксплойта или для создания статических шелл-кодов с помощью внешнего интерфейса .