Содержание статьи
Кто защитит тех, кто защищает нас?
Хочешь по-настоящему ролевого и экстремального взлома? Желаешь одним глазком
взглянуть на работу слаженной хакерской команды? Тогда пристегнись! На твоих
глазах хакеры пробираются в самое сердце центрального сервера компании 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&lang= [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
Внимание! Информация представлена исключительно с целью ознакомления! Ни
автор, ни редакция за твои действия ответственности не несут!
|