Конец декабря и начало нового года для компании Microsoft выдались несладкими: уязвимость в ядре Windows (EnableEUDC), о которой уже было написано в прошлом выпуске, так и не запатчена, плюс к ней добавилась целая пачка свежих нульдеев, о которых я спешу рассказать в этом обзоре.

Итак, вот краткий таймлайн выхода в свет информации об уязвимостях:

  • 21-го декабря публикуется PoC, который валит FTP-сервис, входящий в пакет IIS 7.5;
  • 22-го декабря на китайском хакерском сайте wooyun.org публикуется информация об уязвимости в ActiveX’е WMI Administrative Tools;
  • 27-го декабря известный хакер Андреа Микалицци, более известный как rgod, публикует краткий анализ уязвимости и PoC для Fax Cover Page Editor;
  • 4-го января Джошуа Дрэйк добавляет эксплойт в metasploit для очень интересной уязвимости в обработке эскизов, до этого в декабре Моти и Ксу Хао посвятили целое выступление этой архитектурной уязвимости на азиатской конференции POC2010;
  • 5-го января сотрудник компании Google Михал Залевски публикует информацию о баге в Internet Explorer’e.

Интересно почитать блог мелкомягких Security Research & Defense, в котором они часто публикуют информацию о минимизации рисков — например, Workaround для защиты от уязвимости в обработке эскизов (CVE-2010-3970) путем применения ACL-листов для уязвимой библиотеки shimgvw.dll.

Также Microsoft стараются приуменьшить риск уязвимостей, ставя на некоторых ярлык DoS only, что иногда двигает хакеров к новым техникам обхода современных защит. Яркий пример — уязвимость в FTP(CVE-2010-3972): эксперты из MS считают, что переполнение, при котором мы затираем метаданные константой(0xFF в данной случае), без контроля над адресами перезаписи не эксплуатабельно! Но двум реверсам в команде — Крису Валазеку и Риану Смиту — удалось выжать максимум, получить контроль над EIP.

Однако «вторник патчей» не поразил большим количеством бюллетеней — всего два, закрывающие три уязвимости. Одна из которых (Insecure Library Loading в Backup Managere’e) уже стала банальностью, причем уязвимости подвержена только Vista.

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

 

Удаленное исполнение кода в Microsoft Data Access Components

 

Targets

Windows XP, 2003, Vista, 2008, 7

 

Brief

Уязвимость класса Integer Overflow, которая, в свою очередь, ведет к переполнению heap’a и связана с обработкой свойства CacheSize ActiveX компонента MSADO.

Свойство CacheSize объекта RecordSet целочисленного типа отвечает за количество записей, которые будут храниться в кэше набора данных. Внутренне CacheSize используется при расчете памяти, выделяемой для хранения этой информации, что делается путем умножения на 4, так как в кэше хранятся лишь идентификаторы записей DWORD — 4 байта:

Уязвимый код в msado.dll

.text:4DDFC348 lea eax, ds:4[eax*4]
; eax — значение CacheSize
.text:4DDFC34F push eax
.text:4DDFC350 push 0A00000h
.text:4DDFC355 push ?g_hHeapHandle@@3PAXA
; void * g_hHeapHandle
.text:4DDFC35B call ds:__imp__MpHeapAlloc
; Выделяем память

Как видишь, напрочь отсутствует проверка ситуации, когда CacheSize будет больше 0x40000000, что приведет к целочисленному переполнению, а значит — будет создан буфер некорректной длины, а затем переполнение и затирание памяти.

Теперь дело за тактикой. Во-первых, к какой базе данных будем делать запросы? Тут нам на помощь придет технология XML Data Island, которая заключается в том, что с помошью XML, внедренного в html-страницу, мы эмулируем базу данных:

Пример внедренной базы данных

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<XML ID="xmlid1">
<Devices>
<Device>
<HereIsCouldBeAnyData />
</Device>
</Devices>
</XML>

Во-вторых, как сделать, чтобы в кэш попадала какая-то информация для форсирования записи данных за границы выделенного
буфера? Для этого идеально подходят методы объекта RecordSet: MoveFirst, MoveNext и так далее. Этот факт позволяет нам контролировать ход перезаписи памяти, так как мы уже имеем полный контроль над размером буфера и над тем, что пишем.
Автор данной уязвимости Питер Врегденхил использовал вышеописанное для очень интересного трюка — утечки памяти с целью обхода ASLR.

Если добиться такого расположения объектов в памяти и затереть нулевые байты строки, а затем через JavaScript прочитать ее содержимое, то мы в конечном итоге наткнемся на 0x0000. Чтобы иметь возможность переписать память байтами 0x0000, надо создать очень много записей — более 0x00010001. Но не торопись: ведь после удаления какой-либо записи следующая новая запись получает инкремент идентификатора. Таким образом, создавая и удаляя записи в цикле, можно быстро добиться нужного значения:

