Защита от хакеров корпоративных сетей
Шрифт:
Программа с жестко запрограммированными адресами функций работает быстро и безошибочно, но, как правило, непереносима с одной платформы на другую. Для Windows NT это означает ограничение работоспособности программы переполнения буфера рамками единственного служебного пакета service pack и составом операционной системы OS combo. В зависимости от используемой платформы и библиотек в UNIX она может вообще не заработать.
Второй способ основан на определении адреса функции по таблице импортируемых символов атакованного процесса во время его выполнения. В этом случае программа работает лучше и переносима на другие платформы, но больше по размеру. В условиях недостатка памяти это серьезный минус, который может привести к
Эти форматы настолько интересны, что наверняка захочется познакомиться с ними подробнее. В них содержатся лаконичные сведения о загруженных процессом компонентах во время редактирования связей. Они позволяют понять, что может выполнимая или совместно используемая библиотека.
Вложенный программный код полезной нагрузки
Один из самых интересных типов программного кода полезной нагрузки известен под названием вложенного программного кода полезной нагрузки (eggshellpayload). Под вложенностью понимается использование одного кода полезной нагрузки внутри другого. Цель подобных манипуляций заключается в использовании программы с незначительными правами и внедренным кодом полезной нагрузки для атаки на привилегированную программу.
Этот способ позволяет с помощью простой программы переполнения буфера сначала переступить одной ногой через порог, а затем с бандой вломиться в дом. Благодаря нему результат достигается с меньшими усилиями и за меньшее время, поскольку нападение комплексное: удаленная атака на непривилегированный процесс объединяется с локальным нападением на привилегированный процесс, образуя разрушительную комбинацию.
Вложенный программный код полезной нагрузки использован в программе IISHACK1.5, которая компрометирует Windows NT Server с установленным информационным сервером Интернет IIS 4. Подробный анализ программы и ее код можно найти в документе www.eeye.com/html/Research/Advisories/AD20001003.html. Для внедрения программой asp-файла на сервер был использован непривилегированный код, реализующий атаку «Unicode». Атака «Unicode» выполняется в пространстве процесса IUSR_MACHINE, который обычно является непривилегированным процессом.
Атака «Unicode» была объединена с атакой переполнения буфера на неназванный синтаксический анализатор. ASP, который выполнялся в контексте LOCAL_SYSTEM. Их комбинация позволила добиться полной компрометации системы.
Резюме
Переполнение буфера – реальная опасность современных программ. На нем основаны многие из наиболее опасных уязвимостей, которые когда-либо были обнаружены. В главе рассказано о стеке и показано, каким образом его используют современные компиляторы и программы при вызове функций. Далее были исследованы способы построения программ переполнения буфера и выделены их составные части. И наконец, были освещены некоторые современные способы реализации переполнения буфера, позволяющие адаптировать программный код к конкретной ситуации и сделать его более переносимым и работоспособным.
Обязательным условием понимания приведенных в главе способов переполнения буфера является знание принципов работы стека. Стек используется почти каждой функцией для передачи входных
Атаки переполнения буфера обыгрывают идею подмены сохраненного в стеке содержимого регистра EIP и передачи управления на нужный программный код. Успешная реализация идеи позволит выполнить на машине любую программу. Для успешного использования уязвимости необходимо иметь загрузчик, точку перехода, программный код полезной нагрузки и программу переполнения буфера. Загрузчик размещает в нужное место программный код полезной нагрузки, точка перехода позволяет передать управления на нужную программу – программный код полезной нагрузки, а программа переполнения буфера управляет их работой.
Известны многочисленные способы улучшения программы переполнения буфера. В главе рассмотрены способы фильтрации входных данных и вопросы частичного переполнения буфера. Показаны способы переполнения динамически распределяемой памяти («кучи») и варианты использования ее уязвимостей. Наконец, было исследовано несколько способов улучшения управляющего кода: использование уже существующего программного кода и загрузка кода, недоступного во время выполнения программы переполнения буфера.
Конспект
Стек
· Область стека предназначена для хранения локальных переменных функции. Обычно она настраивается для работы в прологе функции – части программного кода, расположенного в начале функции, и очищается в эпилоге – части программного кода, расположенного в ее конце.
· Нередко отдельные части области стека используются как буферы данных функции. Из-за особенностей принципов работы стека размер буфера данных не изменяется на протяжении всей жизни функции.
· Некоторые компиляторы при генерации выполнимого кода могут использовать ряд хитроумных способов работы со стеком для оптимизации размера функции и времени ее выполнения. Имеются также разнообразные способы вызова функции и передачи ей параметров, которые влияют на использование стека в пределах функции.
Стековый фрейм функции
· Стековый фрейм функции – область памяти, выделяемая всякий раз, когда вызывается функция. Она предназначается для временного хранения параметров, локальных переменных функции, оставшегося от предыдущего вызова функции содержимого регистра EBP и содержимого регистра EIP, указывающего на точку возврата.
· Содержимое регистра ESP указывает на вершину стека, содержимое регистра EBP – на дно. Значение регистра ESP меняется по мере выталкивания и проталкивания данных в стек. Регистр EBP обычно является базовым регистром для ссылки на локальные стековые переменные.
· Команды процессора Intel call и ret позволяют вызывать и завершать функцию. По команде call в стеке сохраняется содержимое регистра EIP, которое указывает на точку возврата. По команде ret из стека восстанавливается значение регистра EIP и управление передается в точку возврата из функции.
Основы переполнения буфера
· Копирование чрезмерно большого количества данных в буфер ведет к повреждению части стека.
· Поскольку по команде ret в регистр EIP будут загружены данные из стека, то при перезаписи области хранения в стеке содержимого регистра EIP данными пользователя команда ret загрузит в регистр адрес перехода, указанный пользователем.
Пример программы, уязвимой к переполнению буфера