Информационные технологииStfw.Ru 🔍

В горячем сердце файервола: взлом портала популярного брандмауэра

Кто защитит тех, кто защищает нас? misterBlack и misterWhit
🕛 16.06.2008, 11:57
Хочешь по-настоящему ролевого и экстремального взлома? Желаешь одним глазком взглянуть на работу слаженной хакерской команды? Тогда пристегнись! На твоих глазах хакеры пробираются в самое сердце центрального сервера компании 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-тегов.

<meta name="PhorumVersion" content="3.4.3a" />
<meta name="PhorumDB" content="mysql" />
<meta name="PHPVersion" content="4.4.7" />

Удача была на моей стороне. Проверка багтреков выдала множество разных уязвимостей. Я решил заострить внимание на самой удачной.

Critical SQL-inj uriauth() Phorum<=3.4.7
www.securityfocus.com/archive/1/360635

В описании бага был пример эксплуатации:

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: ну, форум тебе сразу при открытии куку ставит в браузер, и приехали
misterWhite: надо вырезать куки phorum_cookieauth. Это особенность эксплоита

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
/phorum3.4.x/phorum/index.php?PHORUM[f]= [LFI]&-1267903400=1&-1079377568=1
/phorum3.4.x/download.php?PHORUM[fileid]= [LFI]%00.txt&-1267903400=1&-1079377568=1
/phorum3.4.x/admin/index.php?help=123&#9001;= [LFI]

misterBlack:

Мы в админпанели! Попав туда, misterWhite добавляет тип «.php» в доступные расширения на заливку аттачей, и дело за малым - прикрепить шелл к одному из сообщений админа. Но встает новый вопрос: «Куда зальется шелл?» (ведь прямого линка на него не было).

Был только путь по типу «www.aboutphone.info/phorum/download.php?1,57/SS7.jpg».

Смотрим исходник. Генерация урла для аттача происходит по следующему алгоритму:

$info=$HTTP_SERVER_VARS["QUERY_STRING"];
$file=basename($info);
$args=explode(",", basename(dirname($info)));
$fileid=(int)$args[1];
$filename="$AttachmentDir/$ForumTableName/$fileid".strtolower(strrchr($file, "."));

С $AttachmentDir мы разобрались быстро. Он был прописан в админке и установлен таким: /attach_from_phorum. Итак, часть пути известна. А вот с $ForumTableName нас поджидал новый миниквест.

misterWhite:

Для каждой новой ветки форума динамически создается отдельная таблица в БД. Как можно догадаться, $ForumTableName и есть переменная, хранящая загадочное имя таблицы. Изменение имени таблицы через «ALTER TABLE» не предусмотрено в редактировании настроек форума. Поэтому имя таблицы не выводится и узнать его даже из админки невозможно.

misterBlack:

Я хотел снова врубить брут и параллельно раскапывать код на предмет определения имени таблицы. Но тут произошло следующее:

ICQ-log:

misterWhite: я вспомнил
misterWhite: в куках было что-то странное
misterWhite: ага)
misterWhite: http://aboutphone.info/attach_from_phorum/ph1/

В куках действительно хранится название таблицы форума, в данном случае «ph1».

Путь до папки с аттачем был найден. Защитного .htaccess в аплоде не лежало, и мы могли напрямую обращаться к шеллу без всяких инклудов. Шелл получен, но тут мы наткнулись на проблему SAFE_MODE=ON и жесткий запрет на выход из папки /home/sites/home/users/skoblov/. Поползав по каталогам этого юзера, не нашли ничего, что могло бы дать больше прав. Впрочем, после вызова phpinfo() стало ясно - к апачу прикручен mod_include (возможно SSI исполнение команд). А посмотрев содержимое .htaccess в корневой папке юзера, я понял, что модуль не только подключен, но и исправно функционирует:

AddHandler server-parsed .txt
AddHandler server-parsed .html

То есть, текстовые и html-файлы обрабатывались через ExecCGI. А это значит, что мы можем исполнять команды в обход сейфмода! Загрузив test.txt с содержимым

<!-#exec cmd="uname -a"->

и обратившись к нему, я увидел в ответ заветное:

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:

Могу еще отметить, что на сервере:
* встречались фрагменты закрытых исходных кодов продуктов кампании; * символические линки в /etc/init.d и /etc/rc.d/ доступны на запись, что пахнет рутом, хотя для такого ядра все решается банальным ядерным эксплоитом; * кривые права на конфиги proftpd позволили получить хеши юзеров, впоследствии часть из них была успешно дешифрована;

Думаю всем ясно, что, используя эти пароли, можно подменить апдейты и дистрибутивы на протрояненные.

Также я не рекомендовал бы support’у использовать дырявую джумлу и вордпресс любой версии в своих проектах во избежание появления аналогичных статей, не говоря уже о допотопных движках. Никакой display_error=OFF вас не спасет.

Пренебрежение директивой open_basedir и disable_functions заканчивается печально. Ну зачем, зачем вам последняя версия PHP, если вы не используете ее багфиксы???

Как итог на этот раз - всего лишь слегка подмоченная репутация.
Happy End!

misterWhite:

Настало время мне объясниться. Почему я не сделал бэкконект? Не брал рута? Не протроянил дистрибутивы? Не проифреймил индекс, в конце концов, а просто закрыл браузер после получения шелла? Может, потому что аптайм у сервера достигал 300? Или потому, что Agnitum - достойная российская Корпорация?

Нет. Прежде всего, потому что админ такой же человек, как и я. К его чести, он все-таки позаботился о защите и разграничении прав. В процессе ни один байт данных не был поврежден. Мы не вандалы :). SQL на сайте в Phorum я пропатчил (на всякий пожарный) и после отписал в службу поддержки о найденных уязвимостях.

misterBlack:

Итог взлома показывает, что даже те, кто защищает нас от сетевых атак и берет за это деньги, зачастую не могут достойно защитить самих себя. Так что, господа, спастись от атак вам поможет только собственная паранойя, внимательность и аккуратность. В общем, берите пример со своего же файервола! :)
INFO

phpPgAdmin - удобный инструмент для управления PostgreSQL базами данных. Рекомендую.
http://phppgadmin.sourceforge.net/?page=download

Подробнее о разделении прав в PHP.
http://www.suphp.org
suPHP представляет собой сочетание модуля Apache (mod_suphp) и выполняемого файла. За счет их совместной работы можно выполнять PHP-сценарии с правами их владельца. Модуль suPHP не использует модуль Apache suExec и поддерживает функцию журнализации. По производительности suphp работает медленнее, чем mod_php в 25 раз, но является хорошей заменой для suexec (тот медленнее в 36 раз).

Уникальный онлайн сканер, использующий симбиоз гугла и базы поисковых запросов.
http://madnet.name/tools/madss/

Хм, domainsdb.com не функционирует, а на www.seologs.com ввели капчу? Тогда используй этот сервис: http://search.msn.com/results.aspx?first=1&FORM=PERE&q=ip%3A77.88.21.11
WARNING

Внимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несут!

Информационная безопасность   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