TypeLib-Hijacking

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
6,977
Реакции
34
Привет, друзья. Ну что же новый конкурс – самое лучшее время для рубрики: зиродей от человека «швейцарский нож чтоле». Ну ладно, просто пошутил про зиродей, не ругайтесь. Кодинг на этом конкурсе не в фаворе, поэтому будем публиковать немного сырые идеи на тему персистанса при тестировании на проникновение, а ваша задача, дорогие читатели, доготовить эту идею под свои нужды. Хочу сразу оговориться, что идея вроде одновременно и интересная, и простая, поэтому мне как-то удивительно, что никто этого до сих пор не опубликовал. Я честно гуглил, но не нашел. Если вы уже видели где-то в паблике эту тему, то скиньте ссылку, и мы с модерами снимем эту мою статью с конкурса. Ну а если никто действительно об этом не думал еще, то хоть я вкину такую темку в комьюнити всяческих ред тимеров, пентестеров и информационных безопасников.

Начнем мы с небольшой истории. Может год назад, а может и больше, я смотрел интересную презентацию на некоей конфе. Как называлась эта презентация, или какой была эта конференция, я уже не вспомню, но сама суть у меня отложилась в голове. В этой презентации господин ред тимер показывал, как создавать вредоносные TypeLib-библиотеки, а затем с их помощью инфицировать солюшены Visual Studio и тем самым атаковать компьютеры девелоперов. Бедняге девелоперу оставалось просто открыть файл солюшена. Я с этой презентации словил гигантский лулз и с тех пор периодически думал, как это можно применить для чего-то другого. Думал до сегодняшнего дня…

COM – удивительная технология, она одновременно очень комплексная и при этом простая, когда вы наконец-то начнете в ней действительно разбираться. Для меня этот момент еще пока не наступил, но все же. Для понимания того, что происходит в этой статье нам нужно знать всего несколько вещей. Есть COM-классы, реализованные в специальных динамических библиотеках, которые можно подгрузить к себе в процесс и воспользоваться функционалом данного COM-класса для своих нужд. COM-классы могут удовлетворять набору COM-интерфейсов, которые определяют, как создающий и вызывающий их код может взаимодействовать с текущим COM-классом. Скажем, для COM-Hijacking этой информации нам бы было достаточно, но есть еще один интересный объект во всей этой «шведской» COM-семье – это библиотеки типов, они же TypeLib. В этих библиотеках типов в понятном операционной системе виде описываются классы и интерфейсы, их методы, аргументы и другая ценная информация. По сути дела, это тот же Reflection из этих ваших дотнетов но для COM-классов, объектов, интерфейсов и тд. Благодаря нему система или программист может запросить информацию об устройстве класса и его интерфейсах и в динамике, а не на этапе компиляции, что-то сделать с этой информацией. Пресловутая Visual Studio использует эту информацию в своих гуишках и даже в компиляторе cl.exe, чтобы генерировать правильный код для взаимодействия с COM-классами.

COM-классы, COM-интерфейсы и TypeLib-библиотеки регистрируются в реестре операционной системы в соответствующих ветках. При этом ветка текущего пользователя (HKCU) имеет приоритет над веткой локального компьютера (HKLM). Благодаря этому, в частности, и работает замечательный и удивительный COM-Hijacking. Вы просто создаете необходимые ключи в ветке HKCU и процесс начинает грузить вашу динамическую библиотеку, вместо оригинальной. Конечно, вам нужно будет еще подгрузить оригинальную библиотеку и инстанцировать запрашиваемые из нее COM-объекты своим кодом, чтобы ничего не поломалось в процессе, но это не так-то и сложно. С другой стороны, COM-интерфейсы не ассоциируют себя с конкретными динамическими библиотеками, поэтому смотреть их бесполезно (или нет? пишите в комментарии, если что). А вот TypeLib-ы прописываются в реестре с указанием пути до tlb-файла, понимаете, на что я намекаю?

Для загрузки TypeLib-библиотеки в процесс используется функция LoadTypeLib, реализованная в библиотеке oleaut32.dll. Первым параметром она принимает путь к файлу, в котором лежит библиотека типов, а вторым возвращает нам COM-интерфейс ITypeLib, с помощью которого мы можем получить полную информацию из этой библиотеки типов. Функция LoadTypeLib достаточно неприхотлива в том, что мы будем ей пихать первым параметром. Она может загрузить библиотеку типов из tlb-файла, может загрузить из ресурсов исполняемого файла. Но нас больше всего интересует небольшая сноска в ее мануале на MSDN, которая гласит, что библиотеку типов можно загружать с помощью установленных на системе Moniker’ов:

3ad6a031e4ddc5a12773c.jpg

И тут дела становятся куда интереснее. Описывать всю механику работы Моникеров в системе очень долго, да и я сам, если честно, не до конца понимаю, что там творится, поэтому давайте вкратце. Моникер – это некий системный компонент, который обрабатывает строку со ссылкой определенного формата. Так, например, моникер, обрабатывающий строки, начинающиеся с «winmgmts:», обращается к объекту SWbemServices из WMI. Моникеров может быть установлено любое количество, но в системе предустановлен еще один очень занимательный моникер, обрабатывающий строки, начинающиеся с «script:». Он принимает путь к файлу формата sct на локальной системе, локальной сети или даже сети интернет, и интерпретирует его с помощью библиотеки scrobj.dll. Внутри sct-файла может быть произвольный скрипт на языке VBScript и JScript. Для большинства ред тимеров, пентестеров и кулхацкеров этот моникер должен быть отлично известен, но все же в контексте статьи нужно было рассказать немного о нем.

