|
Некоторые методы взлома UNIX
Отдел|нные ACCOUNT'ы.
~~~~~~~~~~~~~~~~~~~~~
Это большая дыра в защите многих UNIX систем. В общем случае, если
пользователь отсоединяется, предварительно не предупредив систему об
окончании работы (LogOff), его Account может остаться на линии и тихо
присоединившись к этой линии можно получить доступ к системе напрямую.
Теперь если кто-то вызывает систему и присоединяется к этому tty,
он автоматически оказывается внутри системы, и получает Account от
предыдущего пользователя. Имеются некоторые интересные способы
использования этого недостатка. Для примера если вы желаете получить
пароли других пользователей, вы можете сделать и установить программу
ловушку, эмулирующую login этой системы и отсоединится. Затем,какой-то
пользователь подсоединяется к этому каналу, и в ответ на запрос вашей
программы вводит свои username и password,программы ловушка запоминает
полученные данные на диске, выдает сообщение "Login incorrect",убивает
shell, и пользователь получает реальный запрос "login:"
UID SHELLS.
~~~~~~~~~~~
Когда бит 'UID' поставлен у программы - оболочки ( shell ), ее
выполнение изменяет ваш user id на user id владельца этой программы,
и вы будете использовать полученный acccount пока не выйдите из этой
вторичной оболочки. Это дает вам возможность исполнять любые команды
под user id полученного account'a. Это лучше, чем знание пароля для
account'a, вы можете пользоваться account'ом пока существует этот файл
в системе, даже если владелец сменит пароль. Обычно, когда получают
доступ к account'у, делают копию shell в какой-то директорий, и ставят
UID и GID биты. Теперь если доступ к этому account'у потерян, можно из
другого запустить UID-shell и получить необходимый доступ.
UID и GID биты ставятся программой chmod. Например:
chmod 6555 /tmp/sh
Изменение UID программ.
~~~~~~~~~~~~~~~~~~~~~~~
Если вы имеете доступ по_записи (write access) к UID файлу,то можно
легко превратить его в оболочку. Скопируйте файл, затем наберите:
cat /bin/sh > [uid файл]
Это заменит его содержимое на содержимое shell, но UID останется
прежним. Теперь запустите замененную программу, сделайте скрытый UID
shell, и верните UID файл в прежнее состояние из копии.
Как найти рутовские файлы с suid ? Попробуйте:
find / -user root -perm -6000 -print
Срыв стека.
~~~~~~~~~~~
Самая новомодная методика взлома UNIX. В программах написанных на
языке С,под массивы отводится место в стеке программы. Если при работе
с таким массивом происходит запись в массив за его границей, это
приводит к разрушению стека программы и непредсказуемым результатам.
Например при выходе из модуля происходит переход по случайному адресу.
Переполнения стека приводит к изменению адреса возврата из функции
и может быть использовано для изменения нормального хода выполнения
программы. Логично было бы заставить программу выполнить какие-то
незапланированные действия, например, запустить (spawn) shell. Но если
в программе не содержится необходимого кода? Как поместить необходимый
код в адресное пространство инструкций? Необходимо поместить код для
выполнения в переполняемый буфер и переписать адрес возврата на точку
внутри этого буфера. Код, при выполнении которого происходит запуск
shell, получил название 'Shell Code'. Если программа, из которой
происходит запуск shell проинсталлирована как suid root, то получается
root shell.
Пример программы, реализующей вышеописанные действия приводится в
приложении 6.
Поиск программ с возможностью срыва стека.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Как было сказано выше, переполнения буфера происходят из-за
помещения в него большего количества информации, чем предполагалось.
Так как Язык C не имеет каких-либо встроенных средств для проверки
границ массивов данных, переполнения часто встречаются. Стандартная
библиотека С предоставляет ряд функций для копирования и конкантенации
строк, и эти функции не имеют проверок границ. Вот некоторые из этих
функций: strcat(), strcpy(), sprintf() и vsprintf(). Эти функции
используют строки заканчивающиеся символом '\0' и не проверяют на
переполнение при обработке принимаемой строки. gets() - это функция,
которая считывает строку со стандартного ввода (stdin) в буфер до тех
пор, пока не встретит символ новой строки или EOF. Эта функция не
производит проверки на переполнение буфера. С семейством функций
scanf() может возникнуть такая же ситуация, если в строке формата
используется "%s" и принимающая строка недостаточно велика. Если
принимающий массив какой-нибудь из этих функций представляет собой
буфер постоянной длины и данные, его заполняющие каким-либо образом
зависят от ввода или другой информации, зависящий от пользователя,
то скорее всего вы можете вызвать ситуацию переполнения буфера.
Другая, часто использующаяся при программировании конструкция, это
цикл посимвольного ввода из stdin или другого файла в буфер до тех
пор, пока не будет встречен символ конца строки (EOL), конца файла
(EOF) или другой разделитель. В такой конструкции обычно используются
функции getc(), fgetc(), или getchar(). Если при этом нет проверок на
переполнение, то в таком коде тоже легко можно вызвать переполнение
буфера.
Программа grep играет значительную роль в поиске таких слабых мест
в программах. Исходные тексты свободно распространяемых операционных
систем вполне доступны. И этот факт становится весьма интересным,
учитывая то, что многие коммерческие операционные системы базируются
на исходных текстах свободно распространяемых систем. В общем,изучайте
исходные тексты UNIX !
|
|