Новая веха в теории инклуда. Свежие способы раскрутки local и remote file includeМаг (icq 884888, http://wap-chat.ru) Спроси себя: что ты знаешь об удаленном или локальном инклуде? Наверняка, в ответе будут следующие фразы: «обрезание неугодного расширения с помощью нулл-байта», «инклуд файлов сессии из /tmp, картинок с шеллом, логов апача...». Спешу заверить, что это далеко не все способы выжать из инклуда абсолютный максимум! Сейчас я в подробностях расскажу о недавно опубликованных интереснейших способах эксплуатации этого распространенного бага. Протокол «Data»Первым делом хочу познакомить тебя с отличным способом обхода множества хитрых фильтраций при удаленном инклуде. Сей способ заключается в использовании протокола Data (для понимания протокола желательно изучить RFC 2397, ссылки на который, как всегда, ищи в сносках). Итак, представь, что в исследуемом php-скрипте (php>=5.2.0 - именно с этой версии включена поддержка data и других протоколов) содержится следующий код:
Кажется, что в этой ситуации не прокатит никакой удаленный инклуд. Ведь, кроме того, что режутся стандартные 'http://','ftp://', под нож фильтра попадают еще и точка со слешем! Этот код вполне успешно покажет тебе вывод функции phpinfo()! Но что делать, когда фильтрация становится еще более жесткой и принимает примерно следующий вид?
Ты снова можешь подумать, что здесь невозможно выполнить произвольный php-код (даже по приведенному выше сценарию), так как фильтром режутся практически все символы, используемые в нашем evil-коде. Но не тут-то было. Уже полюбившийся тебе протокол «data» поддерживает такую полезную вещь, как base64 (кстати, если фильтруются и символы «+», «=», наверняка, ты сможешь подобрать base64-значение своего шелла без них).
И вновь на экране phpinfo()! Но нельзя останавливаться на одном лишь RFI. Приготовься к самому вкусному. Услужливый /proc/self/environПредставь, что на определенном сайте (
Затем вообрази, что возможности залить файл/картинку с шеллом у нас нет, пути к логам апача мы не нашли, а в /tmp не сохраняются данные сессий. Соседних сайтов также нет. Что делать? Неискушенный в LFI хакер опустил бы руки. Мы не из таких, ибо на помощь спешит хранилище переменных окружения /proc/self/environ! Итак, когда мы запрашиваем любую php-страничку на сервере, создается новый процесс. В *nix-системах каждый процесс имеет свою собственную запись в /proc, а /proc/self, в свою очередь, – это статический путь и символическая ссылка, содержащая полезную информацию для последних процессов. Если мы инжектнем наш evil-код в /proc/self/environ, то сможем запускать произвольные команды с помощью LFI :). Заманчиво? А теперь, собственно, вопрос: каким образом можно вставить свое значение с evil-кодом в /proc/self/environ? Очень просто! Тем же способом, каким ты инжектишь свой код в логи апача, можно проинжектить код и в /proc/self/environ. Для примера возьмем наш любимый и легко подменяемый юзерагент. По дефолту часть /proc/self/environ, показывающая useragent, выглядит примерно так:
А теперь меняем юзерагент на Как и следовало ожидать, функция phpinfo() успешно выполнится. При этом часть /proc/self/environ с юзерагентом будет выглядеть так:
Метод всем хорош, кроме того, что строка юзерагента и evil-код должны быть внедрены быстро и одновременно (так как твой код в /proc/self/environ легко сможет изменить любой другой только что запущенный процесс). Поэтому, намотав вновь полученные знания на ус, переходим к следующему способу. Логи, мы вас найдем!Снова представь, что у нас есть сайт с локальным инклудом, но проинклудить ничего не получается. Как узнать местонахождение апачевских access_log и error_log? По секрету скажу, что знать, где они лежат, вовсе не обязательно! Для нас постарался все тот же /proc, ведь здесь расположена удобная символическая ссылка на реальную локацию логов apache. Использовать ее для инклуда можно несколькими способами: 1. Через id процесса и ярлыки Здесь: %{PID} - ид процесса (узнать можно, прочитав /proc/self/status), %{FD_ID} - ярлыки на соответствующие файлы (обычно 2 и 7 - логи апача). Допустим, %{PID} равен 1228, тогда конечный эксплойт будет выглядеть следующим образом: 2. Напрямую, без узнавания id процесса Этот способ более приемлем для тебя, так как «self» - это всегда текущий процесс, а в первом случае %{PID} имеет дурное свойство очень часто меняться. В обоих перечисленных способах, как и в любом другом LFI логов апача, эти самые логи, естественно, должны быть доступны для чтения. Полезное мылоНа этот раз тебе необходимо представить, что на сайте жертвы не работают все предыдущие способы LFI. Невероятно и страшно! Но такие случаи действительно бывают, и итальянские хакеры secteam смогли придумать удивительный способ инклуда через обычный e-mail! Итак, большинство типичных веб-приложений содержат в себе функцию отправки мыла в качестве части регистрационной системы, каких-либо подписок и т.д. Зачастую юзер может изменять содержимое такого письма. В то же время никсы могут сохранять такое мыло локально. Сама техника LFI через mail выглядит следующим образом:
В итоге, отправленное мыло будет лежать в /var/mail (либо в /var/spool/mail) и иметь название юзера httpd. Вот эксплойт для этого способа: Также, стоит отметить, что mail-файл будет доступен только тому юзеру, кому и предназначено письмо (то есть, апач должен быть обязательно запущен под тем же пользователем). Null-байт отдыхаетСнова включи воображение и представь, что все вышеописанные способы отлично работают, но уязвимое приложение содержит на этот раз следующий код:
Как быть? Можно проинклудить логи, но в конце дописывается не обрезаемое обычным %00 расширение «.php». На этот раз тебе поможет фича (или все-таки уязвимость?) самого php, обнаруженная юзером популярного забугорного хакерского форума sla.ckers.org со странным ником barbarianbob. Фича заключается в том, что интерпретатор php во время обработки пути до какого-либо файла или папки обрезает лишние символы «/» и «/.», а также, в зависимости от платформы, использует определенное ограничение на длину этого самого пути (ограничение хранится в константе MAXPATHLEN). В результате, все символы, находящиеся за пределами этого значения, отбрасываются. Теперь давай подробней рассмотрим этот вектор LFI, обратившись к уязвимому скрипту следующим образом: Наш любимый phpinfo(); выполнится успешно из-за нескольких причин. 1. Инклуд в самом скрипте примет следующий вид –
2. Так как наш путь получится гораздо длиннее, чем MAXPATHLEN (кстати, необязательно он будет равен именно 4096; в винде, например, он может быть равен всего лишь 200 символам с хвостиком, – советую на каждой системе тестить это значение отдельно), то символы, находящиеся в конце пути (в данном случае - некоторое количество слешей и «.php»), интерпретатор php, не спрашивая ни у кого разрешения, успешно отсечет. 3. После пункта «2» наш код примет примерно такой вид:
Как тебе уже известно, лишние слеши в конце пути услужливый php также обрежет, и наш злонамеренный код, в конце концов, превратится во вполне рабочий LFI!
Для теста количества слешей для использования в данной уязвимости на своем сервере советую попробовать следующий php-скрипт.
Рядом со скриптом просто положи файл work.txt с записанной в нем единичкой. Если инклуд произошел успешно, скрипт выведет тебе количество слешей, использованных для этого самого инклуда. Для полноты понимания технических сторон данного бага советую очень внимательно изучить соответствующие ссылки в сносках. И напоследок...Как видишь, прогресс в ресерчинге уязвимостей не стоит на месте. Новые баги находятся уже не в php-скриптах, а в самом интерпретаторе php! То, что раньше, казалось, взломать невозможно, сейчас представляется не более чем детской шалостью и развлечением для матерого хакера. Null-байт уже практически канул в лету, инклуд логов апача обрастает новыми изощренными методами, RFI становится доступным через протоколы, отличные от ftp и http... Что дальше? Поживем - увидим. Естественно, в наших рубриках :). INFOСпасибо Античату за раскопки описанных уязвимостей. LFI/RFI или просто «Local/Remote File Include» - наиболее часто встречающаяся уязвимость в php-скриптах. WWW
VIDEOНа диске ты найдешь увлекательный видеоурок, позволяющий на практике увидеть перечисленные в статье способы инклуда. DVDВсе скрипты и примеры инклудов, упоминающихся в статье, ищи на диске. WARNINGВнимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несут! |