Добавить модуль в песочницу с кукушкой

Для динамического анализа вредоносного ПО я использую автоматический анализ вредоносного ПО — Cuckoo Sandbox. Теперь я хочу добавить новые модули для анализа вредоносных программ. Я изучил документацию по разработке Cuckoo Sandbox. Но в настоящее время я не могу добавить свой собственный скрипт для статического анализа вредоносных программ/образцов. Скрипты Python доступны здесь.

Может ли кто-нибудь подсказать мне, как добавить дополнительные модули/скрипт анализа в модуль обработки песочницы с кукушкой. Если их какая-либо статья доступна в сети, пожалуйста, поделитесь ею.

Спасибо


person Muhammad Abdullah    schedule 07.01.2015    source источник
comment
пожалуйста, НЕ ОБРАЩАЙТЕСЬ только к официальным документам cuckoo, все, кого волнует описанная проблема, скорее всего, уже просмотрели их и не нашли ответа :)   -  person nicks    schedule 14.07.2015
comment
Итак, вам нужно добавить Пакет анализа? Пожалуйста, укажите, какой именно документации не хватает или где вы испытываете трудности.   -  person Serafim Suhenky    schedule 20.07.2015
comment
1) Должен ли я добавить или, скорее, изменить существующий пакет exe? 2) Где будет выполняться скрипт, клиент или хост? Если это будет выполняться на хосте, как я могу получить полный доступ к гостевой системе, чтобы выполнить мою логику? Если это выполняется на госте, где я могу хранить собранную информацию для дальнейшего извлечения в отчет?   -  person nicks    schedule 20.07.2015
comment
Вопросы, в которых нас просят порекомендовать или найти книгу, инструмент, программную библиотеку, учебное пособие или другой сторонний ресурс, не относятся к теме Stack Overflow. Вместо этого опишите проблему и что уже сделано для ее решения. Вопросы, требующие помощи в отладке (почему этот код не работает?) должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для ее воспроизведения в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См.: Как создать минимальный, полный и проверяемый пример.   -  person SherylHohman    schedule 03.09.2018


Ответы (2)


Сначала несколько слов о понятиях.

Согласно документации:

Пакеты анализа являются основным компонентом 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
comment
мне нужно было analysis package, которое вы даже не добавили в свой туториал. извините, но ваш пост совершенно неактуален. - person nicks; 22.07.2015
comment
@NikaGamkrelidze Я так не думаю. Если вы посмотрите на файлы внутри cuckoo. вы найдете внутри папки modules/processing/ файлы с именами: static.py, analysisinfo.py, network.py, memory .py и т. д. Модули обработки — это те модули, которые выполняют анализ. ОП хочет выполнить статический анализ файлов OLE, поэтому учебник правильный. Чтобы проанализировать файл, его необходимо обработать. - person Raydel Miranda; 22.07.2015
comment
Статический анализ - да, но я создал баунти по этому вопросу и указал свою проблему. - person nicks; 23.07.2015
comment
Извините, я понятия не имел, кто создал награду за вопрос, это то, что вы не можете увидеть при первом просмотре. Я добавлю ваши вопросы в мой ответ вкратце. - person Raydel Miranda; 23.07.2015
comment
Я задавался вопросом, как мне расширить функциональность динамического анализа, которая включает в себя редактирование analysis package. - person nicks; 23.07.2015
comment
Потрясающий :). Спасибо за решение проблемы дружище. :) - person Muhammad Abdullah; 03.08.2015

Я написал другой ответ для этого. Чтобы ответить на вопросы Ники (он создал награду за вопрос).

Как мне расширить функциональность динамического анализа, которая включает в себя редактирование пакета анализа?

Чтобы ответить на ваш основной вопрос, я сначала отвечу на вопросы, которые вы разместили в комментариях:

Ника: Должен ли я добавить или, скорее, изменить существующий пакет "exe"?

Вы должны добавить еще один модуль, вы можете указать пакет анализа при отправке.

#analizer.py

...
# If no analysis package was specified at submission, we try to select
# one automatically.
        if not self.config.package:
            log.debug("No analysis package specified, trying to detect "
                      "it automagically.")
...

Ника: Где будет выполняться сценарий, на клиенте или хосте?

Я думаю, что под «клиентом» вы имели в виду «гость».

Скрипты "выполняются" в гостевой системе. Если вы посмотрите на код agent.py, то увидите что-то вроде этого:

from SimpleXMLRPCServer import SimpleXMLRPCServer

а также:

def add_analyzer(self, data):
        """Add analyzer.
        @param data: analyzer data.
        @return: operation status.
        """
        data = data.data

        if not self._initialize():
            return False

        try:
            zip_data = StringIO()
            zip_data.write(data)

            with ZipFile(zip_data, "r") as archive:
                archive.extractall(ANALYZER_FOLDER)
        finally:
            zip_data.close()

        self.analyzer_path = os.path.join(ANALYZER_FOLDER, "analyzer.py")

        return True

Эти два фрагмента кода показывают, что: во-первых, агент использует RCP, а во-вторых, анализатор копирует на целевую виртуальную машину, все вместе предполагает, что скрипты выполняются в гостевой системе.

На самом деле есть функция, которая показывает, как она выполняется:

def execute(self):
        """Execute analysis.
        @return: analyzer PID.
        """
        global ERROR_MESSAGE
        global CURRENT_STATUS

        if not self.analyzer_path or not os.path.exists(self.analyzer_path):
            return False

        try:
            proc = subprocess.Popen([sys.executable, self.analyzer_path],
                                    cwd=os.path.dirname(self.analyzer_path))
            self.analyzer_pid = proc.pid
        except OSError as e:
            ERROR_MESSAGE = str(e)
            return False

Если это выполняется в гостевой системе, где я могу хранить собранную информацию для дальнейшего извлечения в отчет?

См. мой другой ответ, информация всегда собирается модулями обработки и добавляется в глобальный контейнер. Затем оттуда вы можете получить к нему доступ с помощью модуля отчетов.

Ваш пакет анализа должен использовать какой-либо инструмент для получения желаемого результата или информации. Затем в модуле обработки у вас есть член self.dropped_path, вы можете посмотреть файл там, обработать его и добавить информацию в глобальный контейнер.

Я надеюсь, что это поможет вам приблизиться к тому, чего вы хотите достичь.

person Raydel Miranda    schedule 23.07.2015