Отдел╠нные 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 !