В связи с массовым развитием такого СМИ как интернет, каждый проект, хозяева которого обладают деньгами, стремится раскрутится и в Сети и по сему его дизайн обычно доверяют проверенному агенсттву. Индивидуальный движок, как таковой, довольно таки сложно придумать но можно сделать один универсальный, изменяя только дизайн и некоторые незначительные фишки. Однако если с самого начала не позаботится о безопасности, то дело может зайти настолько далеко, что исправлять все будет проблематично и многие дорогостоящие проекты могут оказаться под угрозой.
Так произошло и на этот раз.
Все мы видели хоть раз тот чудовищный глаз… Мда, поэма… Так вот, видели мы глаз на остановках, в метро, на стенах домов Большой брат глядит за вами, кричали надписи. Мне же захотелось посмотреть на большого брата и я зашел на сайт TNTBRAT.RU.
Настроив в браузере подключении через прокси я забил в url адрес сайта, немного походя по ссылкам передо мной предстала статистика новостей по дням, кликнув наугад по одному из дней я перешел по адресу:
tntbrat.ru/bulletin/news/?day=5
Так, зацепка уже есть, добавив в url одинарную кавычку и перегрузив страницу браузер выдал:
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 '
Стало ясно, что скрипт хронически страдает sql-injection , а экранирование кавычек обычно не сильно мешает. Для начала я решил узнать сколько колонок таблицы используется в данном запросе, для этого я изменил строку в адресной строке браузера на:
tntbrat.ru/bulletin/news/?day=-1 UNION SELECT null/*
Показалась надпись:
The used SELECT statements have a different number of columns
Она ни чуть меня не огорчила и я стал пробовать дальше добавляя все новые null к запросу, в итоге после нескольких попыток скрипт не вывел никакой ошибки, что означало, что с первой задачей я справился, теперь по логике можно было попробовать угадать название таблицы с юзерами и вывести данные админа, но я решил для начала испытать права пользователя под которым подключается скрипт к БД, выстроив специально запрос к базе mysql (к которой обычно имеет права обращаться только root ).
tntbrat.ru/bulletin/news/?day=-1 UNION SELECT null,null,…,null FROM mysql.user/*
К моему удивлению скрипт опять не выругался это означало, что пароли к mysql почти у меня в руках. Запросив адрес:
tntbrat.ru/bulletin/news/?day=-1 UNION SELECT null,user,…, null FROM mysql.user/*
я узнал имена юзеров: root, proftpd, rb, tntbrat, tntbrat_forum.
После
tntbrat.ru/bulletin/news/?day=-1 UNION SELECT null, password,…,null FROM mysql.user/*
еще и хэши паролей. Наличие юзера proftpd меня несказанно обрадовало, ведь это означало, что пароли на ftp хранятся в БД. Но как назло я не помнил какие именно существуют таблицы в базе proftpd, оставалось только получить полноценный доступ к mysql, например через phpmyadmin. Загрузил хэши пользователей в passwordpro и пока он брутал пароли я решил проверить на открытость mysql извне, а иначе все мои старания по извлечению паролей mysql были бы равны нулю
[ShAnKaR@localhost ~]# nmap tntbrat.ru -p 3306
Starting nmap 3.70 ( www.insecure.org/nmap/ ) at 2005-05-18 23:23 MSD
Interesting ports on unknown-438.agava.net (81.177.6.124):
PORT STATE SERVICE
3306/tcp open mysql
Nmap меня обнадежил, порт был открыт, через 15 минут перебора passwordpro выдал пароль на трех юзеров root, tntbrat, tntbrat_forum. Попытавшись подключится через ранее залитый на левый сервак phpmyadmin к сайту под рутом меня ждала неудача в виде надписи «login incorrect». Такая же история произошла и с учетной записью tntbrat, но удача мне все-таки улыбнулась с третей попытки подключения под юзером tntbrat_forum. Это означало, что только этому юзеру разрешено подключение извне.
Передо мной предстала база tntbrat, похоже это была основная база сайта, где хранились данные всех участников шоу, рейтинг, данные зарегистрированных юзеров форума, сам форум и прочее. По привычке я сразу окинул таблицы глазами в поиске словосочетания users подобная таблица была site_users. Кликнув на 'обзор' я увидел данные этой таблицы, где первым зарегенным пользователем стоял root (а root всегда крут). Не долго думая я ввел его данные в поля авторизации на главной странице сайта tntbrat.ru, но в ответ только появилась ссылка в личный кабинет где ничего не было интересного. На всякий случай я решил проверить существует ли здесь какая-нибудь админка, набрав наугад:
tntbrat.ru/admin/
Админка была. Еще раз пройдя авторизацию по уже имеющимся данным я получил доступ к администрированию контента всего сайта это было уже что-то, можно было бы например сделать дефэйс и удалится , но мне оказалось мало и я решил попытаться загрузить свой php скрипт на сервак. После долгого тестирования админки на уязвимость я смог загрузить скрипт, но так как предполагалась загрузка файла в формате jpg, то мое расширение php безнадежно обрезалось и скрипт не исполнялся :(. Побродив еще немного я было уже отчаялся, но волею случая на мои глаза попался email админа- того самого root`а michael@*.ru. Зайдя на сервер *.ru (это был сервер агентства, занимающегося дизайном). Машинально перейдя в *.ru/admin/, я был приятно удивлен увидев приглашение ввести логин и пароль выполненные в том же стиле, что и на сайте tntbrat.ru, причем скормив формам те же данные я опять был пропущен в админку :). Админка была немного пообширнее, но на этот раз она сдалась и записала в недра севера мой скрипт- теперь я уже мог выполнять системные команды, хотя сервер был другой нежели чем у tntbrat.ru. Спустившись по директориям вниз до /home я увидел папки юзеров, по беглому осмотру стало понятно, что в них лежит содержимое сайтов.
Выполнив команду
#find /home -name conf*.php
я тем самым произвел поиск файлов с конфигами, в которых как я предполагал может быть пароль к mysql. Я не ошибся и первый же найденный конфиг открыл для меня пароль рута на mysql. Далее можно было бы загрузить сюда phpmyadmin, что я и хотел сделать, но сначала все-таки решил посмотреть какие же сайты хостятся здесь.
Выполнив команду
#locate httpd.conf
узнал, что конфиг apache хранится стандартно в /etc/httpd/conf/httpd.cong. Открыв его и по быстрому пролистав я не увидел ничего интересного, но мое внимание привлек сайт phpmyadmin.*.ru. Набрав этот адрес предо мной предстала форма авторизации. Введя данные рута я оказался в святая святых бд. Просмотрев быстро все базы я опять наткнулся на proftpd, вот и отлично подумал я вот теперь я смогу узнать заветные названия таблиц. Ими оказались users (как я раньше не догадался) и groups (уже не важно) и колонки в таблице users: userid и passwd где хранились данные об учетных записях, причем надо отметить, что пароли не были ни чем зашифрованы чувствовалась глобальная халатность админа.
Затем я решил проверить на существование хост phpmyadmin.tntbrat.ru (чем черт не шутит). Я оказался прав хост существовал, а пароль рута у меня был уже давно таким образом я поимел рута на mysql, и все пароли на ftp. Теперь я мог напрямую влиять на рейтинг тех ребят (выбить в лидеры понравившуюся диФчонку), но я пошел на поводу у совести и сообщил админу о найденных уязвимостях.