Содержание статьи
Представляем тебе отчет о эксплуатации
самой свежей обнаруженной в
IE7 уязвимости. Разобранный нами эксплоит состоит из двух частей:
а) кода JavaScript для внедрения данных в кучу и шеллкода для x86
б) уязвимости в разметке XML/SPAN.
А. Код JavaScript для внедрения данных в кучу и шеллкод для x86
Со стороны скрипта первая часть атаки выглядит следующим образом:
А так выглядит результат его выполнения в куче:
Б. Уязвимость в разметке XML/SPAN
Перейдем ко второй части атаки – эксплоиту и триггеру. Как в разметку
добавляются тэги XML/SPAN, можно увидеть здесь:
Эксплоит использует специальный символ #2570; (hex:0x0a0a) для того, чтобы
внедрить в значение SRC данные !CDATA Label. Тебе, вероятно, интересно, почему
используется #2570 перед обработкой этих XML/SPAN тегов. Это необходимо из-за
того, что эксплоит освобождает блок памяти, содержащий эти элементы, однако
продолжает ссылаться на этот блок в следующем процессе. При отсутствии
надлежащей проверки объект будет перезаписан значением 0x0A0A0A0A, а поскольку
атакующий заполняет данные в куче (см. пункт А), по адресу 0x0A0A0A0A будет
содержаться шеллкод злоумышленника:
Здесь можно увидеть, как при выполнении процесса производится перенаправление
на шеллкод:
Продвинутый шеллкод
Шеллкод, используемый при проведении данной атаки, достаточно интересен. Его
конечная цель ничем не отличается от других обычных шеллкодов (загрузка файла и
его выполнение), однако здесь есть ряд специфических особенностей.
Прежде чем сделать нечто причудливое, шеллкод начинает выделять себе память
при помощи функции GlobalAlloc. Он выделяет в куче 0x2000 байт и копирует в нее
себя. Давай посмотрим, что происходит после этого.
Установка хуков
Шеллкод вмешивается в работу нескольких функций Windows, таких как
UnhandledExceptionFilter, LdrShutdownThread и тому подобных. Ранее нам никогда
не приходилось встречаться с публично доступными шеллкодами, внедряющимися в
функции Windows, поэтому такое поведение данного шеллкода стало для нас
сюрпризом. Мы ожидали увидеть нечто более простое.
Для того, чтобы вмешаться в выполнение указанных функций, шеллкод использует
функцию VirtualProtect с параметром PAGE_EXECUTE_READWRITE. По умолчанию,
функции Windows защищены от изменения. Поэтому для их модификации требуется
смена прав доступа. После того, как доступ на запись получен, предыдущие функции
перезаписываются для установки хука. Внедренный код перенаправляет функции с
установленным хуком к специальным частям шеллкода. После того как функция
пропатчена, права PAGE возвращаются к исходным значениям.
Ниже можно увидеть, как вызывается VirtualProtect:
После того, как права изменены, при помощи приведенного ниже кода
устанавливается хук:
Так выглядит функция UnhandledExceptionFilter с установленным хуком после
того, как ее пропатчили:
Если мы отследим процесс перенаправления, то он приведет нас вот сюда:
В общем случае, после выполнения функции UnhandledExceptionFilter она
возвращает значение 0x80040111. Кроме нее, пропатчиваются еще две функции,
включая LdrShutdownThread.
Проверка на наличие хуков
Шеллкод также осуществляет проверку некоторых функций API из числа тех,
которые собирается вызвать, на наличие уже установленных хуков (устанавливать их
могут, например, программы виртуализации и мониторинга). Как можно увидеть ниже,
одной из таких функций является CreateProcessA:
Показанная часть кода отвечает за то, чтобы проверить, не направлена ли
функция API какими-нибудь окольными путями. И если она уже пропатчена, шеллкод
выполняет встроенные инструкции, позволяющие пропустить первые пять байт API и
возобновить исполнение кода с другого места. Такие методы обычно используются
для обхода внедренных в API-функции хуков. Также выполняется проверка на наличие
NOP (0x90) сразу после первого байта перенаправления (0xE8 или 0xE9).
UrlDownloadToCache
Кроме всего прочего, шеллкод использует функцию UrlDownloadToCache вместо
имеющей дурную репутацию функции UrlDownloadToFile. Вероятнее всего, причиной
использования именно этой функции стала попытка обхода мониторинга на предмет
наличия вредоносного URL или установки хука на функцию UrlDownloadToFile
программами, обеспечивающими безопасность. Это простой способ, и он, похоже,
срабатывает.
CreateProcessA
Для того, чтобы выполнить загруженный файл, используется cmd /c. Такой прием
типичен и ничем особым не примечателен.
LdrShutDownThread
Как мы уже упоминали выше, шеллкод устанавливает несколько хуков. Хук на
LdrShutdownThread затрагивает как процессы, так и окна, а его процедура
EnumWindow CallBack проверяет класс IEFrame при помощи функции API под названием
GetClassNameA. Мы еще не уделили пристального внимания всем деталям, однако
считаем, что шеллкод может использовать указанные процедуры для проверки того,
от чьего имени он запущен (IE или, скажем shellcode2exe).
shdocvw ordinal 101
На данный момент, мы не до конца уверены, в чем именно состоит смысл
использования данной функции. Гипотезы, конечно, имеются, однако используемые
параметры не совпадают. Наверняка известно лишь то, что с EBX четрые раза
делается push, а значение EBX равно 0. Предполагается, что функция имеет лишь
два отличающихся параметра. Все что нам удалось найти в связи с этой функцией –
это ссылки на баги в Wine и других подобных проектах. Мы полагаем, что данный
код используется против Wine, однако эта теория еще не проверялась.
Напоследок еще пара слов о шеллкоде
Данный шеллкод делает и другие вещи, однако большинство из них стандартны для
всех шеллкодов. Наиболее удивившими нас особенностями стали проверка на
установленные хуки и процедура установки своих хуков на функции. Этот шеллкод
имеет собственную, похожую на GetProcAddress, функцию и использует HASH для
определения тех функций, с которыми ему предстоит иметь дело. Типичный шеллкод.
Оригинал:
http://securitylabs.websense.com/