Гостевая статья Динамический анализ файлов VirtualBox+Python

Шаг нулевой. Идея.
В один прекрасный момент у меня назрела необходимость в организации тестирования софта. Автоматизации ради и был запилен данный скрипт на Питоне.
Disclaimer. Полностью готового решения для организации своего сервиса, типа dyncheck, в статье не будет. Также просьба учесть, что скрипт находится в ранней стадии разработки и в нём могут быть есть баги.


Шаг первый. Выбираем софт для виртуализации.
Тут вариантов не очень много: VMware Workstation Pro либо Oracle VirtualBox.

Выбор пал на VirtualBox, ибо:
- Бесплатную версию можно использовать в коммерческих целях
- Умеет снапшоты (бесплатный VMWare Workstation Player - нет)
- Во многих линуксах ставится/обновляется через пакетный менеджер
- Значительно удобнее управляется через консоль


Шаг второй. Выбираем способ автоматизации.
Управлять зоопарком будем при помощи Python. Причин для выбора языка было несколько:
1. Он довольно простой :)
2. Хорошая переносимость - скрипт будет работает и на Windows и на Linux.

Управлять VirtualBox’ом можно несколькими способами:
  • VirtualBox SDK (есть биндинги под несколько языков, в том числе и Python)
  • VirtualBox COM Interface
  • VBoxManage (консольная утилита)
Я выбрал последний, опять-же, из-за универсальности - результат можно запускать на чистом Питоне без дополнительных модулей, плюс совместимость со всеми поддерживаемыми ОС.


Шаг третий. Подготовка хоста.
Тип ОС на хосте значения не имеет. Работать будет как на Windows, так и на Linux (подойдёт и консоль без графики).
Потенциально должно работать и на OS X - проверить нет возможности.

  1. Ставим основной софт
    • VirtualBox. Крайне желательно использовать последнюю версию и своевременно её обновлять.
    • Python 3.7 или более новый.
  2. Устанавливаем гостевую(-ые) ОС. Рассказывать как это делать я не буду - туториалов в интернете предостаточно.
    • Я поставил две Windows 10. Одна - x86, вторая - amd64 ( ).
    • Активируем ОС (Опционально).
  3. Настраиваем гостевую ОС
    • Ставим гостевые дополнения VirtualBox Guest Additions. Они обязательны для манипуляций с гостевой ОС.
    • Создаём пользователей.
    • Выключаем обновления.
    • Ставим нескучные обои.
    • Ставим дополнительный софт для анализа (Wireshark, софт Sysinternals, .net framework, Java, MS Office, etc).
  4. Делаем снапшот ОС (можно выключенной).
    • Если планируется запускать несколько задач параллельно, то клонируем/устанавливаем ВМ нужное количество раз.
    • Ставим антивирусы, на которых будем проверять наш зоопарк. Последовательность простая:
      Ставим АВ -> Делаем снапшот (например, 'av1') -> откатываемся на чистый снапшот. Повторяем действие для каждого АВ.
      ВАЖНО. Снапшоты в данном шаге нужно делать в онлайне, иначе при запуске ВМ нужно будет ждать загрузки ОС (что значительно дольше, чем восстановление "живого" снапшота).
В результате получается как-то так:
1603734298364.png



Использование скрипта
Все параметры передаются скрипту через командную строку.
Обязательные параметры:
  • file - путь к файлу для анализа
  • --vms w10_x64 w10_x86 - список ВМ
  • --snapshots av1 av2 av3 - список снапшотов
Пример:
Код:
python demo.py \
    putty.exe \
    --vms w10_x64 w10_x86 \
    --snapshots all

Дополнительные параметры:
  • --vboxmanage vboxmanage - путь к исполныемому файлу vboxmanage.
  • --timeout 60 - таймаут для анализа файла, секунд.
  • --info 1 - показывать/скрывать информацию о файле (sha256 и ссылки на VirusTotal/Google). Значения: 1, 0.
  • --ui gui - запускать ВМ с графикой или без. Значения: 'gui', 'headless'.
  • --login user - логин для гостевой ОС.
  • --password 12345678 - пароль для гостевой ОС.
  • --remote_folder desktop - директория, куда класть файл. Значения: 'desktop', 'downloads', 'documents', 'temp'.
  • --network keep - управление сетью на гостевой ОС. Значения: 'on', 'off', 'keep'.
  • --resolution '1920 1080 32' - зазрешение экрана. Может быть 'random' для выбора случайного разрешения из популярных, либо 'Ширина Высота Битность'.
  • --pre 'C:\start.cmd' - скрипт/программа, которая будет запущена до основного файла.
  • --post 'C:\stop.cmd' - скрипт/программа, которая будет запущена после основного файла (перед завершением анализа).
Пример:
Код:
python demo.py \
    putty.exe \
    --vms w10_x64 w10_x86 \
    --snapshots sn1 sn2 sn3 \
    --vboxmanage vboxmanage \
    --timeout 60 \
    --info 1 \
    --ui gui \
    --login user \
    --password 12345678 \
    --remote_folder desktop \
    --network keep \
    --resolution '1920 1080 32' \
    --pre 'C:\start.cmd' \
    --post 'C:\stop.cmd'

Функции из скрипта можно вызывать напрямую в своих скриптах. Например:
Python:
import vm_functions as vm
vm.vm_start('w10_x64')


Демо
Под Windows с многопоточностью:

Под Linux с антивирусами:


# TODO
  • Из очевидного - привинтить парсинг результатов выполнения файла. Вариантов несколько - OCR ("парсим" скриншоты), разбор логов АВ или журнала ОС (если наш авер туда пишет).
  • Добавить простой веб интерфейс.
  • Оптимизация и багфиксы.

Исходники на гитхаб

 
Последнее редактирование:
  • Нравится
Реакции: alexej и MLNK
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!