R0 CREW

Malware Analysis Tutorial 26: Rootkit Configuration (Перевод: ximera)

Перейти к содержанию

Цели урока:

  1. Получить практический опыт использования WinDbg в пользовательском режиме (ring-3), для исследования процессов в не-инвазивном режиме.
  2. Получить практический опыт использования IMM и WinDbg для анализа данных.
  3. Получить понимание операций с регистрами.
  4. Научится понимать многоуровневые операции.
  5. Научится понимать высокоуровневые сетевые процессы.
  6. Получить практический опыт основных технологий распаковки и расшифровки ключей.

1. Введение

В этой части, мы вернемся к анализу lz32.dll и закончим с остальным. Мы можем видеть широкий набор вредоносных функций выполняемых ls32.dll, которые внедрил в него Max++, они включают в себя форматирование и сокрытие дисков, генерацию и настройку полезной нагрузки для сети, распаковку сегмента кода, и заражение других системных библиотек.

Наш анализ в основном будет выполнятся в адресном пространстве 0x3Cxxxx, некоторые части мы снова будем откапывать внутри raspppoe.sys. Начнем мы анализ по адресу 0x3C1B3E. Следуйте инструкциям приведенным ниже.

2. Конфигурация среды для экспериментов

Мы можем воспользоваться еще раз конфигурацией из Урока 20. В общем нам нужны 2 ВМ c Windows XP, одна для записи заметок, а вторая для запуска вируса. Также вам необходим WinDbg на хостовой машине, для отладки ВМ win_debug. В частности, в ВМ win_debug, вы должны установить бряк по адресу 0x3C1B3E. Он находится прямо перед вызовом loadDrivet(«raspppoe.sys»), как показано ниже на рис.1.

Рис. 1. Код lz32.dll после zwLoadDriver

3. Очистка операций

Вспомним, что по адресу 0x3C1B3F, max++ (внутри lz32.dll) вызывает функцию zwLoadDriver для загрузки raspppoe.sys. Поведение raspppoe.sys рассмотрено в уроках 20-25. Сейчас lz32.dll должен выполнить некие операции очистки, для дальнейшего сокрытия следов вируса. По адресу 0x003C1B48 (первый выделенный блок на рис.1), закрывается хендл файла raspppoe.sys, далее начиная с адреса 0x3C1B55 по 0x3C1B3B, находится цикл который возобновляет коллекцию потоков один за другим. Фактически это перезапуск службы защиты Windows.

Задание 1. Используя трассировку и бряки, докажите то что цикл с 0x3C1B55 по 0x3C1B3B, перезапускает службу безопасности Windows.

Отметим что основной функцией заражения raspppoe.sys является настройка обработчика операций I/O диска, а так же заражение стека сервиса TDI (TCP/IP). Многие службы в raspppoe.sys приостанавливаются на 15 секунд, используя замедляющий вызов процедур или замедляя таймер системных потоков, для дальнейшего завершения настройки в lz32.dll. Сейчас мы предоставим детали.

4. Создание виртуального диска

Первая интересная часть кода, это создание виртуального диска. Код показанный на рис.2 состоит из четырех шагов: сначала загружается библиотека «fmifs», затем получается адрес процедуры «FormatEx», после этого вызывается функция форматирования диска. Если вы взглянете на содержимое стека, вы заметите имя диска «C2CAD…». Как только все действия будут выполнены, будет выгружена библиотека.

Рис. 2. Создание виртуального диска ??\C2CAD…

5. Сохранение зараженного файла на скрытом разделе

Следующим действием которое выполняет Max++ это сохранение зараженного драйвера raspppoe.sys на свеже созданном скрытом разделе. Подробности показаны на рис.3.

Рис. 3. Сохранение зараженного raspppoe.sys на скрытый раздел. Имя файла: snifer67

Как показано на рис. 3, первое действие по адресу 0x3C2000 это вызов MapViewOfSection. Фактически это отображение части объекта в адресном пространстве текущего объекта. После данного вызова, секция объекта, настраивается Max++ для отображения драйвера raspppoe.sys (того который заражен). После завершения вызова, входная секция объекта будет изменена в текущем процессе, в нашем случае, по адресу 0x00380000. Если взглянуть в дамп памяти на рис.3, вы можете заметить «4D 5A», что является магическим кодом PE файла. Затем Max++ создаст файл с именем «osseqw» (что является результатом шифрования «snifer67» с использованием текущей временной отметки). После этого содержимое raspppoe.sys будет сохранено внутри свеже-созданного файла.

