шпоры флора
.pdf•passwd
•iohack.o
•iohack.c
•index_hack.htm
•demos.txt
•bomb.pl
•attack2.htm
Кажется, в этом нет ничего удивительного, но зададим простой вопрос, – как однозадачная операционная система MS-DOS может одновременно запустить два процесса? Оказывается, в ней реализован несколько другой механизм поддержки конвейера, – сначала запускается первая слева программа, записывает все результаты своей работы в некоторый промежуточный буфер, затем запускается вторая программа и получает из буфера входные данные. Это уже не труба получается, а настоящий бассейн!
С первого взгляда в таком подходе ничего дурного нет, но некоторые примеры могут работать некорректно или и вовсе не работать. К таким относится, например, UNIX-утилита “yes”, посылающая на стандартный вывод бесконечный поток символов ‘y’. За кажущейся бесполезностью она часто требуется для пакетного выполнения программ, периодически отвлекающих пользователя запросами на подтверждение выполнения какой-нибудь операции.
В UNIX конвейер полностью заполняется символами ‘y’, и выполнение утилиты “yes” приостанавливается, до тех пор, пока другой процесс не возьмет из конвейера один или несколько символов. Но в MS-DOS два процесса не могут исполняться параллельно, и пока процесс “yes” не закончит выполнение, никакое другое приложение не сможет получить управление, а поскольку выполнение ”yes” не завершиться никогда (программа-то умышленно зациклена) система скинет ласты и впадет в дурной цикл.
Рисунок 013.txt Сравнение конвейеров в UNIX и MS-DOS. В MS-DOS конвейер больше похож на «бассейн», чем на «трубопровод» Поддержка конвейеров – штука замечательная, но только не с точки зрения безопасности.
Следующий код доказывает это утверждение (на диске он находится под именем “/SRC/pipe.hack.pl”).
•open(FH,<>);
•if (FH)
•
•}
На первый взгляд, программа предназначена для вывода содержимого файла на экран, но ниже показано, что произойдет, если воспользоваться символом конвейера:
•ls|
•sioux.pl
•passwd
•iohack.o
•iohack.c
•index_hack.htm
•demos.txt
•bomb.pl
Опаньки! Да ведь функция open языка Perl негла& 424f58e #1089;но поддерживает конвейер! Вместо открытия файла происходит его запуск! Вряд ли стоит объяснять, какие последствия вытекают из этого! Так, одна из версий SendMail позволяла в качестве обратного адреса отправителя письма подставить строчку “|/usr/bin/sh” и оболочка действительно запускалась, предоставив атакующему привилегированный доступ в систему (от имени демона). Огромное количество защит оказалось взломано именно «благодаря» поддержке конвейера, позволяющего выполнять на удаленной машине любой код[2]. Аналогично перенаправлению
ввода-вывода, конвейерные дырки могут быть обнаружены не только тщательным изучением исходных тестов приложений, но и простой подстановкой знака “|” во все доступные строки ввода и поля заголовков. Не так уж и редко это срабатывает.
Важно отметить, подобной «вкусности» подвержена не только операционная система UNIX, но и множество других, в частности Windows 9x/Windows NT. Убедиться в этом поможет приведенный выше код “pipe.hack.pl”. Достаточно запустить его на платформе Windows и ввести следующую команду:
•dir |
•Том в устройстве F не имеет метки
•Серийный номер тома: 2F42-0AE8
•Содержимое папки F:\TPNA\src
• |
|
|
|
|
|
|
• |
. |
<ПАПКА> |
28.06.00 23:14 . |
|||
• |
.. |
<ПАПКА> |
28.06.00 23:14 .. |
|||
• |
IO |
C |
|
|
294 |
06.07.00 10:29 io.c |
• |
IO |
OBJ |
|
775 06.07.00 10:18 io.obj |
||
• |
IO |
EXE |
|
32 768 06.07.00 10:18 io.exe |
||
• |
IOSTD |
C |
|
228 06.07.00 10:30 iostd.c |
||
• |
IOSTD |
OBJ |
|
|
627 06.07.00 10:26 iostd.obj |
|
• |
IOSTD |
EXE |
|
32 768 06.07.00 10:26 iostd.exe |
||
• |
MYFILE |
|
|
16 06.07.00 10:53 myfile |
||
• |
OUT |
TXT |
|
|
89 06.07.00 10:53 out.txt |
|
• |
IOHACK |
C |
|
|
295 06.07.00 15:18 iohack.c |
|
• |
IOHACK |
OBJ |
|
827 06.07.00 14:58 iohack.obj |
||
• |
IOHACK |
EXE |
|
32 768 06.07.00 14:58 iohack.exe |
||
• |
PIPEHA~1 PL |
|
|
65 06.07.00 22:29 pipe.hack.pl |
||
• |
12 файлов |
101 520 байт |
•2 папок 1 710 641 152 байт свободно
Методы противодействия и защиты от подобных ошибок будут описаны в гла& 424f58e #1074;е «Атака на WEB-сервер», а ниже будет объяснено почему символ конвейера появляется то слева от команды (как в примере с “|/usr/bin/sh”), то справа (“dir |”). Вообще-то «классический» конвейер состоит минимум из двух программ, и вывод первой из них попадает на ввод второй. То есть конструкцию “program 1 | program 2” можно изобразить как “stdin program 1 program 2 stdout”. А в случае, когда используется всего лишь одна программа, вывод программы, стоящей до символа конвейера, перенаправляется в открываемый функцией “open” манипулятор, а вывод программы, стоящей за символом конвейера, никуда не перенаправляется и идет прямиком на терминал.
Сказанное позволяет продемонстрировать приведенный ниже код (на диске, прилагаемом к книге, он находится в файле “/SRC/pipe.test.pl”):
•open(FH,<>);
•if (FH)
•
•}
Строка «Этот текст прочитан из файла», предваряющая переменную $x, позволит отличить символы, получаемые чтением из файла, от текста непосредственно выводимого программой на экран.
•echo Hello, Sailor |
•Этот текст прочитан из файла:Hello, Sailor
•|echo Hello, Sailor!
•Hello, Sailor!
В первом случае, когда команда “echo” стоит до символа конвейера, результат ее работы направляется в открываемый функцией open манипулятор, откуда он может читается
оператором “<>” и выводится на экран вызовом “printf”.
В другом случае, когда команда “echo” стоит после символа конвейера, результат ее работы направляется в стандартное устройство вывода, и минует оператор “print”.
59) Использоване переменных в командных оболочках
Среда командной оболочки Cmd.exe определяется переменными, задающими поведение командной оболочки и операционной системы. Имеется возможность определить поведение среды командной оболочки или среды всей операционной системы с помощью двух типов переменных среды: системных и локальных. Системные перемен-ные среды определяют поведение глобальной среды операционной системы. Локальные переменные среды определяют поведение среды в данном экземпляре Cmd.exe. Системные переменные среды заданы заранее в операци-онной системе и доступны для всех процессов Windows XP. Только пользователи с привилегиями администрато-ра могут изменять эти переменные. Эти переменные наиболее часто используются в сценариях входа в систему. Локальные переменные среды доступны, только когда пользователь, для которого они были созданы, вошел в систему. Локальные переменные из куста HKEY_CURRENT_USER подходят только для текущего пользователя, но определяют поведение глобальной среды операционной системы. В следующем списке представлены различ-ные типы переменных в порядке убывания приоритета.
-Встроенные системные переменные
-Системные переменные куста HKEY_LOCAL_MACHINE
-Локальные переменные куста HKEY_CURRENT_USER
-Все переменные среды и пути указаны в файле Autoexec.bat.
-Все переменные среды и пути указаны в сценарии входа в систему (если он имеется).
-Переменные, используемые интерактивно в сценарии или пакетном файле
60)Ввод и вывод данных в командных сценариях
Чтобы работать в Linux с командами, вовсе не обязательно быть программистом. После знакомства с различны-ми программами, когда вы освоите работу с командной строкой и обнаружите, что постоянно вводите в команд-ную строку одни и те же выражения, сохраните эти командные строки в виде текстовых файлов и превратите их в сценарии (scripts) оболочки. В своей простейшей форме сценарий оболочки представляет собой одну или несколько наиболее часто используемых командных строк.
Рассмотрим следующий пример:
#rxvt -geometry 80*11+803+375 -bg write -fg black -e pico &
#rxvt -geometry 80*24+806+2 -bg write -fg black -e pine &
Эти две командные строки запускают редактор pico и почтовую программу pine в двух окнах терминала rxvt на втором рабочем столе экрана с разрешением 800*600. Можно с уверенностью сказать, что ввод подобных команд всякий раз, когда у вас возникает необходимость запустить эти программы - удовольствие небольшое. Хотя вам ничто не мешает после перехода к другому рабочему столу вручную запустить окна терминала, все же на уста-новку правильных размеров окон и запуск программ потребуется определенное время. Вы можете, однако, пре-образовать эти команды в исполняемые файлы, сначала сохранив их в виде файлов с помощью редактора, а затем применив к ним команду chmod:
# chmod +x d2
Теперь, когда у вас возникнет необходимость запустить эти программы, все что вам нужно сделать - ввести в командную строку выражение, проще которого вряд ли можно придумать:
# d2
Вы можете обеспечить этой новой команде большую гибкость за счет использования переменных оболочки $1 и $2, которые представляют первый и второй аргументы командной строки в команде оболочки. Отредактируйте созданный вами файл и замените имена
программ этими переменными:
#rxvt -geometry 80*11+803+375 -bg write -fg black -e $2 &
#rxvt -geometry 80*24+806+2 -bg write -fg black -e $1 &
Обратите внимание, что порядок переменных не имеет значения. Теперь при запуске команды вы можете под-ставить в командную строку имена программ, как в следующем примере:
# db2 pine pico
Результат этой команды точно такой, как и предыдущей, с той разницей, что теперь вы имеете возможность за-пускать в терминальных окнах практически любые программы.
С помощью оболочки можно быстро построить простые программы для решения насущных задач.