Теперь давайте объединим все вышесказанные вещи воедино. Итак процесс, чтобы загрузить TypeLib-библиотеку какого-то класса, попытается найти путь до нее в реестре, сначала в HKCU ветке, затем в HKLM ветке. Если он нашел и считал из реестра этот путь, то процесс попытается открыть ее с помощью функции LoadTypeLib. Функция LoadTypeLib может принимать в качестве пути до библиотеки ссылки произвольного моникера. Осталось выяснить, какие процессы и в какой момент подгружают какие TypeLib-библиотеки, если вообще подгружают.

Подопытным кроликом у нас сегодня будет процесс explorer.exe на операционной системе Windows 10. Давайте возьмем Process Monitor, добавим фильтр по имени процесса, а также отберем все манипуляции с реестром системы, которые в пути будут иметь подстроку TypeLib. Как показывает нам Process Monitor процесс explorer.exe при своем запуске пытается загрузить несколько TypeLib-библиотек, и для каждой из них сначала проверяет HKCU ветку. Это можно видеть на следующем скриншоте:

24e969c6582d6b6f307c8.jpg


Ну собственно на это мы и надеялись, давайте перейдем к тестам. Для начала подготовим sct-файл, который просто запустит калькулятор (это же нестареющий классический тест, верно - запуск калькулятора, какой еще тест мы могли бы тут провести). Положим этот файл на диск C в папку Temp и назовем typelib.sct. Код этого sct-файла приведен ниже:

Код:
 		<?XML version="1.0"?> <scriptlet> <registration     description="wtf_explorer"     progid="wtf_explorer"     version="1.0"     classid="{66666666-6666-6666-6666-666666666666}"     remotable="true"> </registration> <script language="JScript"> <![CDATA[     var WShell = new ActiveXObject("WScript.Shell");     WShell.Run("calc.exe"); ]]> </script> </scriptlet>


Далее случайным образом выберем одну из веток HKCU реестра системы, к которым обращался explorer.exe в процессе своей загрузки. Воссоздадим ветку полностью таким образом, чтобы она соответствовала тому самому обращению процесса explorer.exe. В ветке пропишем полный путь до нашего sct-файла в папке Temp, используя моникер «script:». Рассмотрим, что у нас получилось на следующем скриншоте:

c3b50b852bc1204499f91.jpg


Ну а теперь просто перезапускаем процесс explorer.exe и лицезрим запущенный калькулятор. Важно отметить, что, отрубив explorer’у загрузку TypeLib-библиотеки, мы могли что-то поломать, как и с COM-Hijacking’ом. На тестах конкретно этого варианта проблем я не заметил, хотя мне показалось, что процесс explorer.exe стал слегка подтормаживать. Но надеется на это не стоит, и далее мы рассмотрим мою теорию о том, как сделать этот TypeLib-Hijacking стабильным и безопасным (то есть ничего никому не порушить и не поломать). Однако проработать и протестировать эту тему я оставлю вам, дорогие читатели, в качестве домашнего задания.

TypeLib-библиотеки могут иметь ссылки на другие TypeLib-библиотеки. Я предполагаю, что, чтобы подсунуть процессу оригинальную TypeLib-библиотеку и ничего не поломать в нем, можно попробовать сделать tlb-файл, который будет иметь ссылку на оригинальный tlb-файл. Это можно сделать либо с помощью компилятора языка MIDL, либо программно: создать TypeLib-библиотеку с помощью CreateTypeInfo-функции, а так же методов ICreateTypeLib::CreateTypeInfo и IcreateTypeInfo::AddRefTypeInfo. Альтернативно, разобравшись с форматом tlb-файлов, можно взять оригинальную TypeLib-библиотеку и попробовать добавить в нее ссылку на наш скрипт через Моникера, тем самым своего рода «инфицировать» исходный tlb-файл. Но опять же эти подходы нужно проверить и потестить, а так же пишите свои мысли по этому поводу, было бы интересно это обсудить.

В заключении я хотел бы немного поговорить о преимуществах TypeLib-Hijacking против широко известного COM-Hijacking. Во-первых, как я уже говорил ранее, моникер «script:» может загружать файлы sct-формата из локальной сети и из сети интернет, то есть потенциально запускать fileless-малварь. Конечно, есть AMSI, WLDP и всякие такие штуки, но опять же нужно тестировать. Во-вторых, при этом формат sct — это по сути простая XML’ка, а имя файла, который мы указываем в моникере, может иметь любое расширение. Файлы формата tlb — тоже вряд ли могут серьезно проверяться антивирусами, так как по сути не являются исполняемыми, хотя может я тут что-то упускаю, напишите в комментариях, если так. В любом случае, мне кажется, что это — интересная тема, даже если выясниться, что она слабо применима для ред тиминга. А друзьям блю тимерам стоит все же обращать внимание на TypeLib-библиотеки, ну хоть чуток. Надеюсь, что вам было интересно! Я написал эту статью исходя из своего понимания того, как это работает, возможно попутал что-то, тк COM все-таки сложная технология, не ругайтесь сильно. Спасибо за внимание!

Автор: DildoFagins
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.