
Инструмент для составления отчетов по пентесту, написанный на Python. Освободитесь от Microsoft Word.
WriteHat — это инструмент для составления отчётов, который устраняет Microsoft Word (и многие часы страданий) из процесса создания отчётов. Markdown --> HTML --> PDF. Создан тестировщиками на проникновение для тестировщиков на проникновение, но может использоваться для генерации любых видов отчётов. Написан на Django (Python 3).

docker и docker-compose
apt, pacman, dnf и т.д.$ sudo apt install docker.io docker-compose
WriteHat можно развернуть одной командой:
$ git clone https://github.com/blacklanternsecurity/writehat && cd writehat && docker-compose up
Войдите по адресу https://127.0.0.1 (по умолчанию: admin / PLEASECHANGETHISFORHEAVENSSAKE)
Установите Docker и Docker Compose
Клонируйте репозиторий WriteHat в /opt
$ cd /opt
$ git clone https://github.com/blacklanternsecurity/writehat
$ cd writehat
Создайте безопасные пароли в writehat/config/writehat.conf для:
docker-compose.yml)docker-compose.yml)writehat/config/writehat.conf и docker-compose.yml: (chown root:root; chmod 600)Добавьте желаемое имя хоста в allowed_hosts в writehat/config/writehat.conf
Вот основные пояснения некоторых терминов WriteHat, которые могут быть неочевидны.
Engagement
├─ Customer
├─ Finding Group 1
│ ├─ Finding
│ └─ Finding
├─ Finding Group 2
│ ├─ Finding
│ └─ Finding
├─ Report 1
└─ Report 2
└─ Page Template
Вовлечение — это место, где создаётся контент для заказчика. Здесь происходит основная работа — создание отчётов и ввод находок.
Отчёт — это модульное иерархическое расположение компонентов, которое можно легко обновлять с помощью интерфейса перетаскивания, а затем преобразовывать в HTML или PDF. В рамках одного вовлечения может быть несколько отчётов. Шаблон страницы можно использовать для настройки фона и нижнего колонтитула. Отчёт также можно преобразовать в шаблон отчёта.
Компонент отчёта — это раздел или модуль отчёта, который можно перетаскивать в нужное место в редакторе отчётов. Примеры: «Титульная страница», «Markdown», «Находки» и т.д. Существует множество встроенных компонентов, но вы можете создавать и свои собственные. (Они представляют собой просто HTML/CSS + Python, так что это довольно просто. Смотрите руководство ниже.)
Шаблон отчёта можно использовать в качестве отправной точки для отчёта (в рамках вовлечения). Отчёты также можно преобразовывать в шаблоны отчётов.
Группа находок — это набор находок, которые оцениваются одинаковым способом (например, CVSS или DREAD). Вы можете создать несколько групп находок на одно вовлечение (например, «Технические находки» и «Финансовые находки»). При вставке находок в отчёт (например, через компонент «Находки») необходимо выбрать, какая группа находок будет заполнять этот компонент.
Шаблон страницы позволяет настроить фоновые изображения и нижние колонтитулы отчёта. Вы можете установить один шаблон страницы по умолчанию, и он будет применяться глобально, если не будет переопределён на уровне вовлечения или отчёта.
Каждый компонент отчёта состоит из следующего:
writehat/components/writehat/templates/componentTemplates/writehat/static/css/component/ (опционально)Мы рекомендуем обратиться к существующим файлам в этих каталогах; они хорошо подходят в качестве отправных точек/примеров.
Простой пользовательский компонент будет выглядеть так:
components/CustomComponent.py:from .base import *
class CustomComponentForm(ComponentForm):
summary = forms.CharField(label='Текст компонента', widget=forms.Textarea, max_length=50000, required=False)
field_order = ['name', 'summary', 'pageBreakBefore', 'showTitle']
class Component(BaseComponent):
default_name = 'Пользовательский компонент отчёта'
formClass = CustomComponentForm
# атрибут "templatable" определяет, будет ли это поле
# сохранено, если отчёт когда-либо будет преобразован в шаблон
fieldList = {
'summary': StringField(markdown=True, templatable=True),
}
# обязательно укажите HTML-шаблон
htmlTemplate = 'componentTemplates/CustomComponent.html'
# тип и цвет иконки Font Awesome (HTML/CSS)
# Это просто визуальное оформление в веб-приложении
iconType = 'fas fa-stream'
iconColor = 'var(--blue)'
# функция "preprocess" выполняется при рендеринге отчёта
# используйте её для выполнения любых финальных операций над данными
def preprocess(self, context):
# например, чтобы преобразовать всё поле "summary" в верхний регистр:
# context['summary'] = context['summary'].upper()
return context
Обратите внимание, что поля должны иметь одинаковые имена как в классе компонента, так и в его форме. Все компоненты должны наследовать либо от BaseComponent, либо от другого компонента. Кроме того, каждый компонент имеет встроенные поля name, pageBreakBefore (начинать ли с новой страницы) и showTitle (отображать ли поле name в качестве заголовка). Так что добавлять их не обязательно.
componentTemplates/CustomComponent.html:Поля из модуля Python автоматически добавляются в контекст шаблона. В этом примере мы хотим отрендерить поле summary как Markdown, поэтому добавляем перед ним тег markdown. Обратите внимание, что вы также можете обращаться к переменным на уровне отчёта и вовлечения, например, report.name, report.findings, engagement.customer.name и т.д.
{% load custom_tags %}
<section class="l{{ level }} component{% if pageBreakBefore %} page-break{% endif %}" id="container_{{ id }}">
{% include 'componentTemplates/Heading.html' %}
<div class='markdown-align-justify custom-component-summary'>
<p>
{% markdown summary %}
</p>
</div>
</section>
componentTemplates/CustomComponent.css (опционально):Имя файла должно совпадать с именем файла Python (но с расширением .css вместо .py). Он загружается автоматически при рендеринге отчёта.
div.custom-component-summary {
font-weight: bold;
}
После создания указанных выше файлов просто перезапустите веб-приложение, и новый компонент появится автоматически.
$ docker-compose restart writehat
Если вышло обновление, изменяющее схему базы данных, миграции Django выполняются автоматически при перезапуске контейнера. Однако иногда может потребоваться вмешательство пользователя. Для ручного применения миграций Django:
systemctl stop writehat)/opt/writehat)$ docker-compose run writehat bash
$ ./manage.py makemigrations
$ ./manage.py migrate
$ exit
$ docker-compose down
$ systemctl start writehat
Обратите внимание, что в приложении уже есть функциональность для этого на странице /admin. Вы можете использовать этот метод, если хотите выполнять резервное копирование на уровне файлов через cron и т.д.
systemctl stop writehat)systemctl stop writehat)mysql, mongo и writehat/migrations и скопируйте архив на целевую систему (в то же место):# ДОЛЖНО ВЫПОЛНЯТЬСЯ ОТ ROOT
$ sudo tar --same-owner -cvzpf db_backup.tar.gz mongo mysql writehat/migrations
migrations$ mv writehat/migrations writehat/migrations.bak
$ sudo tar --same-owner -xvpzf db_backup.tar.gz
$ systemctl start writehat
(Опционально) Замените самоподписанные SSL-сертификаты в nginx/:
writehat.crtwritehat.keyПроверьте, что всё работает:
$ docker-compose up --build
Примечание: Если вы используете VPN, при первом запуске служб с помощью docker-compose необходимо отключиться от VPN. Это необходимо для того, чтобы Docker мог успешно создать виртуальную сеть.
Установите и активируйте systemd-сервис:
Это обеспечит автоматический запуск WriteHat при загрузке системы
$ sudo cp writehat/config/writehat.service /etc/systemd/system/
$ sudo systemctl enable writehat --now
Отслеживайте журналы службы:
$ sudo journalctl -xefu writehat.service
Создайте пользователей
Перейдите по адресу https://127.0.0.1/admin после входа с учётной записью admin, указанной в writehat/config/writehat.conf.
Примечание: Некоторые действия может выполнять только администратор (например, резервное копирование базы данных). Учётная запись администратора создаётся автоматически из имени пользователя и пароля в writehat/config/writehat.conf, но вы также можете повысить пользователя LDAP до администратора:
# Войдите в контейнер приложения
$ docker-compose exec writehat bash
# Повысьте пользователя и выйдите
$ ./manage.py ldap_promote <ldap_username>
$ exit