Сначала несколько слов о понятиях.
Согласно документации:
Пакеты анализа являются основным компонентом Cuckoo Sandbox. Они состоят из структурированных классов Python, которые при выполнении на гостевых машинах описывают как компонент анализатора Cuckoo должен проводить анализ.
Таким образом, пакет анализа отвечает за выполнение необходимых действий для обработки файла.
Примеры (в гостях Windows)
- exe должен быть выполнен
- *.doc необходимо открыть с помощью Microsoft Word.
- DLL должна быть выполнена с
"C:\\WINDOWS\\system32\\rundll32.exe"
- HTML загружается с помощью Internet Explorer.
- PDF-файл пытаются открыть с помощью какой-либо версии Acrobat Reader.
- Так далее ...
Итак, вы пишете пакет анализа, чтобы указать кукушке, как открыть или выполнить файл. Модуль обработки для обработки файла и извлечения информации для отчета (модули отчетности).
Если вы хотите выполнить статический анализ, вам не нужно писать Пакет анализа, но Модуль обработки. Если вы хотите добавить новый поведенческий анализ, вам нужно реализовать оба.
Этот ответ касается написания модулей обработки, поскольку ваш вопрос касается статического анализа.
Реализация модуля обработки кукушки
Я использую документацию последней версии. В документах я нашел много полезных вещей, другие вещи (например, как отобразить отчет модуля в html-интерфейсе) я обнаружил себя в процессе тестирования и ошибки и взлома кода.
Внедрение модуля
Чтобы быть модулем обработки, ваш скрипт должен соответствовать некоторым требованиям. Ниже вы увидите, каковы эти требования и как их объединить, чтобы получить модуль обработки.
После завершения анализа Cuckoo вызовет все модули обработки, доступные в каталоге modules/processing/. Затем каждый модуль будет инициализирован и выполнен, а возвращенные данные будут добавлены в структуру данных, которую мы назовем глобальный контейнер. Этот контейнер — просто большой словарь Python, который содержит все абстрактные результаты, полученные всеми модулями, отсортированные по их определенным ключам.
Результирующие данные вашего модуля обработки будут добавлены в глобальный контейнер, таким образом, другие модули (например, модули отчетов) смогут получить доступ к этой информации.
Базовый модуль обработки (давайте назовем его simple_module) может выглядеть так:
# simple_module.py
from lib.cuckoo.common.abstracts import Processing
class SimpleModule(Processing): # A class inheriting Processing.
def run(self): # A run() function
self.key = "simple_info" # The name that will have the returned data in the global container.
data = "This is the data returned by simple_module."
return data # A set of data (list, dictionary or string etc.) that will be appended to the global container.
# under the key secified in `self.key`.
Куда поставить новый модуль.
Существует несколько категорий модулей, если вы посмотрите на иерархию каталогов cuckoo, вы найдете каталог с именем modules
и внутри некоторых каталогов:
- вспомогательный -- Не требует пояснений
- Machinery -- Модули для работы с оборудованием и виртуализацией.
- processing -- Модули для обработки файлов (тех, которые вы хотите добавить)
- отчетность -- Модули, необходимые для отчета о результатах, полученных обработкой модулей
- подписи -- мне не ясно (у меня может быть другое представление о том, что означает
signature
).
Каталог, о котором вам нужно позаботиться, это: processing. Там вы поместите свой новый модуль.
Включение нового модуля
Добавьте в файл conf/processing.conf
раздел, подобный следующему:
[simple_module]
enabled = yes
Как просмотреть результат?
После того, как необработанные результаты анализа были обработаны и абстрагированы модулями обработки и создается глобальный контейнер (ссылка Модули обработки), он передается Cuckoo всем доступным модулям отчетов, которые в некоторой степени используют его и делают его доступным и пригодным для использования в различных форматах.
Да!! Нам нужен другой модуль, чтобы иметь возможность видеть вывод нового модуля обработки. Самый простой способ — записать результат в файл:
Вы можете посетить документацию модулей отчетов и найти пример такой:
Давайте реализуем отчет для нашего модуля обработки, simple_module:
# simple_report.py
import os
from lib.cuckoo.common.abstracts import Report
from lib.cuckoo.common.exceptions import CuckooReportError
class SimpleReport(Report):
def run(self, results): # IMPORTANT!! Here the parameter result will be the Global Container we saw before
try:
report = open(os.path.join(self.reports_path, "simple_report.txt"), "w")
report.write(results["simple_info"]) # We add our information to the Global Container under the key: simple_info
# now we are querying that info to write it down to a file.
report.close()
except (TypeError, IOError) as e:
raise CuckooReportError("Failed to make a simple report, :(")
Также вам нужно будет включить этот модуль отчетности:
Каждый модуль также должен иметь специальный раздел в файле conf/reporting.conf, например, если вы создаете модуль module/reporting/foobar.py, вам нужно будет добавить следующий раздел в conf/reporting.conf.
[simple_report]
enabled = on
Теперь, когда вы запустите новый анализ, вы сможете найти файл с именем «simple_report.txt» в папке storage/analyses/<analysis-number>/reports
.
Что насчет HTML, я хочу увидеть результат в браузере!!
Ну... это немного сложнее. Если вы посмотрите на файл modules/reporting/reporthtml.py
, вы найдете класс ReportHtml
, который в какой-то момент имеет такой код:
try:
tpl = env.get_template("report.html") # Ahhhh, so cuckoo is using a template for this.
html = tpl.render({"results": results}) # Look, the template receives the Global Container (this dude again!!!, it must be a VIP).
except Exception as e:
raise CuckooReportError("Failed to generate HTML report: %s" % e)
try:
with codecs.open(os.path.join(self.reports_path, "report.html"), "w", encoding="utf-8") as report:
report.write(html)
except (TypeError, IOError) as e:
raise CuckooReportError("Failed to write HTML report: %s" % e)
Шаблоны находятся в web/templates/analysis
, там вы можете найти report.html
. Читая этот файл, вы заметите два важных блока кода:
Код для вкладок:
<ul class="nav nav-tabs">
<li class="active"><a href="#overview" data-toggle="tab">Quick Overview</a></li>
<li><a href="#static" data-toggle="tab">Static Analysis</a></li>
{% if analysis.behavior.processes %}<li><a href="#behavior" data-toggle="tab" id="graph_hook">Behavioral Analysis</a></li>{% endif %}
<li><a href="#network" data-toggle="tab">Network Analysis</a></li>
<li><a href="#dropped" data-toggle="tab">Dropped Files</a></li>
{% if analysis.procmemory %}<li><a href="#procmemory" data-toggle="tab">Process Memory</a></li>{% endif %}
{% if analysis.memory %}<li><a href="#memory" data-toggle="tab">Memory Analysis</a></li>{% endif %}
<li><a href="#admin" data-toggle="tab">Admin</a></li>
</ul>
И код для контента (некоторый код для краткости опущен):
<div class="tab-content">
<div class="tab-pane fade in active" id="overview">
{% include "analysis/overview/index.html" %}
</div>
<div class="tab-pane fade" id="static">
{% include "analysis/static/index.html" %}
</div>
{% if analysis.behavior.processes %}
<div class="tab-pane fade" id="behavior">
{% include "analysis/behavior/index.html" %}
</div>
{% endif %}
...
...
</div>
Хорошо, это очевидно, нам нужно добавить наш шаблон, давайте приступим:
1- Создайте файл, web/templates/analysis/simple_module/index.html
{{analysis.simple_info}}
В приведенной выше строке analysis
указывает на корень словаря Global Results. А простая информация — это ключ, добавляемый в такой словарь нашим модулем процесса, simple_module.
Это заменит {{analysis.simple_info}}
значением, которое мы установили для этого ключа в Global Conatiner. См. также Язык шаблонов Django: для программистов на Python.
2- Обновите web/templates/analysis/report.html
, чтобы включить свои шаблоны
Добавьте строку
<li class="active"><a href="#simple_module" data-toggle="tab">Simple Module</a></li>
в раздел вкладок. И следующие строки в раздел контента:
<div class="tab-pane fade" id="simple_module">
{% include "analysis/simple_module/index.html" %}
</div>
И... Фокус-покус...
Важно отметить, что если вы хотите отобразить результат только в формате html, вам не нужно реализовывать модуль отчета, просто создайте соответствующие шаблоны и используйте соответствующие переменные.
person
Raydel Miranda
schedule
21.07.2015