Задание 1. Убедитесь в том, что секция объекта используемая при вызове MapviewOfSection по адресу 0x3C2000 является единственной для raspppoe.sys (Зараженного драйвера).

Задание 2. Выясните, когда используется файл snifer67, расположенный на скрытом разделе.

6. Файл настроек

Следующей функцией, которую мы проанализируем, является 0x3C2162. На рис.4 показано тело функции. Основным функционалом здесь является создание конфигурационного файла используемого TDI_SEND, который детально рассматривался в части 5, главы 25.

Рис. 4. Запись IP/Домена вредоносных серверов

Как показано на рис.4, Max++ загружает и зашифровывает несколько строк таких как 85.17.239.212 и intensivedive.com. Ваша задача найти все вредоносные сервера сохраненные в конфигурационном файле.

Задание 3. Проанализируйте функцию по адресу 0x003C20E0. Какие она принимает параметры?

Задание 4. Определите все IP адреса и домены сохраненные в конфигурационном файле на скрытом разделе.

Задание 5. Найдите имя конфигурационного файла.

7. Сохранение расшифрованных ключей в реестре.

Следующим действием выполняемым Max++, является «расшифровка ключа» который само-распаковку в реестр. Рис. 5 показывает этот код.

Рис. 5. Сохранение расшифрованного ключа

Как показано на рис.5, ключом расшифровки является «1100100», который был получен из PE заголовка Max++downloader2010.exe, и он используется для расшифровки/распаковки кода. Max++ создает ключ реестра в IE explorer и сохраняет здесь значение ключа.

Задание 6. Убедитесь в том что ключ 11001800, находится в PE заголовке Max++.

Задание 7. Определите где используется данный ключ.

8. Составление HTTP запроса.

Мы дошли до функции Max++ по адресу 3C220A, которая создает HTTP запросы для скачивания зараженных файлов. Рис. 6 показывает ее содержимое. Выделенная область на рис.6 показывает заголовок HTTP запроса. По сути это исполнение /install/setup.ppc.php на ресурсе intensivedive.com.

Рис. 6. Создание заголовка HTTP запроса

9. Создание зараженного файла max++.00.x86

Далее мы проанализируем функцию расположенную по адресу 0x3C16b8. Рис.7 показывает ее содержимое. Сначала она открывает файл ntdll и считывает его базовую информацию. Затем создает файл под названием max++.00.x86 на скрытом разделе. Файл использует некоторые настройки (базовую информацию) ntdll.

Задание 8. Понаблюдайте за функцией вызываемой по адресу 0x3C16CD (Рис. 7). Она создает таблицу расшифровки. Где находится начало и конец таблицы расшифровки?

Рис. 7. Первая часть 0x3c16b8

Рис. 8 показывает остальную часть функции. Она показывает содержимое max++.00.x86. Первое действие это выделение 0x8000 байтов виртуальной памяти (см. выделенную область на рис. 7). Затем она помещает в стек таблицу расшифровки (в диапазоне 0x12D3XX). После использования таблицы расшифровки, Max++ сначала копирует зашифрованный код с 0x3C2550 по 0x380000, и расшифровывает информацию используя несколько проходов расшифровки. В итоге записывает все содержимое внутрь max++.00.x86. Файл будет загружен позже другим системным драйвером.

Рис. 8. создание файла max++.00.x86

10. Установка связи с зараженным сервером.

Следующим действием Max++ является установка соединения с зараженным сервером, как показано на рис. 9. Здесь создается winsock и соединяется с сервером 85.17.239.212, затем посылается HTTP запрос к серверу. Заметим интересную часть кода, это шифрование ключа «11001800» который встроен в HTTP запрос (взгляните на часть дампа памяти на рис.9). Функция не имеет ни одной операции для получения пакетов. Оказывается, что она проcто информирует зараженный сервер о том, что заражение машины при помощи Max++ прошло успешно.

Рис. 9. Отправка трафика на intensivedive

© Translated by ximera from r0 Crew