В горячем сердце файервола: взлом портала популярного брандмауэраmisterBlack и misterWhite Хакер, номер #113, стр. 113-058-1 Кто защитит тех, кто защищает нас? Хочешь по-настоящему ролевого и экстремального взлома? Желаешь одним глазком взглянуть на работу слаженной хакерской команды? Тогда пристегнись! На твоих глазах хакеры пробираются в самое сердце центрального сервера компании Agnitum! Да-да, именно Agnitum.com – производителя популярного файервола. Известен уже не первый случай, когда на сайтах производителей антивирусов обнаруживают трояны. Еще веришь в защищенность, конфиденциальность и надежность? Сейчас ты увидишь, как хрупкая цепочка багов, казалось бы, незначительных по отдельности, разрушит миф о неприступности компаний, специализирующихся на сетевой безопасности. Рекогносцировка на местностиЗдесь и далее: misterBlack, misterWhite – это два молодых человека, состоящих в одной хакерской группе. Псевдонимы выбраны совершенно случайно, без подоплеки или злого умысла. Как водится, хакеры ведут поиски ресурса-жертвы и обмениваются ценной информацией. misterBlack: Вечер. Свет монитора. Окинув взглядом иконки на рабочем столе, я почему-то остановился на Outpost Firewall. «Хм... чем не вариант?» - подумал я. Зайдя на Agnitum.com, пошарился минут 10. Следующий сайт – agnitum.ru, за ним – он же, в зоне FR... багов нигде не обнаружено. Но вот клацнув на ссылку Polski в верхнем углу, я попал на outpost.pl. Беглый анализ сайта обнаружил движок (это уже хорошо) – Joomla 1.0.9. Глянув эксплоиты под эту версию, я уже было обрадовался, но IP-адреса agnitum.com и outpost.pl оказались разными, а значит – снова облом. Тогда я решил посмотреть, какие соседи были на сайте (используя ресурс seologs.com/ip-domains.html), не особо, впрочем, рассчитывая на удачу, ибо проекты такого уровня, как правило, имеют собственный сервер, и никаких левых сайтов там априори быть не может. Но не в этот раз! В списке доменов присутствовал одинокий aboutphone.info, (а что, это шанс). Первоначальный осмотр сайта на предмет взлома не обрадовал. Настораживала лишь надпись «Контент, программирование © Anatoly Skoblov, 2001-2004», свидетельствующая о явной заброшенности ресурса. Все было написано на чистом HTML (никаких скриптов). Однако ссылка «форум» привела меня на aboutphone.info/phorum, где PHP-скрипты определенно были. Напрашивалась мысль о самописности ресурса, но дальнейший просмотр исходного кода страницы показал: «Phorum» – это название форума. Версия со 100% точностью была определена с помощью meta-тегов.
Удача была на моей стороне. Проверка багтреков выдала множество разных уязвимостей. Я решил заострить внимание на самой удачной. Critical SQL-inj uriauth() Phorum<=3.4.7 В описании бага был пример эксплуатации: http://localhost/phorum347/list.php?f=1&phorum_uriauth=waraxe %2527%20AND%20mid(password,2,1)=3/*:foobar но когда я подставлял разные значения, ничего не происходило. Странно! Была уже ночь, глаза залипали, и, следуя русской поговорке "Утро вечера мудренее", я решил оставить разбор полетов на следующий день. Hack-dayПроснувшись и сев за комп, я открыл асю и обнаружил в Сети misterWhite'а, давненько не появлявшегося онлайн... misterWhite: Да не исчезал я! Не поддамся на провокации мирабилисов и не стану хранить контакт-лист на их сервере! Утро. Никого не трогаю, тихо-мирно читаю утреннюю RSS. Скука... Agnitum? Да, это будет интересно! misterBlack: Уяснив ситуацию, он согласился помочь, и взлом был продолжен общими силами. misterWhite начал с SQL, причем у него она работала, а у меня нет. И я не понимал в чем же дело, пока не прочитал: ICQ-log misterBlack: так не видать разницы misterWhite: Мне уже приходилось ковырять Phorum. В багтраке форумов он стоит в десятке лидеров по дырам. Последняя версия 5-ой ветки была отполирована до блеска, и знакомые помнят, каких усилий мне стоило выполнить произвольный код. Но здесь речь шла об устаревшей 3-ей ветке, к тому же ветхой версии. Полный анализ любого движка стоит огромных усилий, потому перспектива ковырять древний, как мамонты, двиг ради одного случая как-то не грела. Но в этот раз цель оправдывала затраты сил и времени. Первым делом я перетряхнул свои подборки на Phorum, проверил по поиску багтраки. Гугл выплюнул меня на секфокус к той же баге с uriauth() от наших эстонских «коллег» (хак-группа waraxe). Внимательно почитав адвизори, я запомнил фразу: «..if there is empty $admin_session and not exists COOKIE variable $phorum_cookieauth, then (and only then) urldecoded $phorum_uriauth will be exploded..» и match определения ответа: «Before testing user must be logged out.» В общем, читайте внимательно! Сходу зарезав Одиссеем куки, я обратился по адской ссылке, пролистнул страницу вниз и улыбнулся победному «Выйти с форума». Скуль была налицо, и теперь логичным было бы загрузить шелл. Однако я точно помнил, что даже 5-ая ветка форума не поддерживала загрузку аватар, да и аплоад аттачей был по дефолту запрещен. И файло грузилось прямо в БД. Оставалось надеяться, что нововведения 5-ой ветки были именно нововведениями. Проверить это можно было только после разбора двига по винтикам. Пояснив misterBlack’у фичу с куками и предоставив ему возможность сбрутить хеш админа, я принялся копать двиг на возможность инклуда и исполнения кода... misterBlack: Эксплоита к уязвимости не прилагалось. Однако писать его не пришлось. Ссылки на рабочий эксплоит висят в топе гугла даже выше официального сайта производителя форума. Не составило труда слить сплоит с первого попавшегося «портала по безопасности» и слегка изменить код под наш случай. Эксплоит шустро выдрал админский хеш, который благополучно был сбручен на www.plain-text.info. Но админка была переименована, и тогда я принялся за брут значений из БД (версия мускула, юзер и т.п.) и поиск админки. А misterWhite в это время начал ковырять двиг форума в поисках других багов и искать способы заливки шелла. Выяснилось, что на сервере стоит MySQL 4.0. Эта версия не позволяет использовать подзапросы к БД. Вдобавок, что весьма огорчало, File_Priv был установлен для текущего юзера БД в false. misterWhite: Теперь у нас был пароль админа. Но вот незадача: в Phorum существует возможность разместить админку в произвольной папке. Ни одна ссылка в нее не ведет и, не зная точного пути, попасть туда невозможно. Это своеобразная защита от взлома. Я временно сосредоточил свои усилия на поиске раскрытия переменной $PHORUM[admin_url], которая вела к заветной админпанели, а misterBlack тем временем мучил госпожу удачу и брутил путь по словарю. И вот кодокопание приносит результат! Дело в том, что, ответив единожды в любой теме, можно при постинге указать «получать уведомление об ответах на мыло». Причем, админам и модерам оно приходило с прямыми линками в админку на модерирование/удаление поста. Сменив мыло админа на свое, я выбрал произвольную тему и отпостил что-то вроде «да, была такая же проблема». Затем зарегал юзера и ответил в теме. Однако письмо на мыло упорно не приходило. misterBlack: Наконец брут путей до админки приносит результат! Она находится по адресу http://aboutphone.info/phorum/control. Все это занимает около 2 часов, к этому моменту misterWhite заканчивает анализ двига. Хорошей новостью от misterWhite’a было и то, что файлы все-таки сохраняются не в БД, а на винт. Значит, их можно будет проинклудить. Увы, багов, которые можно было бы заюзать на этом сервере без админки, не было. Несколько инклудов, конечно, имелось, но версия PHP 4.4.7 не позволяет их применить. misterWhite: Найденные инклуды основываются на unset()-баге (читай предыдущие номера ][акера) PHP <= 4.4.3, 5.1.4 /phorum3.4.x//phorum/index.php?PHORUM[settings_dir]= [RFI]?&-1267903400=1&-1079377568=1 misterBlack: Мы в админпанели! Попав туда, misterWhite добавляет тип «.php» в доступные расширения на заливку аттачей, и дело за малым – прикрепить шелл к одному из сообщений админа. Но встает новый вопрос: «Куда зальется шелл?» (ведь прямого линка на него не было). Был только путь по типу «www.aboutphone.info/phorum/download.php?1,57/SS7.jpg». Смотрим исходник. Генерация урла для аттача происходит по следующему алгоритму:
С $AttachmentDir мы разобрались быстро. Он был прописан в админке и установлен таким: /attach_from_phorum. Итак, часть пути известна. А вот с $ForumTableName нас поджидал новый миниквест. misterWhite: Для каждой новой ветки форума динамически создается отдельная таблица в БД. Как можно догадаться, $ForumTableName и есть переменная, хранящая загадочное имя таблицы. Изменение имени таблицы через «ALTER TABLE» не предусмотрено в редактировании настроек форума. Поэтому имя таблицы не выводится и узнать его даже из админки невозможно. misterBlack: Я хотел снова врубить брут и параллельно раскапывать код на предмет определения имени таблицы. Но тут произошло следующее: ICQ-log: misterWhite: я вспомнил В куках действительно хранится название таблицы форума, в данном случае «ph1». Путь до папки с аттачем был найден. Защитного .htaccess в аплоде не лежало, и мы могли напрямую обращаться к шеллу без всяких инклудов. Шелл получен, но тут мы наткнулись на проблему SAFE_MODE=ON и жесткий запрет на выход из папки /home/sites/home/users/skoblov/. Поползав по каталогам этого юзера, не нашли ничего, что могло бы дать больше прав. Впрочем, после вызова phpinfo() стало ясно – к апачу прикручен mod_include (возможно SSI исполнение команд). А посмотрев содержимое .htaccess в корневой папке юзера, я понял, что модуль не только подключен, но и исправно функционирует: AddHandler server-parsed .txt То есть, текстовые и html-файлы обрабатывались через ExecCGI. А это значит, что мы можем исполнять команды в обход сейфмода! Загрузив test.txt с содержимым
и обратившись к нему, я увидел в ответ заветное: Linux s1.agnitum.com 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 Теперь нам уже дают гулять по серваку за пределы /skoblov. Но прав на просмотр подавляющего большинства папок и файлов все равно не хватает. misterWhite: Конфигурационные файлы апача не удается прочитать, и мне по-прежнему неизвестен расклад прав и раздача uid/guid. По собственному опыту я замечал, что иногда раздача прав зависит от домена, а иногда – от uid/guid самого скрипта. Я предположил, что, если залить шелл в папку, доступную с другого домена, то сервер может стать к нам более демократичным. Так и произошло. misterBlack: Далее была найдена папка на запись, доступная с Agnitum.com. После обращения к новому шеллу настроение заметно поднялось – здесь красовалось зеленое «Safemod OFF»! Теперь хватало прав на просмотр многих желанных папок и скриптов с правами agnitum/agnitum. Ползая по серверу в поисках коннектов к БД, выяснили, что сайты Агнитума основаны на Битриксе и юзают как MySQL, так и PostgreSQL. PostgreSQL 7.4.17 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-3) misterWhite: PostgreSQL – это вам не шутки. Тут сложнее ориентироваться в БД, чем в мускуле. Для навигации по базе требуется помнить названия кучи таблиц. Однако их можно посмотреть в information.schema, знакомой нам по mssql и mysql5. Потому, осознав нерациональность r57 и cyberlordsSQL, я доверил дело misterBlack’y. misterBlack: Тогда я залил phpPgAdmin, и мы пошли шариться по БД. Здесь были данные на сотрудников, мыла, телефоны, места жительства, пароли от внутренних сервисов сайта, личная переписка. Валялось несколько сотен ключей, просроченных с 2005/2006 года. Новых ключей не было, как и программ для их генерации. Современные ключи, как оказалось, хранятся на сайтах партнеров по продажам софта, например Softkey.ru. Решив, что этого достаточно, мы свалили оттуда, предусмотрительно потерев все, что загружали. misterWhite: Могу еще отметить, что на сервере:
Думаю всем ясно, что, используя эти пароли, можно подменить апдейты и дистрибутивы на протрояненные. Также я не рекомендовал бы support’у использовать дырявую джумлу и вордпресс любой версии в своих проектах во избежание появления аналогичных статей, не говоря уже о допотопных движках. Никакой display_error=OFF вас не спасет. Пренебрежение директивой open_basedir и disable_functions заканчивается печально. Ну зачем, зачем вам последняя версия PHP, если вы не используете ее багфиксы??? Как итог на этот раз – всего лишь слегка подмоченная репутация. Happy End!misterWhite: Настало время мне объясниться. Почему я не сделал бэкконект? Не брал рута? Не протроянил дистрибутивы? Не проифреймил индекс, в конце концов, а просто закрыл браузер после получения шелла? Может, потому что аптайм у сервера достигал 300? Или потому, что Agnitum – достойная российская компания? Нет. Прежде всего, потому что админ такой же человек, как и я. К его чести, он все-таки позаботился о защите и разграничении прав. В процессе ни один байт данных не был поврежден. Мы не вандалы :). SQL на сайте в Phorum я пропатчил (на всякий пожарный) и после отписал в службу поддержки о найденных уязвимостях. misterBlack: Итог взлома показывает, что даже те, кто защищает нас от сетевых атак и берет за это деньги, зачастую не могут достойно защитить самих себя. Так что, господа, спастись от атак вам поможет только собственная паранойя, внимательность и аккуратность. В общем, берите пример со своего же файервола! :) INFOphpPgAdmin – удобный инструмент для управления PostgreSQL базами данных.
Рекомендую. Подробнее о разделении прав в PHP. Уникальный онлайн сканер, использующий симбиоз гугла и базы поисковых
запросов. Хм, domainsdb.com не функционирует, а на www.seologs.com ввели капчу? Тогда используй этот сервис: http://search.msn.com/results.aspx?first=1&FORM=PERE&q=ip%3A77.88.21.11 WARNINGВнимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несут! |