Кто защитит тех, кто защищает нас?

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

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


Полную версию статьи
читай в майском номере
Хакера! Файлы и программы, упоминаемые в статье, ищи на нашем диске, так
же на диске к журналу ты найдешь видеоурок, демонстрирующий основные
шаги взломщика!

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии