Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

шпоры флора

.pdf
Скачиваний:
8
Добавлен:
30.03.2015
Размер:
230.8 Кб
Скачать

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

Результат этой команды точно такой, как и предыдущей, с той разницей, что теперь вы имеете возможность за-пускать в терминальных окнах практически любые программы.

С помощью оболочки можно быстро построить простые программы для решения насущных задач.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]