function IncreaseRowCounter()
{
if(GlobalRowCounter < 0x10120)
{
for(i = 0; i < 0x300; i++)
{
GlobalRowCounter++;
localxmlid2.AddNew(["BBBB"], ["c"]);
localxmlid2.Delete();
}
var percentcomplete = Math.round(
GlobalRowCounter /0x10120 * 100);
document.getElementById(
'progressfaseone').innerText =
percentcomplete + "%";
window.setTimeout(IncreaseRowCounter, 100);
}
}

Стоит отметить, что авторский эксплойт огромен: он использует сразу две уязвимости (в том числе описываемую именно с целью обхода ASLR), что ведет к возможности обойти DEP путем выстраивания ROP-последовательности. Mso.dll использует стандартную функцию VirtualProtect, с помощью которой маркируется память в том месте, где локализован наш шелл-код как Executable. Вторая уязвимость класса use-after-free (CVE-2010-1262) была запатчена еще в ms10-035. Отличный пример, когда комбинация из двух уязвимостей увеличивает эффективность успеха эксплуатации! Патчем же является использование проверочной функции, которая выполняет умножение и проверяет результат на переполнение.

 

Solution

Накати патч ms11-002: microsoft.com/technet/security/Bulletin/MS11002.mspx

 

Удаленное исполнение кода в Microsoft Graphics Rendering Engine

 

Targets

Windows XP, 2003, Vista

 

Brief

Графическая подсистема Windows часто преподносит сюрпризы в области безопасности. На конференции POC2010 Моти & Ксу Хао выступили с докладом всего лишь про одну уязвимость, зато какую! Как известно,Explorer может отображать файлы по-разному, к примеру: если выбрать стиль отображения «Эскиз», то будут отображаться некоторые метаданные файла, а информацию о содержании (к примеру, doc- или pdf-документа) он берет из обыкновенного битмапа, присутствующего в файле.

Эта структура обрабатывается с помощью функции ConvertDIBSECTIONToThumbnail библиотеки shimgvw. dll, которая, в свою очередь, вызывает функцию CreateSizedDIBSECTION.

.text:5D0201F5 push edx ; int
.text:5D0201F6 push ecx ; int
.text:5D0201F7 push [ebp+arg_8] ; int
.text:5D0201FA push esi ; int
.text:5D0201FB push ecx ; HPALETTE
.text:5D0201FC push eax ; int
.text:5D0201FD lea eax, [ebp+var_10]
.text:5D020200 push eax ; int
.text:5D020201 call _CreateSizedDIBSECTION@28

Функция CreateSizedDIBSECTION обрабатывает biClrUsed как знаковое значение (signed). Рассмотрим уязвимый код:

.text:5D01FC2D loc_5D01FC2D:
.text:5D01FC2D cmp ecx, 100h
; в ecx значение поля biClrUsed
.text:5D01FC33 jg loc_5D01FCF0
; Знаковое сравнение!!!
.text:5D01FC39 lea esi, [edx+28h]
.text:5D01FC3C lea edi, [ebp+var_430.bmiColors]
.text:5D01FC42 rep movsd ; inline memcpy

Из листинга видно, что если в ecx отрицательное значение, то мы обойдем проверку с константной длиной буфера, расположенного на стеке, тем самым форсируя переполнение. Практическая ценность этой уязвимости весьма велика, так как с помощью WebDav можно атаковать Internet Explorer. Рассмотрим локальный сценарий: нас заманили в директорию, где лежит файл со специально сформированным эскизом. В этом случае переполнение происходит в процессе Explorer.exe, что дает преимущества при эксплуатации на Windows XP, так как у процесса Explorer.exe флаг DEP установлен не в режиме permanent. Из-за этого с помощью ROP-цепочки можно отключить DEP, используя SetProcessDEPPolicy или VirtualAlloc c RWX флагом.

Рассмотрим пример от авторов metasploit’a:

# формирование стека
'imp_VirtualAlloc',
'call [ecx] / pop ebp / ret 0x10', 0,
0x1000, # размер
0x3000, #
0x40, # RWX флаг

 

Solution

Ознакомься с официальной адвизори от MS, там есть Fixit-решение. Либо запрети подгрузку уязвимой DLL путем нехитрой
команды:

echo y| cacls %WINDIR%\SYSTEM32\shimgvw.dll /E /P everyone:N

 

Повышение привилегий в Agnitum Outpost Security Suite PRO

 

Targets

Agnitum Outpost Security Suite Pro и все продукты Agnitum, имеющие в комплекте уязвимый драйвер VBEngNT.sys

 

Brief

В процессе поиска багов автор столкнулся с довольно интересным архитектурным багом: разработчики данной HIPS-системы защитили все свои псевдоустройства, кроме одного. Этот модуль играет роль своего рода DLL только в пространстве ядра. Handle на псевдоустройство \\.\vbengnt может получить права Guest и с помощью определенных ioctl-запросов переписать память по любому адресу в пространстве ядра, что ведет к очень простому сценарию эксплуатации. Что примечательно, ioctl-запросы ведут к прямому вызову экспортных функций, без какой-либо проверки указателей.

