Пожалуйста, обратите внимание, что пользователь заблокирован
Динамический анализ является фундаментальной техникой в компьютерной безопасности и широко распространен в сфере анализа вредоносных программ. Идея состоит в том, чтобы выполнить программу в контролируемой среде и затем отслеживать эту среду, чтобы понять поведение вредоносного ПО. Это привлекательно, потому что позволяет нам делать точный и конкретный анализ, основанный на реальных исполнениях. Мы используем наши наблюдения для различных целей, таких как определение того, является ли данный образец вредоносным или нет, идентификация каналов связи, общая распаковка и многое другое. Для этого существует множество систем, как систем с открытым исходным кодом, таких как Cuckoo Sandbox, CAPE sandbox, Spengler и Drakvuf, так и коммерческих решений, таких как LastLine, VMRay и многих других.
В последнее десятилетие было много улучшений в методах детального анализа, которые сосредоточены на автоматизации обратного инжиниринга. Инфраструктура обратного инжиниринга PANDA представляет особый интерес, поскольку является зрелой платформой, которая предлагает основу, необходимую для разработки детальных инструментов динамического анализа, которые включают большое количество приложений, таких как анализ вредоносных программ, обнаружение уязвимостей и анализ первопричин. В этой серии постов в блоге мы познакомим читателя с тем, как начать работу с фреймворком обратного инжиниринга PANDA, создав специальную изолированную программную среду с нуля.
Цель этого поста в блоге - показать, как выполнить анализ определенного приложения Windows с использованием инфраструктуры PANDA. Более конкретно, в этом посте мы рассмотрим:
Обзор PANDA
PANDA является аббревиатурой от Platform for Architecture-Neutral Dynamic Analysis и в основном состоит из NYU, MIT Lincoln lab и Северо-восточного университета. Проект активно поддерживается на Github здесь и поставляется с обширным руководством, расположенным здесь. По сравнению со многими другими системами динамического анализа, отличительной особенностью PANDA является то, что анализ выполняется вне песочницы. В частности, это означает, что PANDA создает гостевую виртуальную машину, и весь анализ основан на интерпретации состояния гостя из виртуального оборудования.
Архитектура и особенности PANDA
PANDA создан на основе полнофункционального эмулятора QEMU и в настоящее время синхронизируется с версией QEMU 2.9.1. Центральным аспектом PANDA является система, которая позволяет записывать и воспроизводить выполнение всей ОС как способ быстрого обратного инжиниринга. Фреймворк удобен для пользователя в том смысле, что имеет обширную архитектуру плагинов и поставляется со многими существующими плагинами (на момент написания этой статьи в репозитории PANDA было более 40 плагинов). В дополнение к этому, PANDA также имеет функцию для перевода промежуточного представления QEMU, TCG, в код LLVM, который позволяет писать полнофункциональные инструменты динамического анализа посредством проходов LLVM. Это мощная функция, которая объединяет две структуры анализа программ QEMU и LLVM, для использования синергизма между ними.
Рабочий процесс PANDA, как показано в официальном руководстве .
В этом посте мы делаем акцент на использовании PANDA, создавая плагины, а не расширяя ядро PANDA. На рисунке ниже мы показываем основные компоненты, которые позволяют писать плагины PANDA. С высокоуровневой точки зрения плагины взаимодействуют с QEMU двумя основными способами: (1) посредством обратных вызовов инструментария и (2) посредством API проверки, который отображает состояние гостевой системы, например, состояние памяти. Вместе мы называем эти два интерфейса плагина.
Основные компоненты PANDA с точки зрения написания плагинов. Красные линии между плагинами показывают зависимости.
Плагины строго используют интерфейс для создания сложных инструментов динамического анализа. Полный список обратных вызовов приводятся в официальном PANDA руководстве здесь. С некоторыми из наиболее важных мы ознакомимся здесь:
По сути, эти обратные вызовы позволяют нам перехватывать выполнение всякий раз, когда происходит специальное событие, например, перед выполнением каждой гостевой инструкции, и выполнения кода C / C ++. Кроме того, PANDA рекомендует авторам плагинов повторно использовать функциональные возможности друг друга и проводить сложные анализы путем использования каждого плагина в качестве «атомарного объекта». Таким образом, PANDA поддерживает различные функции, позволяющие подключаемым модулям зависеть от других подключаемых модулей, а также функции импорта/экспорта.
Мы используем обратные вызовы, чтобы перехватить выполнение гостевой машины и выполнить анализ, ещё PANDA предоставляет несколько функций, которые облегчают интерпретацию гостевого состояния. В частности, следующие функции из common.h примерно предоставляют API, который нам предлагается - ядром PANDA для анализа состояния гостевой системы:
В дополнение к этому, обратные вызовы PANDA обеспечивают легкий доступ к структуре QEMU CPUState, которая дает нам доступ к специфическим для гостевой машины функциям, например, к регистрам. Таким образом, поскольку наш анализ выполняется за пределами гостевой системы, мы должны выполнить анализ «снизу вверх», интерпретируя двоичные данные и создавая абстракции вверх по отношению к конструкциям уровня ОС. Этот процесс называется интроспекцией виртуальной машины (VMI), и PANDA предоставляет множество плагинов, которые могут сделать это для различных операционных систем.
Коллекция плагинов, поставляемых с PANDA, является одной из основных сильных сторон проекта, и во многих отношениях довольно увлекательной. Это очень сильная сторона PANDA, потому что она позволяет быстро разрабатывать инструменты анализа, которые используют сложные методы анализа, такие как динамический анализ заражения. Список плагинов в PANDA приведен здесь в руководстве, и вы можете увидеть исходный код в дереве папок здесь . Следующая таблица показывает некоторые из интересных:
Сборка PANDA
Чтобы начать работать с PANDA, первым делом нужно скомпилировать исходный код. PANDA поставляется с простой системой сборки для Ubuntu, и для этого поста в блоге я использовал чистую установку Ubuntu 16.04 на компьютере VirtualBox.
Включение анализа приложений Windows в PANDA
Запись и воспроизведение образа разработчика для Windows
В этом посте цель состоит в том, чтобы включить анализ произвольных приложений Windows, и первый шаг к достижению нашей цели - включить запись и воспроизведение исполнений Windows. Для этого нам нужен образ Windows, и мы получим его с официальной веб-страницы Microsoft, где они предлагают образы разработчиков для тестирования ваших приложений. Мы будем использовать одно из этих изображений, в данном случае это образ Windows 7, и преобразовать их в удобный формат - от VirtualBox-совместимого до QEMU-friendly. Сценарий ниже загрузит изображение и преобразует его в формат
Запустив этот скрипт, мы получаем образ qcow2, готовый к выполнению с помощью PANDA в
Процесс записи исполнения в PANDA показан в выводе ниже.
Файлы, созданные PANDA, которые нам нужны для воспроизведения, приведены в s
Наконец, для воспроизведения исполнения мы используем параметр командной строки
Разборка Windows для быстрого анализа
Эмуляция - это трудоемкий процесс, и желательно ускориться местах, которые очевидны. Особая стратегия, которая может ускорить эмуляцию, состоит в том, чтобы настроить гостевую систему в максимально ориентированное на производительность состояние. Мы можем сделать это с системами Windows, ограничив количество визуальных эффектов следующими шагами:
Инфраструктура для анализа конкретных образцов
На этом этапе мы можем записать выполнение и воспроизвести его, используя PANDA, однако нам все еще нужен механизм, который позволяет нам записывать выполнение, в котором выполняется наше целевое приложение. Цель состоит в том, чтобы иметь гибкий подход, который позволяет нам переносить наше приложение из среды хоста в гостевую среду, а затем запускать выполнение приложения в гостевой среде. Кроме того, мы хотим сделать это без развертывания каких-либо сценариев или подобных программ в гостевой системе.
Структура, которую мы настроим, состоит в том, чтобы передавать целевое приложение на виртуальную машину через виртуальный CD-ROM в QEMU, а затем выполнять команды на нашей виртуальной машине, отправляя соответствующие нажатия клавиш виртуальной машине. Это реализовано фреймворком malrec от Брендана Долана-Гавитта здесь .
Настройка соответствующего снимка
Теперь нам нужно настроить виртуальную машину в состояние, при котором мы можем легко выполнить наше приложение из песочницы. Для этого мы должны открыть командную строку в нашей гостевой системе, а затем сохранить состояние виртуальной машины. Затем мы собираемся использовать этот моментальный снимок, взаимодействуя с командной строкой из песочницы, отправляя соответствующие нажатия клавиш.
Чтобы создать снимок, запустите виртуальную машину в PANDA и запустите интерфейс командной строки Windows в гостевой среде, достигнув состояния, показанного на следующем рисунке.
На этом этапе введите
Это создает моментальный снимок состояния, который мы можем запустить мгновенно, и поскольку командная строка находится в "фокусе" гостя, мы можем управлять гостевым компьютером извне, отправляя нажатия клавиш на машину. Для запуска снимка мы используем -loadvmflag, как показано в следующей команде:
Архитектура окружающей инфраструктуры
Запись исполнения образца
Теперь мы настроили соответствующий снимок для нашей виртуальной машины Windows, и следующим шагом является создание структуры, которая отправляет приложение в виртуальную машину и запускает приложение внутри виртуальной машины. Стратегия, которую мы используем, заключается в том, чтобы преобразовать образец в файла .iso, смонтировать этот файл .iso на нашей виртуальной машине, а затем дать виртуальной машине команду извлекать файл из своего компакт-диска и запускать его как приложение. В частности, мы будем отправлять нажатия клавиш на гостевой компьютер, которые будут запускать следующие команды:
Следующий скрипт Python автоматизирует этот процесс:
Мы можем использовать этот сценарий следующим образом, где аргумент
Воспроизведение записи
Проще говоря, воспроизведение намного проще, чем запись, потому что нам нужно только воспроизвести запись, не взаимодействуя с нашей гостевой машиной. Естественно, по мере того, как мы прогрессируем в использовании PANDA и начинаем использовать плагины, сам процесс воспроизведения станет более сложным и существенным, поскольку мы должны соответствующим образом взаимодействовать с плагинами. Однако на данный момент мы поддерживаем сценарий воспроизведения в качестве простой оболочки вокруг вызова PANDA.
Мы можем использовать этот сценарий следующим образом, где
Использование существующих соответствующих плагинов PANDA
На данный момент мы создали структуру, которая позволяет нам легко записывать и воспроизводить приложение в PANDA. Тем не менее, нам еще предстоит сделать что-то захватывающее с записью, которая позволит нам перепроектировать и изучить данное приложение, и это наш следующий шаг. Чтобы сохранить этот пост в блоге, мы сосредоточимся на том, как использовать существующие плагины PANDA, а не на написании наших собственных плагинов.
Мониторинг процессов нашей системы
Первый шаг, который мы предпринимаем - это использование двух плагинов для интроспекции виртуальной машины (VMI) PANDA, osi и win7x86intro, для мониторинга процессов, которые выполняются в записанной системе. Самоанализ виртуальной машины - это метод, который позволяет нам интерпретировать состояние гостевой системы исключительно на основе интерпретации гостевого оборудования. Мы должны сделать это, потому что мы делаем весь наш анализ вне системы, которую мы контролируем. Дополнительным преимуществом этого является то, что гостевая система остается относительно прозрачной по сравнению с размещением специфических для анализа артефактов в гостевой системе, таких как драйвер анализа. Недостатком является то, что мы должны выводить абстракции на уровне ОС исключительно из наблюдения за памятью, и мы не можем использовать для этого обычные API, предоставляемые Windows.
Подход, который мы используем, заключается в расширении нашего сценария
Мы расширяем плагин
Мы можем использовать этот скрипт следующим образом:
Обратите внимание, что вывод в
Важно подчеркнуть, что технически здесь произошло. Мы записали выполнение полной ОС Windows, выполнив образец по нашему выбору, и извлекли все процессы в системе, а также информацию о динамически загружаемых модулях. Мы сделали это без развертывания какого-либо кода в ОС, которая выполняла наш образец, а это означает, что вся информация была получена путем интерпретации состояния гостевой системы на основе ее аппаратного обеспечения. Кроме того, мы создали несколько сценариев, которые позволяют нам легко это делать, что будет очень полезно для будущих разработок и работы с PANDA в целом. Все это было достигнуто с помощью небольшого кода в результате большой простоты использования PANDA. Это лишь небольшое количество возможностей PANDA. PANDA действительно превосходно выполняет сложные анализы, а не просто показывает процессы в системе. Тем не менее, мы закончим статью здесь, поскольку она отмечает важный первый шаг к использованию PANDA.
Выводы
В этой статье мы рассмотрели, как настроить среду анализа с помощью PANDA, которая позволяет нам проводить удобный анализ системы, которая запускает данное приложение по нашему выбору. В этом небольшом путешествии мы рассмотрели несколько тем, а именно: (0) вводный обзор PANDA, (1) включение анализа на основе Windows с помощью PANDA, (2) создание подходящей инфраструктуры записи и воспроизведения вокруг PANDA и, наконец, (3) пример того, как использовать существующий плагин PANDA для извлечения артефактов гостевой системы.
Цель заключалась в том, чтобы преодолеть разрыв между интересами PANDA к запуску и запуску системы, которая может автоматически записывать и выполнять произвольное приложение и использовать существующие возможности PANDA в качестве примитивов анализа. Следующие шаги - написать плагины, которые автоматизируют процедуры анализа, и мы оставим это для будущих публикаций в блоге.
Переведено специально для https://xss.pro
Переводчик статьи - https://xss.pro/members/177895/
Оригинал - https://adalogics.com/blog/Building-a-custom-malware-sandbox-with-PANDA-Part-1
В последнее десятилетие было много улучшений в методах детального анализа, которые сосредоточены на автоматизации обратного инжиниринга. Инфраструктура обратного инжиниринга PANDA представляет особый интерес, поскольку является зрелой платформой, которая предлагает основу, необходимую для разработки детальных инструментов динамического анализа, которые включают большое количество приложений, таких как анализ вредоносных программ, обнаружение уязвимостей и анализ первопричин. В этой серии постов в блоге мы познакомим читателя с тем, как начать работу с фреймворком обратного инжиниринга PANDA, создав специальную изолированную программную среду с нуля.
Цель этого поста в блоге - показать, как выполнить анализ определенного приложения Windows с использованием инфраструктуры PANDA. Более конкретно, в этом посте мы рассмотрим:
- Обзор PANDA с точки зрения авторов плагинов
- Как настроить инфраструктуру для записи и воспроизведения систем Windows (без владения ключом Windows CD)
- Как создать инфраструктуру, которая позволяет легко записывать / воспроизводить приложения, существующие вне системы анализа
- Как использовать существующие плагины PANDA для анализа гостевой системы
Обзор PANDA
PANDA является аббревиатурой от Platform for Architecture-Neutral Dynamic Analysis и в основном состоит из NYU, MIT Lincoln lab и Северо-восточного университета. Проект активно поддерживается на Github здесь и поставляется с обширным руководством, расположенным здесь. По сравнению со многими другими системами динамического анализа, отличительной особенностью PANDA является то, что анализ выполняется вне песочницы. В частности, это означает, что PANDA создает гостевую виртуальную машину, и весь анализ основан на интерпретации состояния гостя из виртуального оборудования.
Архитектура и особенности PANDA
PANDA создан на основе полнофункционального эмулятора QEMU и в настоящее время синхронизируется с версией QEMU 2.9.1. Центральным аспектом PANDA является система, которая позволяет записывать и воспроизводить выполнение всей ОС как способ быстрого обратного инжиниринга. Фреймворк удобен для пользователя в том смысле, что имеет обширную архитектуру плагинов и поставляется со многими существующими плагинами (на момент написания этой статьи в репозитории PANDA было более 40 плагинов). В дополнение к этому, PANDA также имеет функцию для перевода промежуточного представления QEMU, TCG, в код LLVM, который позволяет писать полнофункциональные инструменты динамического анализа посредством проходов LLVM. Это мощная функция, которая объединяет две структуры анализа программ QEMU и LLVM, для использования синергизма между ними.
Рабочий процесс PANDA, как показано в официальном руководстве .
В этом посте мы делаем акцент на использовании PANDA, создавая плагины, а не расширяя ядро PANDA. На рисунке ниже мы показываем основные компоненты, которые позволяют писать плагины PANDA. С высокоуровневой точки зрения плагины взаимодействуют с QEMU двумя основными способами: (1) посредством обратных вызовов инструментария и (2) посредством API проверки, который отображает состояние гостевой системы, например, состояние памяти. Вместе мы называем эти два интерфейса плагина.
Основные компоненты PANDA с точки зрения написания плагинов. Красные линии между плагинами показывают зависимости.
Плагины строго используют интерфейс для создания сложных инструментов динамического анализа. Полный список обратных вызовов приводятся в официальном PANDA руководстве здесь. С некоторыми из наиболее важных мы ознакомимся здесь:
| Имя обратного вызова | Триггерная точка |
|---|---|
| PANDA_CB_BEFORE_BLOCK_EXEC | Перед выполнением каждого базового блока |
| PANDA_CB_AFTER_BLOCK_EXEC | После выполнения каждого базового блока |
| PANDA_CB_INSN_EXEC | Перед выполнением инструкции |
| PANDA_CB_AFTER_INSN_EXEC | После выполнения инструкции |
| PANDA_CB_VIRT_MEM_AFTER_READ | После чтения виртуальной памяти |
| PANDA_CB_VIRT_MEM_AFTER_WRITE | После записи в виртуальную память |
| PANDA_CB_HD_READ | Каждый HDD прочитан |
| PANDA_CB_HD_WRITE | Каждый HDD пишет |
| PANDA_CB_ASID_CHANGED | После ASID (идентификатор адресного пространства - он же PGD) напишите |
По сути, эти обратные вызовы позволяют нам перехватывать выполнение всякий раз, когда происходит специальное событие, например, перед выполнением каждой гостевой инструкции, и выполнения кода C / C ++. Кроме того, PANDA рекомендует авторам плагинов повторно использовать функциональные возможности друг друга и проводить сложные анализы путем использования каждого плагина в качестве «атомарного объекта». Таким образом, PANDA поддерживает различные функции, позволяющие подключаемым модулям зависеть от других подключаемых модулей, а также функции импорта/экспорта.
Мы используем обратные вызовы, чтобы перехватить выполнение гостевой машины и выполнить анализ, ещё PANDA предоставляет несколько функций, которые облегчают интерпретацию гостевого состояния. В частности, следующие функции из common.h примерно предоставляют API, который нам предлагается - ядром PANDA для анализа состояния гостевой системы:
| Имя функции | Описание |
|---|---|
| panda_physical_memory_rw | Читает или пишет в физическую память |
| panda_virt_to_phys | Преобразует виртуальный адрес в физический адрес |
| panda_virtual_memory_read | Читает виртуальную память |
| panda_virtual_memory_write | Пишет в виртуальную память |
| panda_in_kernel | Определяет, выполняется ли в данный момент выполнение в ядре |
| panda_current_sp | Возвращает текущее значение указателя стека |
В дополнение к этому, обратные вызовы PANDA обеспечивают легкий доступ к структуре QEMU CPUState, которая дает нам доступ к специфическим для гостевой машины функциям, например, к регистрам. Таким образом, поскольку наш анализ выполняется за пределами гостевой системы, мы должны выполнить анализ «снизу вверх», интерпретируя двоичные данные и создавая абстракции вверх по отношению к конструкциям уровня ОС. Этот процесс называется интроспекцией виртуальной машины (VMI), и PANDA предоставляет множество плагинов, которые могут сделать это для различных операционных систем.
Коллекция плагинов, поставляемых с PANDA, является одной из основных сильных сторон проекта, и во многих отношениях довольно увлекательной. Это очень сильная сторона PANDA, потому что она позволяет быстро разрабатывать инструменты анализа, которые используют сложные методы анализа, такие как динамический анализ заражения. Список плагинов в PANDA приведен здесь в руководстве, и вы можете увидеть исходный код в дереве папок здесь . Следующая таблица показывает некоторые из интересных:
| Название плагина | Описание |
|---|---|
| syscalls2 | Предоставляет обратные вызовы, которые разрешают уведомление всякий раз, когда в гостевой системе происходят системные вызовы, и могут предоставлять параметры для каждого системного вызова. |
| callstack_instr | Отслеживает вызовы функций и возвращает гостей. |
| покрытие | Укажите адрес и размер каждого выполняемого блока, а также идентификатор процесса и идентификатор потока во время выполнения блока. |
| stringsearch | Поиск строк, которые читаются или записываются в память в разных точках. |
| taint2 | Полный системный динамический анализ заражения. |
| tainted_net | Позволяет пользователю портить входящие сетевые пакеты и выполнять квест на исходящих сетевых пакетах. |
| ida_taint2 | Извлекает информацию о том, какие инструкции оперировали с испорченными данными, которые можно визуализировать в IDA. |
| win7x86intro | Самоанализ виртуальной машины для Windows 7 32-bit. |
| winxp86intro | Самоанализ виртуальной машины для Windows XP 32-bit. |
| osi_linux | Самоанализ виртуальной машины для Linux. |
Сборка PANDA
Чтобы начать работать с PANDA, первым делом нужно скомпилировать исходный код. PANDA поставляется с простой системой сборки для Ubuntu, и для этого поста в блоге я использовал чистую установку Ubuntu 16.04 на компьютере VirtualBox.
Код:
$ git clone https://github.com/panda-re/panda
Cloning into 'panda'...
remote: Enumerating objects: 62, done.
remote: Counting objects: 100% (62/62), done.
remote: Compressing objects: 100% (59/59), done.
remote: Total 356047 (delta 29), reused 20 (delta 3), pack-reused 355985
Receiving objects: 100% (356047/356047), 191.65 MiB | 6.52 MiB/s, done.
Resolving deltas: 100% (283761/283761), done.
Checking connectivity... done.
$ ./panda/panda/scripts/install_ubuntu.sh
...
...
[ panda_install ] PANDA is built and ready to use in panda/build/[ arch ]-softmmu/qemu-system-[ arch ].
$
Включение анализа приложений Windows в PANDA
Запись и воспроизведение образа разработчика для Windows
В этом посте цель состоит в том, чтобы включить анализ произвольных приложений Windows, и первый шаг к достижению нашей цели - включить запись и воспроизведение исполнений Windows. Для этого нам нужен образ Windows, и мы получим его с официальной веб-страницы Microsoft, где они предлагают образы разработчиков для тестирования ваших приложений. Мы будем использовать одно из этих изображений, в данном случае это образ Windows 7, и преобразовать их в удобный формат - от VirtualBox-совместимого до QEMU-friendly. Сценарий ниже загрузит изображение и преобразует его в формат
QCOW2, который может использоваться PANDA.
Код:
# Create a working directory
mkdir sandbox_base
cd sandbox_base
# Download the disk image from Microsofts' website
# (URL from https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)
wget https://az792536.vo.msecnd.net/vms/VMBuild_20150916/VirtualBox/IE8/IE8.Win7.VirtualBox.zip
# Unzip the virtualbox zip
unzip IE8.Win7.VirtualBox.zip
# Untar the .ova
tar -xvf IE8\ -\ Win7.ova
# Create a qcow image from the .vmdk file.
## First install qemu utils
sudo apt-get install qemu-utils
## Then create our image
qemu-img convert -O qcow2 IE8\ -\ Win7-disk1.vmdk IE8_win7_disk1.qcow2
chmod +x ./IE8_win7_disk1.qcow2
## Clean up some of the unnecessary files
rm IE8\ -\ Win7-disk1.vmdk
rm IE8\ -\ Win7.ova
Запустив этот скрипт, мы получаем образ qcow2, готовый к выполнению с помощью PANDA в
IE8-win7-disk1.qcow. Чтобы проверить, способен ли PANDA выполнить наш образ, выполните команду $panda/build/i386-softmmu/qemu-system-i386 IE8-win7-disk1.qcow2, которая должна запустить компьютер с Windows. Предполагая, что всё работает, следующий шаг должен гарантировать, что мы можем записать и воспроизвести выполнение. Для этого достаточно просто запустить нашу виртуальную машину, а затем использовать команды PANDA begin_record NAME и end_record, где NAME - это просто произвольное имя, которое вы даете записи.Процесс записи исполнения в PANDA показан в выводе ниже.
Код:
$ ./panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 ./IE8_win7_disk1.qcow2
QEMU 2.8.50 monitor - type 'help' for more information
(qemu) main-loop: WARNING: I/O thread spun for 1000 iterations
(qemu) begin_record sample
(qemu) writing snapshot: ./sample-rr-snp
opening nondet log for write : ./sample-rr-nondet.log
(qemu) end_record
(qemu) Time taken was: 17 seconds.
Checksum of guest memory: 0x13bbbcdb
$ ls -la
total 24767408
drwxrwx--- 1 root vboxsf 4096 Jul 16 10:23 .
drwxrwx--- 1 root vboxsf 4096 Jul 16 10:02 ..
-rwxrwx--- 1 root vboxsf 11149049856 Jul 16 10:23 IE8_win7_disk1.qcow2
-rwxrwx--- 1 root vboxsf 4573000704 Sep 23 2015 IE8 - Win7-disk1.vmdk
-rwxrwx--- 1 root vboxsf 4573019136 Sep 23 2015 IE8 - Win7.ova
-rwxrwx--- 1 root vboxsf 17138 Sep 23 2015 IE8 - Win7.ovf
-rwxrwx--- 1 root vboxsf 4497629147 Sep 23 2015 IE8.Win7.VirtualBox.zip
-rwxrwx--- 1 root vboxsf 1989146 Jul 16 10:23 sample-rr-nondet.log
-rwxrwx--- 1 root vboxsf 567470712 Jul 16 10:23 sample-rr-snp
Файлы, созданные PANDA, которые нам нужны для воспроизведения, приведены в s
ample-rr-nondet.log и sample-rr-snp. Файл sample-rr-snp содержит моментальный снимок памяти в начале записи, а файл sample-rr-nondet.log содержит входные данные для ЦП, необходимые для воспроизведения.Наконец, для воспроизведения исполнения мы используем параметр командной строки
-replay NAME, принятый qemu PANDA. Процесс воспроизведения исполнения, который мы только что записали, показан в выводе ниже.
Код:
$ ./panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 -replay sample
QEMU 2.8.50 monitor - type 'help' for more information
(qemu) loading snapshot
... done.
opening nondet log for read : ./sample-rr-nondet.log
./sample-rr-nondet.log: 2420013644 instrs total.
sample: 24200159 ( 1.00%) instrs. 0.94 sec. 1.55 GB ram.
sample: 48400287 ( 2.00%) instrs. 1.32 sec. 1.56 GB ram.
sample: 72600415 ( 3.00%) instrs. 1.57 sec. 1.57 GB ram.
sample: 96800548 ( 4.00%) instrs. 1.86 sec. 1.57 GB ram.
sample: 121000684 ( 5.00%) instrs. 2.20 sec. 1.58 GB ram.
sample: 145200825 ( 6.00%) instrs. 2.45 sec. 1.58 GB ram.
sample: 169400959 ( 7.00%) instrs. 2.86 sec. 1.59 GB ram.
sample: 193601097 ( 8.00%) instrs. 3.13 sec. 1.59 GB ram.
sample: 217801234 ( 9.00%) instrs. 3.43 sec. 1.60 GB ram.
sample: 242001368 ( 10.00%) instrs. 3.70 sec. 1.60 GB ram.
sample: 266201509 ( 11.00%) instrs. 4.04 sec. 1.60 GB ram.
sample: 290401644 ( 12.00%) instrs. 4.37 sec. 1.60 GB ram.
sample: 314601792 ( 13.00%) instrs. 4.76 sec. 1.61 GB ram.
sample: 338801916 ( 14.00%) instrs. 5.11 sec. 1.61 GB ram.
sample: 363002047 ( 15.00%) instrs. 5.44 sec. 1.61 GB ram.
sample: 387202184 ( 16.00%) instrs. 5.85 sec. 1.62 GB ram.
sample: 411402321 ( 17.00%) instrs. 6.36 sec. 1.64 GB ram.
sample: 435602458 ( 18.00%) instrs. 6.76 sec. 1.65 GB ram.
sample: 459802597 ( 19.00%) instrs. 7.13 sec. 1.65 GB ram.
sample: 484002729 ( 20.00%) instrs. 7.49 sec. 1.65 GB ram.
sample: 508202874 ( 21.00%) instrs. 8.04 sec. 1.66 GB ram.
sample: 532403004 ( 22.00%) instrs. 8.49 sec. 1.67 GB ram.
sample: 556603162 ( 23.00%) instrs. 8.80 sec. 1.67 GB ram.
sample: 580803278 ( 24.00%) instrs. 9.20 sec. 1.67 GB ram.
sample: 605003437 ( 25.00%) instrs. 9.61 sec. 1.68 GB ram.
sample: 629203557 ( 26.00%) instrs. 9.99 sec. 1.68 GB ram.
sample: 653403687 ( 27.00%) instrs. 10.34 sec. 1.68 GB ram.
sample: 677603838 ( 28.00%) instrs. 10.71 sec. 1.68 GB ram.
sample: 701803983 ( 29.00%) instrs. 11.07 sec. 1.68 GB ram.
sample: 726004095 ( 30.00%) instrs. 11.59 sec. 1.69 GB ram.
sample: 750204256 ( 31.00%) instrs. 12.00 sec. 1.69 GB ram.
sample: 774404373 ( 32.00%) instrs. 12.42 sec. 1.70 GB ram.
sample: 798604517 ( 33.00%) instrs. 12.89 sec. 1.70 GB ram.
sample: 822804653 ( 34.00%) instrs. 13.32 sec. 1.71 GB ram.
sample: 847004777 ( 35.00%) instrs. 13.64 sec. 1.71 GB ram.
sample: 871204927 ( 36.00%) instrs. 13.99 sec. 1.72 GB ram.
sample: 895405049 ( 37.00%) instrs. 14.23 sec. 1.72 GB ram.
sample: 919605204 ( 38.00%) instrs. 14.50 sec. 1.72 GB ram.
sample: 943805323 ( 39.00%) instrs. 14.86 sec. 1.72 GB ram.
sample: 968005462 ( 40.00%) instrs. 15.18 sec. 1.72 GB ram.
sample: 992205600 ( 41.00%) instrs. 15.65 sec. 1.72 GB ram.
sample: 1016405732 ( 42.00%) instrs. 16.02 sec. 1.72 GB ram.
sample: 1040605868 ( 43.00%) instrs. 16.43 sec. 1.73 GB ram.
sample: 1064806008 ( 44.00%) instrs. 16.92 sec. 1.74 GB ram.
sample: 1089006140 ( 45.00%) instrs. 17.50 sec. 1.75 GB ram.
sample: 1113206282 ( 46.00%) instrs. 17.80 sec. 1.75 GB ram.
sample: 1137406418 ( 47.00%) instrs. 18.23 sec. 1.75 GB ram.
sample: 1161606552 ( 48.00%) instrs. 18.65 sec. 1.76 GB ram.
sample: 1185806690 ( 49.00%) instrs. 19.06 sec. 1.76 GB ram.
sample: 1210006826 ( 50.00%) instrs. 19.39 sec. 1.76 GB ram.
sample: 1234206960 ( 51.00%) instrs. 19.58 sec. 1.76 GB ram.
sample: 1258407119 ( 52.00%) instrs. 19.75 sec. 1.76 GB ram.
sample: 1282607232 ( 53.00%) instrs. 19.90 sec. 1.76 GB ram.
sample: 1306807373 ( 54.00%) instrs. 20.16 sec. 1.76 GB ram.
sample: 1331007508 ( 55.00%) instrs. 20.37 sec. 1.76 GB ram.
sample: 1355207641 ( 56.00%) instrs. 20.61 sec. 1.76 GB ram.
sample: 1379407783 ( 57.00%) instrs. 20.84 sec. 1.76 GB ram.
sample: 1403607935 ( 58.00%) instrs. 21.03 sec. 1.76 GB ram.
sample: 1427808058 ( 59.00%) instrs. 21.28 sec. 1.76 GB ram.
sample: 1452008195 ( 60.00%) instrs. 21.42 sec. 1.76 GB ram.
sample: 1476208331 ( 61.00%) instrs. 21.73 sec. 1.76 GB ram.
sample: 1500408467 ( 62.00%) instrs. 21.97 sec. 1.76 GB ram.
sample: 1524608600 ( 63.00%) instrs. 22.24 sec. 1.76 GB ram.
sample: 1548808755 ( 64.00%) instrs. 22.49 sec. 1.77 GB ram.
sample: 1573008870 ( 65.00%) instrs. 22.75 sec. 1.77 GB ram.
sample: 1597209007 ( 66.00%) instrs. 23.01 sec. 1.77 GB ram.
sample: 1621409143 ( 67.00%) instrs. 23.26 sec. 1.77 GB ram.
sample: 1645609281 ( 68.00%) instrs. 23.54 sec. 1.77 GB ram.
sample: 1669809415 ( 69.00%) instrs. 23.81 sec. 1.77 GB ram.
sample: 1694009557 ( 70.00%) instrs. 24.12 sec. 1.77 GB ram.
sample: 1718209694 ( 71.00%) instrs. 24.38 sec. 1.77 GB ram.
sample: 1742409825 ( 72.00%) instrs. 24.66 sec. 1.77 GB ram.
sample: 1766609962 ( 73.00%) instrs. 24.90 sec. 1.77 GB ram.
sample: 1790810100 ( 74.00%) instrs. 25.10 sec. 1.77 GB ram.
sample: 1815010235 ( 75.00%) instrs. 25.31 sec. 1.77 GB ram.
sample: 1839210376 ( 76.00%) instrs. 25.53 sec. 1.77 GB ram.
sample: 1863410512 ( 77.00%) instrs. 25.73 sec. 1.77 GB ram.
sample: 1887610645 ( 78.00%) instrs. 25.97 sec. 1.77 GB ram.
sample: 1911810792 ( 79.00%) instrs. 26.18 sec. 1.77 GB ram.
sample: 1936010916 ( 80.00%) instrs. 26.50 sec. 1.78 GB ram.
sample: 1960211054 ( 81.00%) instrs. 26.75 sec. 1.78 GB ram.
sample: 1984411191 ( 82.00%) instrs. 27.04 sec. 1.78 GB ram.
sample: 2008611326 ( 83.00%) instrs. 27.37 sec. 1.78 GB ram.
sample: 2032811464 ( 84.00%) instrs. 27.59 sec. 1.78 GB ram.
sample: 2057011604 ( 85.00%) instrs. 27.83 sec. 1.78 GB ram.
sample: 2081211751 ( 86.00%) instrs. 28.10 sec. 1.78 GB ram.
sample: 2105411880 ( 87.00%) instrs. 28.48 sec. 1.78 GB ram.
sample: 2129612008 ( 88.00%) instrs. 28.72 sec. 1.79 GB ram.
sample: 2153812144 ( 89.00%) instrs. 29.03 sec. 1.79 GB ram.
sample: 2178012287 ( 90.00%) instrs. 29.23 sec. 1.79 GB ram.
sample: 2202212431 ( 91.00%) instrs. 29.52 sec. 1.79 GB ram.
sample: 2226412555 ( 92.00%) instrs. 29.71 sec. 1.79 GB ram.
sample: 2250612689 ( 93.00%) instrs. 29.91 sec. 1.79 GB ram.
sample: 2274812829 ( 94.00%) instrs. 30.09 sec. 1.79 GB ram.
sample: 2299012962 ( 95.00%) instrs. 30.30 sec. 1.79 GB ram.
sample: 2323213104 ( 96.00%) instrs. 30.48 sec. 1.79 GB ram.
sample: 2347413235 ( 97.00%) instrs. 30.67 sec. 1.79 GB ram.
sample: 2371613380 ( 98.00%) instrs. 30.86 sec. 1.79 GB ram.
sample: 2395813517 ( 99.00%) instrs. 31.04 sec. 1.79 GB ram.
./sample-rr-nondet.log: log is empty.
./sample-rr-nondet.log: log is empty.
Replay completed successfully. 1
Time taken was: 32 seconds.
Stats:
RR_INPUT_1 number = 0, size = 0 bytes
RR_INPUT_2 number = 0, size = 0 bytes
RR_INPUT_4 number = 7256, size = 101584 bytes
RR_INPUT_8 number = 33198, size = 597564 bytes
RR_INTERRUPT_REQUEST number = 6113, size = 85582 bytes
RR_EXIT_REQUEST number = 0, size = 0 bytes
RR_SKIPPED_CALL number = 570, size = 1204398 bytes
RR_END_OF_LOG number = 1, size = 10 bytes
RR_PENDING_INTERRUPTS number = 0, size = 0 bytes
RR_EXCEPTION number = 0, size = 0 bytes
max_queue_len = 133
Checksum of guest memory: 0x13bbbcdb
Replay completed successfully 2.
$
Разборка Windows для быстрого анализа
Эмуляция - это трудоемкий процесс, и желательно ускориться местах, которые очевидны. Особая стратегия, которая может ускорить эмуляцию, состоит в том, чтобы настроить гостевую систему в максимально ориентированное на производительность состояние. Мы можем сделать это с системами Windows, ограничив количество визуальных эффектов следующими шагами:
- Нажмите кнопку "Домой"
- Щелкните правой кнопкой мыши на "Мой компьютер"
- Выберите "Свойства"
- Перейдите к "Информация о производительности и инструменты"
- Выберите "Настроить визуальные эффекты"
- Выберите опцию "Настроить для лучшей производительности" и нажмите "Применить".
Инфраструктура для анализа конкретных образцов
На этом этапе мы можем записать выполнение и воспроизвести его, используя PANDA, однако нам все еще нужен механизм, который позволяет нам записывать выполнение, в котором выполняется наше целевое приложение. Цель состоит в том, чтобы иметь гибкий подход, который позволяет нам переносить наше приложение из среды хоста в гостевую среду, а затем запускать выполнение приложения в гостевой среде. Кроме того, мы хотим сделать это без развертывания каких-либо сценариев или подобных программ в гостевой системе.
Структура, которую мы настроим, состоит в том, чтобы передавать целевое приложение на виртуальную машину через виртуальный CD-ROM в QEMU, а затем выполнять команды на нашей виртуальной машине, отправляя соответствующие нажатия клавиш виртуальной машине. Это реализовано фреймворком malrec от Брендана Долана-Гавитта здесь .
Настройка соответствующего снимка
Теперь нам нужно настроить виртуальную машину в состояние, при котором мы можем легко выполнить наше приложение из песочницы. Для этого мы должны открыть командную строку в нашей гостевой системе, а затем сохранить состояние виртуальной машины. Затем мы собираемся использовать этот моментальный снимок, взаимодействуя с командной строкой из песочницы, отправляя соответствующие нажатия клавиш.
Чтобы создать снимок, запустите виртуальную машину в PANDA и запустите интерфейс командной строки Windows в гостевой среде, достигнув состояния, показанного на следующем рисунке.
На этом этапе введите
savevm в интерфейсе командной строки QEMU, чтобы сохранить состояние виртуальной машины:
Код:
$ ./panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 ./IE8_win7_disk1.qcow2
QEMU 2.9.1 monitor - type 'help' for more information
(qemu) savevm
Это создает моментальный снимок состояния, который мы можем запустить мгновенно, и поскольку командная строка находится в "фокусе" гостя, мы можем управлять гостевым компьютером извне, отправляя нажатия клавиш на машину. Для запуска снимка мы используем -loadvmflag, как показано в следующей команде:
Код:
$ ./panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 ./IE8_win7_disk1.qcow2 -loadvm 1
Архитектура окружающей инфраструктуры
Запись исполнения образца
Теперь мы настроили соответствующий снимок для нашей виртуальной машины Windows, и следующим шагом является создание структуры, которая отправляет приложение в виртуальную машину и запускает приложение внутри виртуальной машины. Стратегия, которую мы используем, заключается в том, чтобы преобразовать образец в файла .iso, смонтировать этот файл .iso на нашей виртуальной машине, а затем дать виртуальной машине команду извлекать файл из своего компакт-диска и запускать его как приложение. В частности, мы будем отправлять нажатия клавиш на гостевой компьютер, которые будут запускать следующие команды:
Код:
copy D:\\sample C:\\Users\\IEUser\\Desktop\\sample.exe
start C:\\Users\\IEUser\\Desktop\\sample.exe
Следующий скрипт Python автоматизирует этот процесс:
Код:
import os
import sys
import time
import subprocess
import argparse
import string
import shutil
# Configs
PANDA_BASE = os.path.join(os.path.realpath(__file__), "panda")
PANDA_x86 = os.path.join(PANDA_BASE, "build", "i386-softmmu", "qemu-system-i386")
IMG_PATH = os.path.join(os.path.realpath(__file__), "sandbox_base/IE8_win7_disk1.qcow2")
PANDA_flags = [
"-monitor", "stdio",
"-show-cursor",
"-m", "8192",
"-loadvm", "1",
IMG_PATH
]
TIME_TO_EXECUTE = 20
def log_info(msg):
print("[ + ] %s"%(msg))
def log_exit(msg):
print("[ - ] %s"%(msg))
exit(0)
def guest_type(s, p):
keymap = {
'-': 'minus',
'=': 'equal',
' [ ': 'bracket_left',
' ] ': 'bracket_right',
';': 'semicolon',
'\'': 'apostrophe',
'\\': 'backslash',
',': 'comma',
'.': 'dot',
'/': 'slash',
'*': 'asterisk',
' ': 'spc',
'_': 'shift-minus',
'+': 'shift-equal',
'{': 'shift-bracket_left',
'}': 'shift-bracket_right',
':': 'shift-semicolon',
'"': 'shift-apostrophe',
'|': 'shift-backslash',
'<': 'shift-comma',
'>': 'shift-dot',
'?': 'shift-slash',
'\n': 'ret',
}
for c in s:
if c in string.ascii_uppercase:
key = 'shift-' + c.lower()
else:
key = keymap.get(c, c)
p.stdin.write("sendkey %s\n"%(key))
time.sleep(.5)
def record_execution(sample, recording_time):
'''
'''
log_info("Recording execution %s"%(sample))
log_info("Recording for %d seconds"%(recording_time))
# Create new temporary sample
new_sample = "sample"
shutil.copy(sample, new_sample)
# Create an ISO file of the sample file
cmd = []
cmd.append("/usr/bin/genisoimage")
cmd.append("-iso-level")
cmd.append("4")
cmd.append("-l")
cmd.append("-R")
cmd.append("-J")
cmd.append("-o")
cmd.append("sample.iso")
cmd.append(new_sample)
try:
subprocess.check_call(cmd)
log_info("Made an iso file for the sample")
except Exception:
print(traceback.format_exc())
print(sys.exc_info()[ 0 ])
log_exit("Could not make any iso file for the sample")
# Launch PANDA
cmd = []
cmd.append(PANDA_x86)
for flag in PANDA_flags:
cmd.append(flag)
panda_stdout_path = "panda.stdout"
panda_stderr_path = "panda.stderr"
panda_stdout = open(panda_stdout_path, 'w+')
panda_stderr = open(panda_stderr_path, 'w+')
#log_info("Executing command: %s"%(" ".join(cmd)))
p = subprocess.Popen(cmd,
stdin = subprocess.PIPE,
stdout = panda_stdout,
stderr = panda_stderr)
p.stdin.write("MARK\n")
# Check whenever the virtual machine is ready for us to interact with it.
f_out = open(panda_stdout_path, "r")
while True:
content = f_out.read()
if "MARK" in content:
log_info("VM started")
break
f_out.seek(0)
time.sleep(0.5)
# Sleep for 1 second
time.sleep(1)
# Configure QEMU so the sample.iso file is mounted in the cdrom.
p.stdin.write("change ide1-cd0 sample.iso\n")
# Sleep for 3 seconds
time.sleep(5)
# Because the cd-rom was mounted, a window in the guest was opened,
# close this window now by sending the escape key to the guest.
p.stdin.write("sendkey esc\n")
# Write the command in the guest command line interface to
# copy the sample in the cd-rom drive onto the guest desktop.
copy_cmd = " copy D:\\sample C:\\Users\\IEUser\\Desktop\\sample.exe\n"
guest_type(copy_cmd, p)
# Sleep for 5 seconds to make sure the guest finished it's tasks.
time.sleep(5)
# Start writing the command that will execute the sample inside
# the guest machine. Notice that we don't actually execute the command
# as there is no \n at the end of the line. We do this because we want to
# start recording the guest execution before the application executes
start_cmd = "start C:\\Users\\IEUser\\Desktop\\sample.exe"
guest_type(start_cmd, p)
# Now begin recording before we launch the above command
p.stdin.write("begin_record sample\n")
# Now send the final \n that will launch the execution command.
guest_type("\n", p)
log_info("Started recording and executed the sample in the guest machine")
log_info("Recording for: %d seconds"%(TIME_TO_EXECUTE))
time.sleep(TIME_TO_EXECUTE)
# End the record
p.stdin.write("end_record\n")
# Exit the VM
p.stdin.write("q\n")
log_info("Recording is over, shutting the VM down")
p.stdin.write("q\n")
time.sleep(3)
while True:
poll = p.poll()
if poll == None:
time.sleep(1)
else:
log_info("VM is shut down")
break
log_info("Finished recording the sample execution")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-sample",
help = "The sample to executed",
required = True)
parser.add_argument(
"-time",
help = "The number of seconds to record an execution",
type = int,
default = 25)
args = parser.parse_args(args = sys.argv[1:])
record_execution(args.sample, args.time)
Мы можем использовать этот сценарий следующим образом, где аргумент
-sample указывает путь в хост-системе к сэмплу, который будет выполнен во время записи.
Код:
$ python vm_record.py -sample ./sample_app/msg_app.exe
[+] Recording execution msg_app.exe
[+] Recording for 25 seconds
Warning: Creating ISO-9660:1999 (version 2) filesystem.
Warning: ISO-9660 filenames longer than 31 may cause buffer overflows in the OS.
Total translation table size: 0
Total rockridge attributes bytes: 247
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
191 extents written (0 MB)
[+] Made an iso file for the sample
[+] VM started
[+] Started recording and executed the sample in the guest machine
[+] Recording for: 20 seconds
[+] Recording is over, shutting the VM down
[+] VM is shut down
[+] Finished recording the sample execution
Воспроизведение записи
Проще говоря, воспроизведение намного проще, чем запись, потому что нам нужно только воспроизвести запись, не взаимодействуя с нашей гостевой машиной. Естественно, по мере того, как мы прогрессируем в использовании PANDA и начинаем использовать плагины, сам процесс воспроизведения станет более сложным и существенным, поскольку мы должны соответствующим образом взаимодействовать с плагинами. Однако на данный момент мы поддерживаем сценарий воспроизведения в качестве простой оболочки вокруг вызова PANDA.
Код:
import os
import sys
import subprocess
import argparse
import time
# Configs
PANDA_BASE = os.path.join(os.path.realpath(__file__), "panda")
PANDA_x86 = os.path.join(PANDA_BASE, "build", "i386-softmmu", "qemu-system-i386")
IMG_PATH = os.path.join(os.path.realpath(__file__), "sandbox_base/IE8_win7_disk1.qcow2")
PANDA_flags = [
"-monitor", "stdio",
"-show-cursor",
"-m", "8192",
]
# The PADNA plugins we would like to use
PANDA_plugins = []
def log_info(msg):
print("[+] %s"%(msg))
def log_exit(msg):
print("[-] %s"%(msg))
exit(0)
def replay_recording(snapshot_name):
'''
Replays a recording
'''
log_info("Replaying %s"%(snapshot_name))
# Launch PANDA
cmd = []
cmd.append(PANDA_x86)
cmd.append("-replay")
cmd.append(snapshot_name)
for flag in PANDA_flags:
cmd.append(flag)
for plugin_cmdline in PANDA_plugins:
cmd.append(plugin_cmdline)
# Output files
panda_stdout_path = "replay_panda.stdout"
panda_stderr_path = "replay_panda.stderr"
panda_stdout = open(panda_stdout_path, 'w+')
panda_stderr = open(panda_stderr_path, 'w+')
log_info("Launching replay %s"%(" ".join(cmd)))
try:
p = subprocess.Popen(
" ".join(cmd),
shell=True,
stdout = panda_stdout,
stderr = panda_stderr,
preexec_fn = os.setsid)
except:
log_exit("Could not complete replay")
log_info("Replay launched")
while True:
poll = p.poll()
if poll == None:
time.sleep(1)
else:
log_info("Replaying finished")
break
log_info("Analysis process finished, exiting")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-recording",
help = "The name of the recording to replay",
required = True)
args = parser.parse_args(args = sys.argv[1:])
replay_recording(args.recording)
Мы можем использовать этот сценарий следующим образом, где
-recording указывает имя записи, которую мы хотим воспроизвести.
Код:
$ python vm_replay.py -recording sample
[ + ] Replaying sample
[ + ] Launching replay /home/davkor/code/panda/build/i386-softmmu/qemu-system-i386 -monitor stdio -show-cursor -m 8192 -replay sample
[ + ] Replay launched
[ + ] Replaying finished
[ + ] Analysis process finished, exiting
Использование существующих соответствующих плагинов PANDA
На данный момент мы создали структуру, которая позволяет нам легко записывать и воспроизводить приложение в PANDA. Тем не менее, нам еще предстоит сделать что-то захватывающее с записью, которая позволит нам перепроектировать и изучить данное приложение, и это наш следующий шаг. Чтобы сохранить этот пост в блоге, мы сосредоточимся на том, как использовать существующие плагины PANDA, а не на написании наших собственных плагинов.
Мониторинг процессов нашей системы
Первый шаг, который мы предпринимаем - это использование двух плагинов для интроспекции виртуальной машины (VMI) PANDA, osi и win7x86intro, для мониторинга процессов, которые выполняются в записанной системе. Самоанализ виртуальной машины - это метод, который позволяет нам интерпретировать состояние гостевой системы исключительно на основе интерпретации гостевого оборудования. Мы должны сделать это, потому что мы делаем весь наш анализ вне системы, которую мы контролируем. Дополнительным преимуществом этого является то, что гостевая система остается относительно прозрачной по сравнению с размещением специфических для анализа артефактов в гостевой системе, таких как драйвер анализа. Недостатком является то, что мы должны выводить абстракции на уровне ОС исключительно из наблюдения за памятью, и мы не можем использовать для этого обычные API, предоставляемые Windows.
Подход, который мы используем, заключается в расширении нашего сценария
vm_replay.py для поддержки запуска плагинов, когда мы воспроизводим выполнение. Причина, по которой мы это делаем, заключается в том, что командные строки PANDA могут быстро стать очень длинными и утомительными для работы, поэтому мы предпочитаем контролировать использование плагинов более программным способом.
Код:
"-panda osi -os windows-32-7 -panda win7x86intro -panda osi_test"
Мы расширяем плагин
vm_replay.py следующим кодом, чтобы управлять им программно
Код:
import os
import sys
import subprocess
import argparse
import time
# Configs
PANDA_BASE = os.path.join(os.path.realpath(__file__), "panda")
PANDA_x86 = os.path.join(PANDA_BASE, "build", "i386-softmmu", "qemu-system-i386")
IMG_PATH = os.path.join(os.path.realpath(__file__), "sandbox_base/IE8_win7_disk1.qcow2")
PANDA_flags = [
"-monitor", "stdio",
"-show-cursor",
"-m", "8192",
]
# The PADNA plugins we would like to use
PANDA_plugins = [
"-panda osi -os windows-32-7 -panda win7x86intro -panda osi_test"
]
def log_info(msg):
print("[+] %s"%(msg))
def log_exit(msg):
print("[-] %s"%(msg))
exit(0)
def replay_recording(snapshot_name):
'''
Replays a recording
'''
log_info("Replaying %s"%(snapshot_name))
# Launch PANDA
cmd = []
cmd.append(PANDA_x86)
cmd.append("-replay")
cmd.append(snapshot_name)
for flag in PANDA_flags:
cmd.append(flag)
for plugin_cmdline in PANDA_plugins:
cmd.append(plugin_cmdline)
# Output files
panda_stdout_path = "replay_panda.stdout"
panda_stderr_path = "replay_panda.stderr"
panda_stdout = open(panda_stdout_path, 'w+')
panda_stderr = open(panda_stderr_path, 'w+')
log_info("Launching replay %s"%(" ".join(cmd)))
try:
p = subprocess.Popen(
" ".join(cmd),
shell=True,
stdout = panda_stdout,
stderr = panda_stderr,
preexec_fn = os.setsid)
except:
log_exit("Could not complete replay")
log_info("Replay launched")
while True:
poll = p.poll()
if poll == None:
time.sleep(1)
else:
log_info("Replaying finished")
break
log_info("Analysis process finished, exiting")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-recording",
help = "The name of the recording to replay",
required = True)
args = parser.parse_args(args = sys.argv[1:])
replay_recording(args.recording)
Мы можем использовать этот скрипт следующим образом:
Код:
$ python vm_replay.py -recording sample
[+] Replaying sample
[+] Launching replay /home/davkor/code/panda/build/i386-softmmu/qemu-system-i386 -replay sample -monitor stdio -show-cursor -m 8192 -panda osi -os windows-32-7 -panda win7x86intro -panda osi_test
[+] Replay launched
[+] Replaying finished
[+] Analysis process finished, exiting
$ cat ./replay_panda.stdout
QEMU 2.9.1 monitor - type 'help' for more information
(qemu) OSI grabbing Windows introspection backend.
loading snapshot
... done.
opening nondet log for read : ./sample-rr-nondet.log
Current process: drvinst.exe PID:1592 PPID:556
Process list (46 procs):
System 4 0
smss.exe 224 4
csrss.exe 296 288
wininit.exe 332 288
csrss.exe 344 324
services.exe 400 332
lsass.exe 416 332
lsm.exe 424 332
winlogon.exe 432 324
svchost.exe 556 400
svchost.exe 632 400
svchost.exe 680 400
svchost.exe 800 400
svchost.exe 844 400
svchost.exe 932 400
userinit.exe 1076 432
explorer.exe 1084 1076
dwm.exe 1140 800
svchost.exe 1196 400
BGINFO.EXE 1284 1084
spoolsv.exe 1376 400
taskhost.exe 1412 400
svchost.exe 1468 400
cmd.exe 1552 1084
conhost.exe 1560 344
vmicsvc.exe 1660 400
vmicsvc.exe 1692 400
vmicsvc.exe 1740 400
vmicsvc.exe 1776 400
vmicsvc.exe 1804 400
svchost.exe 1832 400
cygrunsrv.exe 1976 400
wlms.exe 2028 400
cygrunsrv.exe 880 1976
conhost.exe 1020 296
sshd.exe 1136 880
sppsvc.exe 1052 400
sppsvc.exe 1052 400
drvinst.exe 1280 556
drvinst.exe 756 556
drvinst.exe 1536 556
SearchIndexer. 1512 400
drvinst.exe 1592 556
svchost.exe 1932 400
dllhost.exe 2104 556
rundll32.exe 2112 556
dinotify.exe 2128 1296
-------------------------------------------------
Dynamic libraries list (24 libs):
0x00a50000 266240 DrvInst.exe C:\Windows\system32\DrvInst.exe
0x77800000 1314816 ntdll.dll C:\Windows\SYSTEM32\ntdll.dll
0x75c40000 868352 kernel32.dll C:\Windows\system32\kernel32.dll
0x75bc0000 307200 KERNELBASE.dll C:\Windows\system32\KERNELBASE.dll
0x76180000 704512 msvcrt.dll C:\Windows\system32\msvcrt.dll
0x77460000 1691648 SETUPAPI.dll C:\Windows\system32\SETUPAPI.dll
0x75c10000 159744 CFGMGR32.dll C:\Windows\system32\CFGMGR32.dll
0x75f60000 663552 RPCRT4.dll C:\Windows\system32\RPCRT4.dll
0x75d70000 659456 ADVAPI32.dll C:\Windows\system32\ADVAPI32.dll
0x77950000 102400 sechost.dll C:\Windows\SYSTEM32\sechost.dll
0x777b0000 319488 GDI32.dll C:\Windows\system32\GDI32.dll
0x76640000 823296 USER32.dll C:\Windows\system32\USER32.dll
0x77a20000 40960 LPK.dll C:\Windows\system32\LPK.dll
0x76440000 643072 USP10.dll C:\Windows\system32\USP10.dll
0x77680000 585728 OLEAUT32.dll C:\Windows\system32\OLEAUT32.dll
0x76010000 1425408 ole32.dll C:\Windows\system32\ole32.dll
0x75980000 73728 DEVOBJ.dll C:\Windows\system32\DEVOBJ.dll
0x750f0000 57344 devrtl.DLL C:\Windows\system32\devrtl.DLL
0x77a30000 126976 IMM32.DLL C:\Windows\system32\IMM32.DLL
0x76570000 835584 MSCTF.dll C:\Windows\system32\MSCTF.dll
0x74f70000 86016 SPINF.dll C:\Windows\system32\SPINF.dll
0x75a60000 192512 WINTRUST.dll C:\Windows\system32\WINTRUST.dll
0x75a90000 1183744 CRYPT32.dll C:\Windows\system32\CRYPT32.dll
0x75970000 49152 MSASN1.dll C:\Windows\system32\MSASN1.dll
Kernel module list (130 modules):
0x82851000 4235264 ntoskrnl.exe \SystemRoot\system32\ntoskrnl.exe
0x8281a000 225280 hal.dll \SystemRoot\system32\halmacpi.dll
0x80bb2000 32768 kdcom.dll \SystemRoot\system32\kdcom.dll
0x8b404000 544768 mcupdate.dll \SystemRoot\system32\mcupdate_GenuineIntel.dll
0x8b489000 69632 PSHED.dll \SystemRoot\system32\PSHED.dll
0x8b49a000 32768 BOOTVID.dll \SystemRoot\system32\BOOTVID.dll
0x8b4a2000 270336 CLFS.SYS \SystemRoot\system32\CLFS.SYS
0x8b4e4000 421888 CI.dll \SystemRoot\system32\CI.dll
0x8b54b000 528384 Wdf01000.sys \SystemRoot\system32\drivers\Wdf01000.sys
0x8b5cc000 57344 WDFLDR.SYS \SystemRoot\system32\drivers\WDFLDR.SYS
0x8b5da000 294912 ACPI.sys \SystemRoot\system32\drivers\ACPI.sys
0x8b622000 36864 WMILIB.SYS \SystemRoot\system32\drivers\WMILIB.SYS
0x8b62b000 32768 msisadrv.sys \SystemRoot\system32\drivers\msisadrv.sys
0x8b633000 172032 pci.sys \SystemRoot\system32\drivers\pci.sys
0x8b65d000 45056 vdrvroot.sys \SystemRoot\system32\drivers\vdrvroot.sys
0x8b668000 69632 partmgr.sys \SystemRoot\System32\drivers\partmgr.sys
....
....
....
-------------------------------------------------
Current process: sample.exe PID:2312 PPID:1552
Process list (47 procs):
System 4 0
smss.exe 224 4
csrss.exe 296 288
wininit.exe 332 288
csrss.exe 344 324
services.exe 400 332
lsass.exe 416 332
lsm.exe 424 332
winlogon.exe 432 324
svchost.exe 556 400
svchost.exe 632 400
svchost.exe 680 400
svchost.exe 800 400
svchost.exe 844 400
svchost.exe 932 400
userinit.exe 1076 432
explorer.exe 1084 1076
dwm.exe 1140 800
svchost.exe 1196 400
BGINFO.EXE 1284 1084
spoolsv.exe 1376 400
taskhost.exe 1412 400
svchost.exe 1468 400
cmd.exe 1552 1084
conhost.exe 1560 344
vmicsvc.exe 1660 400
vmicsvc.exe 1692 400
vmicsvc.exe 1740 400
vmicsvc.exe 1776 400
vmicsvc.exe 1804 400
svchost.exe 1832 400
cygrunsrv.exe 1976 400
wlms.exe 2028 400
cygrunsrv.exe 880 1976
conhost.exe 1020 296
sshd.exe 1136 880
sppsvc.exe 1052 400
drvinst.exe 1280 556
drvinst.exe 756 556
drvinst.exe 1536 556
SearchIndexer. 1512 400
drvinst.exe 1592 556
svchost.exe 1932 400
dllhost.exe 2104 556
rundll32.exe 2112 556
dinotify.exe 2128 1296
sample.exe 2312 1552
-------------------------------------------------
No mapped dynamic libraries.
Kernel module list (130 modules):
0x82851000 4235264 ntoskrnl.exe \SystemRoot\system32\ntoskrnl.exe
0x8281a000 225280 hal.dll \SystemRoot\system32\halmacpi.dll
0x80bb2000 32768 kdcom.dll \SystemRoot\system32\kdcom.dll
0x8b404000 544768 mcupdate.dll \SystemRoot\system32\mcupdate_GenuineIntel.dll
0x8b489000 69632 PSHED.dll \SystemRoot\system32\PSHED.dll
0x8b49a000 32768 BOOTVID.dll \SystemRoot\system32\BOOTVID.dll
0x8b4a2000 270336 CLFS.SYS \SystemRoot\system32\CLFS.SYS
0x8b4e4000 421888 CI.dll \SystemRoot\system32\CI.dll
0x8b54b000 528384 Wdf01000.sys \SystemRoot\system32\drivers\Wdf01000.sys
0x8b5cc000 57344 WDFLDR.SYS \SystemRoot\system32\drivers\WDFLDR.SYS
0x8b5da000 294912 ACPI.sys \SystemRoot\system32\drivers\ACPI.sys
0x8b622000 36864 WMILIB.SYS \SystemRoot\system32\drivers\WMILIB.SYS
0x8b62b000 32768 msisadrv.sys \SystemRoot\system32\drivers\msisadrv.sys
0x8b633000 172032 pci.sys \SystemRoot\system32\drivers\pci.sys
...
...
...
Обратите внимание, что вывод в
./replay_panda.stdout становится довольно большим, так как состояние системы печатается каждый раз, когда происходит переключение контекста. В частности, размер моего выходного файла был 236 МБ. Кроме того, мы можем видеть в выводе все процессы, выполняющиеся в системе, библиотеки DLL, загруженные текущим выполняющимся процессом, а также модули ядра. Из вырезанного вывода мы показываем, что PANDA правильно наблюдает за выполнением нашего процесса sample.exe, что подтверждает нам, что наш процесс действительно выполнялся внутри системы.Важно подчеркнуть, что технически здесь произошло. Мы записали выполнение полной ОС Windows, выполнив образец по нашему выбору, и извлекли все процессы в системе, а также информацию о динамически загружаемых модулях. Мы сделали это без развертывания какого-либо кода в ОС, которая выполняла наш образец, а это означает, что вся информация была получена путем интерпретации состояния гостевой системы на основе ее аппаратного обеспечения. Кроме того, мы создали несколько сценариев, которые позволяют нам легко это делать, что будет очень полезно для будущих разработок и работы с PANDA в целом. Все это было достигнуто с помощью небольшого кода в результате большой простоты использования PANDA. Это лишь небольшое количество возможностей PANDA. PANDA действительно превосходно выполняет сложные анализы, а не просто показывает процессы в системе. Тем не менее, мы закончим статью здесь, поскольку она отмечает важный первый шаг к использованию PANDA.
Выводы
В этой статье мы рассмотрели, как настроить среду анализа с помощью PANDA, которая позволяет нам проводить удобный анализ системы, которая запускает данное приложение по нашему выбору. В этом небольшом путешествии мы рассмотрели несколько тем, а именно: (0) вводный обзор PANDA, (1) включение анализа на основе Windows с помощью PANDA, (2) создание подходящей инфраструктуры записи и воспроизведения вокруг PANDA и, наконец, (3) пример того, как использовать существующий плагин PANDA для извлечения артефактов гостевой системы.
Цель заключалась в том, чтобы преодолеть разрыв между интересами PANDA к запуску и запуску системы, которая может автоматически записывать и выполнять произвольное приложение и использовать существующие возможности PANDA в качестве примитивов анализа. Следующие шаги - написать плагины, которые автоматизируют процедуры анализа, и мы оставим это для будущих публикаций в блоге.
Переведено специально для https://xss.pro
Переводчик статьи - https://xss.pro/members/177895/
Оригинал - https://adalogics.com/blog/Building-a-custom-malware-sandbox-with-PANDA-Part-1