Xploits. How to? Hi-Tech Спецвыпуск: Хакер, номер #047, стр. 047-032-1 (hi-tech@nsd.ru, http://nsd.ru) Эксплоиты под *nix для начинающих Очень часто требуется добыть важную информацию, упрятанную на вражеском сервере. В большинстве случаев эта информация рядовому пользователю системы недоступна, поэтому встает вопрос о повышении прав в системе, разрешается который при помощи специальных программ - эксплоитов. Это что за покемон? Эксплоиты - специальные программы, использующие уязвимости в том или ином компоненте системы или сервисе с целью повышения или получения прав в системе либо для деструктивных целей, например, DOS-атак. Для поиска уязвимостей чаще всего берутся сервисы или компоненты системы, запущенные с высокими привилегиями, или приложения, принадлежащие руту, у которых установлен бит SUID/SGID. Практически все программные эксплоиты используют уязвимости класса buffer overflow. Как ты, наверное, уже догадался, взломщик, а, точнее, shell-код (набор машинных инструкций, который заполняет собой переполненный буфер), встроенный в эксплоит, получит права дырявого приложения и предоставит их атакующему, например, в виде открытого на каком-либо порту shell’а с повышенными правами. Немного по-другому обстоят дела с DoS-эксплоитами, shell-код которых представляет из себя своего рода "кракозябру", не имеющую никакого лексического значения, и поэтому приложение, пытаясь понять, что же это такое, сваливается в кору (core), или, говоря простым языком, глючит и зависает. Если ты не знаешь, что значит выпадать в core, приведу аналогичный пример из Винды, с которым ты уж точно не раз сталкивался: программа зависает и выдает окошко "programm.exe – Ошибка приложения" примерно такого содержания: "Инструкция по адресу 0x12121212 обратилась к памяти по адресу 0x13131313. Память не может быть 'read'". Отличие лишь в том, что *nix-системы пишут на диск своеобразный дамп памяти, по которому можно определить причину ошибки. Отчего же происходит переполнение? Существует множество различных типов переполнения буфера, соответственно, и причин столько же. Чтобы наглядно показать тебе, каким образом получаются переполнения, я приведу пример. #include <stdio.h> int main() { char buff[10] = {0}; //как ты видишь, в самом начале все элементы. // выделенного под переменную буфера представляют 10 нулей. // видно, что их может быть максимум 10! Т.е. программист рассчитывает, что // мы введем обязательно десятизначное число. printf("Enter your 10-digit number"); // Вводим число… scanf(buff, "%s"); // А вот мы и добрались до бага, функция scanf в данном // случае не проверяет длину введенного нами числа. Подумай, куда денется // еще 10 байт информации, если мы введем не 10, а 20 знаков? // Правильно, выйдет за пределы буфера. } Вот как все легко, а если после 10-го символа вставить shell-код? Более подробно обо всем этом читай в Спеце #08.04(45). Уязвимости в программе возникают из-за невнимательности и халатности программистов. Также в этом есть часть вины самой архитектуры x86. В ближайшем времени компания Intel планирует выпустить процессор с аппаратной защитой от уязвимостей переполнения буфера. Насколько она будет эффективна, мы сможем убедиться в ближайшем будущем, а пока эксплоиты, использующие эти уязвимости, живут и процветают. |