Учитывая, что экспортных фукнций у данной dll аж 50 — соответственно количество уязвимостей тоже 50. Все эти функции обрабатывают параметры как указатели на определенные недокументированные структуры, не выполняя никаких проверок. Рассмотрим дизасм и определим самый простой сценарий эксплуатации.

Ioctl обработчик \\.\vbengnt

.text:0002B850 ioctl_handler proc
.text:0002B850 Irp = dword ptr 8
.text:0002B850 push esi
.text:0002B851 push edi
.text:0002B852 mov edi, [esp+8+Irp]
.text:0002B856 mov eax, [edi+60h]
.text:0002B859 mov ecx, [eax+4]
.text:0002B85C mov esi, [eax+8]
.text:0002B85F mov edx, [edi+0Ch]
.text:0002B862 mov [esp+8+Irp], ecx
.text:0002B866 mov dword ptr [edi+1Ch], 0
.text:0002B86D movzx ecx, byte ptr [eax]
.text:0002B870 sub ecx, 0
.text:0002B873 jz loc_2B97D
.text:0002B879 sub ecx, 2
.text:0002B87C jz loc_2B967
.text:0002B885 jz short loc_2B8A0
; ecx == 0x0E (IOCTL)

Далее идет проверка значения Ioctl-кода на определенный диапазон и вызов уязвимой функции:

.text:0002B8A0 loc_2B8A0:
.text:0002B8A0 mov eax, [eax+0Ch]
.text:0002B8A3 mov ecx, eax
; в eax значение IoCtl кода
.text:0002B8A5 shr ecx, 2
.text:0002B8A8 and ecx, 0F00h
.text:0002B8AE cmp ecx, 800h
.text:0002B8B4 jz short loc_2B8CD
[..]
.text:0002B8CD loc_2B8CD:
.text:0002B8CD lea ecx, [esp+8+Irp]
.text:0002B8D1 push ecx
.text:0002B8D2 push esi
.text:0002B8D3 push edx
.text:0002B8D4 push eax
.text:0002B8D5 call vuln_function

Функция по адресу 0x0001DAA0 является своего рода шлюзом:

.text:0001DAA0 vuln_function proc near
.text:0001DAA0 arg_0 = dword ptr 4
.text:0001DAA0 arg_4 = dword ptr 8
.text:0001DAA0 arg_8 = dword ptr 0Ch
.text:0001DAA0 arg_C = dword ptr 10h

.text:0001DAA0
.text:0001DAA0 mov eax, [esp+arg_0]
.text:0001DAA4 shr eax, 2
.text:0001DAA7 push edi
.text:0001DAA8 mov edi, [esp+4+arg_C]
.text:0001DAAC mov ecx, [edi]
.text:0001DAAE and eax, 0FFh
.text:0001DAB3 cmp eax, 32h
.text:0001DAB6 mov dword ptr [edi], 0
.text:0001DABC jb short loc_1DAC7
[..]
.text:0001DAC7 loc_1DAC7:
.text:0001DAC7 mov edx, [esp+4+arg_8]
.text:0001DACB cmp edx, dword_45418[eax*4]
; сравнение с правильными длинами
.text:0001DAD2 jz short loc_1DADD
[..]
.text:0001DAEB loc_1DAEB:
.text:0001DAEB cmp eax, 31h ; switch 50 cases
.text:0001DAEE push esi
.text:0001DAEF ja loc_1E186 ; default
.text:0001DAEF ; jumptable 0001DAF5 case 3
.text:0001DAF5 jmp ds:off_1E190[eax*4]
; развилка на вызовы пятидесяти функций

После перебора пятидесяти функций обнаружилось, что с помощью функции ENGINE_XmlMsgEmpty можно переписать любую память константными значениями:

.text:0001DBFC mov esi, [esp+8+arg_4]
.text:0001DC00 mov eax, [esi]
; esi — наш буфер
.text:0001DC02 push eax
.text:0001DC03 call ENGINE_XmlMsgEmpty
[..]
.text:0001D200 ENGINE_XmlMsgEmpty proc near
.text:0001D200 arg_0 = dword ptr 4
.text:0001D200
.text:0001D200 push esi
.text:0001D201 mov esi, [esp+4+arg_0]
.text:0001D205 test esi, esi
.text:0001D207 jnz short loc_1D212
[..]
.text:0001D218 add esi, 14h
; esi под нашим контролем
.text:0001D21B push esi
.text:0001D21C call sub_37650
.text:00037650 sub_37650 proc near
.text:00037650 arg_0 = dword ptr 4
.text:00037650
.text:00037650 mov eax, [esp+arg_0]
.text:00037654 mov dword ptr [eax+14h], 0
; запись 0x00000000 по произвольному адресу
.text:0003765B mov dword ptr [eax+20h], 1
.text:00037662 add eax, 28h
.text:00037665 mov [esp+arg_0], eax
.text:00037669 jmp nullsub_1
.text:00037669 sub_37650 endp

 

Solution

Ждем исправления или перебираемся на другой HIPS.

Оставить мнение

Check Also

В гостях у чертёнка. FreeBSD глазами линуксоида

Порог вхождения новичка в мир Linux за последние десять-пятнадцать лет ощутимо снизился. О…