Ищем баги в медиа-ресурсах.....:)
Доброго дня или ночи, уважаемые комрады...
Легкий бред, для воскресного чтива в сети!?:)
1. Насилуем google...ищем допустим:
типа: site:magazine1.com filetype:php. Увы, этот запрос, равно как и запросы вида: site:magazine1.com warning failed и site:magazine1.com mysql error, которые, по идее, должны отобразить страницы с ошибками, могут ничего и не дать....
2. Врубаем любой сканер и смотрим результаты "рыбалки", Наружу могут быть открыты всего два порта: 80 и 443, а из дополнительной информации может быть получено: версия апача, файл robots.txt, crossdomain.xml, в котором будут прописаны доверенные домены, и папка admin с basic-авторизацией. Никаких phpinfo, папок test, misc допустим нет!?. Из полезной информации также можем получить, что у медиакомпании в управлении две сетки с адресами 209.108.50.* и 209.108.51.*. Рабочие сайты крутятся допустим: на 209.108.50.111 и 209.108.51.16, таким образом, можно запустить сканер на проверку всех IP-адресов в этих сетях в надежде найти тестовые серверы, где, возможно, присутствуют баги.
3. Запускаем браузер - запустив Tamper Data, начинаем изучать содержимое. После двух часов анализа мы можем понять, что сайты этой медиасети крутятся на какой-то CMS, скорее всего самописной, а также, что, вполне вероятно, найти в ней уязвимость не получится. Напоследок заходим в раздел site_map.
Ссылка вида http://magazine1.com/site_map/category_3245 сразу же заставляет провести нехитрую математическую операцию вида: http://magazine1.com/site_map/category_3246-1 Радости нет предела, если увидим, что результаты одинаковы. После этого, используя конструкцию - orber by, сразу выясняем, что в запросе участвует 28 полей, а затем, заюзав - union select, узнаем, что третье поле выводится в браузер. Теперь нам необходимо, узнать версию MySQL-сервера, базу и пользователя, от которого идут запросы к базе:
http://www.magazine1.com/site_map/category_3245 union select 1,2,concat(user(),0x3a,version(),0x3a,database()),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
Из ответа мы можем узнать что имя пользователя wwwuser, версия MySQL — 5.1.40, а база данных именуется ezine. Увидев версию MySQL, командуем:
http://www.magazine1.com/site_map/category_3245 union select 1,2,concat(schema_name,0x3a,table_name,0x3a,column_name),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 from information_schema.columns limit 1,1
А вот ответ совсем удовольствия может не принести: пустая страница говорит о том, что доступ этому пользователю к чтению служебных таблиц запрещен. Вот это будет действительно удар! Грамотная настройка MySQL в крупных компаниях — это скорее исключение, чем правило. На моей практике такая ситуация встречается максимум раз пять из десятка. Иногда, конечно, попадается запрет на чтение information_schema.tables, и в таких случаях обращение к таблице columns позволяет обойти досадное ограничение. Но не сейчас. Остается только попробовать сбрутить названия таблиц и полей в них.
(Примеры "брутов" не приводятся - для уменьшения фактора - школоты, которая начнет нападать на невинные медиа-ресурсы:)))) )
4.
И так: Подходим к компьютеру после отдыха, и видим, что программка брута нашла таблицу users и два поля в ней — email и password. Всего учетных записей примерно - 1290. Все почтовые ящики принадлежат к доменам компании, появляется надежда на то, что полученные результаты можно будет применить к папке admin. Пароли допустим зашифрованы - зашифрованы DES’ом, поэтому для дальнейшей работы переданы в John :). Через пару часов Джон расхешит более половины пассов, и данные могут переданы бруту. Проверка шла по basic-авторизации. И снова облом! Ни одна учетная запись не подошла, НО не рвем шерсть, сами знаете на каком месте:(. Сам факт инъекции на продакшн-сервере говорил о том, что бага не последняя....:)
5.
Как я говорил выше, сайты, принадлежащие компании, находились в двух сетях класса С. Смотрим живые хосты в сетях, и решаем попробовать получить инфу о сайтах через инструмент Reverse IP domain check ресурса yougetsignal.com. Первые два десятка хостов оказались неинтересными, ибо при заходе выдавали страницу подписки, а yougetsignal не имел инфы о данных IP-адресах.
А вот на третьем десятке улыбается удача. Полезный ресурс выдал, что на данном IP крутится девять сайтов, причем часть из них не была указана в разделе Magazines. Начав по очереди открывать сайты в браузере, понимаем, что попадаем на один из тестовых серверов. Некоторые сайты не открывались, какие-то были полуживые, а некоторые функционировали нормально. Также был найден WordPress версии 2.3.1 без возможности регистрации.
Теперь, начав терзать гугл более целенаправленно, получаем более интересные результаты. Например, сканер может показать, что ему известно о stylewar.magazine2.com, и в ответ получилм около двадцати ссылок, часть из которых выводит ошибки на странице, а другая часть содержит ссылки с параметрами. Одной из них может быть такая вот ссылка: http://stylewar.magazine2.com/styles/account/782855. Правда, на самой страничке никакой полезной информации не выводится, но, подставив кавычку в запрос, получаем и вывод самого SQL-запроса, и вывод всех ошибок.
Ну что же, бага есть — будем раскручивать. Order by сообщил, что в запросе участвует всего одно поле, а union select, со своей стороны, любезно добавил, что это поле в браузер не выводится. Опять двадцать пять, ну никак не получается легкой победы. Прийдется использовать error-based технику. В итоге запрос, выводящий название базы и имя таблицы, получаем следующим:
http://stylewar.magazine2.com/styles/account/-1 order by (select 1 from(select count(*),concat((select concat(table_schema,0x3a,table_name) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
А запрос, выводящий логин и пасс админа, выглядит следующим образом:
http://stylewar.magazine2.com/styles/account/-1 order by (select 1 from(select count(*),concat((select concat(username,0x3a,password) from starup.users limit 0,1),floor(rand(0)*2))x from starup.users group by x)a)
А сами логин и пасс могут быть следующими:
:24f1d7bec343596cf0a74011ab92d2ca
Как Вы можете видеть, пароль представляет собой обычный MD5-хеш. И уже через 15 секунд гугл сообщил, что это слепок от пароля promtime. Ну что же, есть логин и пасс администратора, и следующий вполне закономерный шаг — это поиск собственно самой админки. Для этого я использовал шустрый сканер файлов и папок. Так вот, буквально через пару минут он сообщил, что админка находится в папке cms. Отлично, вперед к новым свершениям....
За время исследования не пострадал ни один работающий сетевой ресурс...Имена ссылок, IP и многое другое изменено,;) в целях сетевой безопаности!!!
Автор благодарит за предоставленную возможность, "размять пальцы на клаве", своего хорошего друга из Австралии!:)
Комментировать