
Ein Pentest-Berichtstool, geschrieben in Python. Befreien Sie sich von Microsoft Word.
WriteHat ist ein Berichtswerkzeug, das Microsoft Word (und viele Stunden Leid) aus dem Berichterstellungsprozess entfernt. Markdown --> HTML --> PDF. Entwickelt von Penetrationstestern, für Penetrationstester – kann aber zur Erstellung jeder Art von Bericht verwendet werden. Geschrieben in Django (Python 3).

docker und
docker-composeapt, pacman, dnf, usw. installiert werden.$ sudo apt install docker.io docker-compose
WriteHat kann mit einem einzigen Befehl bereitgestellt werden:
$ git clone https://github.com/blacklanternsecurity/writehat && cd writehat && docker-compose up
Melden Sie sich unter https://127.0.0.1 an (Standard: admin / PLEASECHANGETHISFORHEAVENSSAKE)
Installieren Sie Docker und Docker Compose
Klonen Sie das WriteHat-Repository nach /opt
$ cd /opt
$ git clone https://github.com/blacklanternsecurity/writehat
$ cd writehat
Erstellen Sie sichere Passwörter in writehat/config/writehat.conf für:
docker-compose.yml eintragen)docker-compose.yml eintragen)writehat/config/writehat.conf und docker-compose.yml einzuschränken: (chown root:root; chmod 600)Fügen Sie Ihren gewünschten Hostnamen zu allowed_hosts in writehat/config/writehat.conf hinzu
(Optional) Ersetzen Sie die selbstsignierten SSL-Zertifikate in nginx/:
writehat.crtwritehat.keyTesten Sie, ob alles funktioniert:
$ docker-compose up --build
Hinweis: Wenn Sie ein VPN verwenden, müssen Sie beim ersten Start der Dienste mit docker-compose vom VPN getrennt sein. Dies ist notwendig, damit Docker das virtuelle Netzwerk erfolgreich erstellen kann.
Installieren und aktivieren Sie den Systemd-Dienst:
Dadurch wird WriteHat automatisch beim Booten gestartet.
$ sudo cp writehat/config/writehat.service /etc/systemd/system/
$ sudo systemctl enable writehat --now
Verfolgen Sie die Dienstprotokolle:
$ sudo journalctl -xefu writehat.service
Benutzer erstellen
Navigieren Sie nach dem Einloggen mit dem in writehat/config/writehat.conf angegebenen Admin-Benutzer zu https://127.0.0.1/admin.
Hinweis: Es gibt einige Aktionen, die nur ein Administrator ausführen kann (z. B. Datenbanksicherungen). Ein Admin-Benutzer wird automatisch aus dem Benutzernamen und Passwort in writehat/config/writehat.conf erstellt, aber Sie können auch einen LDAP-Benutzer zum Admin befördern:
# In den App-Container einsteigen
$ docker-compose exec writehat bash
# Benutzer befördern und beenden
$ ./manage.py ldap_promote <ldap_username>
$ exit
Hier sind grundlegende Erklärungen für einige WriteHat-Begriffe, die möglicherweise nicht offensichtlich sind.
Engagement
├─ Kunde
├─ Ergebnisgruppe 1
│ ├─ Ergebnis
│ └─ Ergebnis
├─ Ergebnisgruppe 2
│ ├─ Ergebnis
│ └─ Ergebnis
├─ Bericht 1
└─ Bericht 2
└─ Seitenvorlage
Ein Engagement ist der Ort, an dem Inhalte für den Kunden erstellt werden. Hier findet die Arbeit statt – Berichte erstellen und Ergebnisse erfassen.
Ein Bericht ist eine modulare, hierarchische Anordnung von Komponenten, die über eine Drag-and-Drop-Oberfläche einfach aktualisiert und dann in HTML oder PDF gerendert werden kann. Ein Engagement kann mehrere Berichte haben. Eine Seitenvorlage kann verwendet werden, um Hintergrund und Fußzeile anzupassen. Ein Bericht kann auch in eine Berichtsvorlage umgewandelt werden.
Eine Berichts-Komponente ist ein Abschnitt oder Modul des Berichts, der im Berichtsersteller per Drag & Drop an die gewünschte Stelle verschoben werden kann. Beispiele sind „Titelseite“, „Markdown“, „Ergebnisse“ usw. Es gibt viele integrierte Komponenten, aber Sie können auch eigene erstellen. (Es sind nur HTML/CSS + Python, also recht einfach. Siehe die Anleitung unten)
Eine Berichtsvorlage kann als Ausgangspunkt für einen Bericht (in einem Engagement) verwendet werden. Berichte können auch in Berichtsvorlagen umgewandelt werden.
Eine Ergebnisgruppe ist eine Sammlung von Ergebnissen, die auf die gleiche Weise bewertet werden (z. B. CVSS oder DREAD). Sie können mehrere Ergebnisgruppen pro Engagement erstellen (z. B. „Technische Ergebnisse“ und „Finanzergebnisse“). Beim Einfügen der Ergebnisse in den Bericht (z. B. über die Komponente „Ergebnisse“) müssen Sie auswählen, welche Ergebnisgruppe diese Komponente füllen soll.
Eine Seitenvorlage ermöglicht es Ihnen, Berichtshintergrundbilder und Fußzeilen anzupassen. Sie können eine Seitenvorlage als Standard festlegen, die dann global angewendet wird, es sei denn, sie wird auf Engagement- oder Berichtsebene überschrieben.
Jede Berichtskomponente besteht aus folgenden Teilen:
writehat/components/writehat/templates/componentTemplates/writehat/static/css/component/ (optional)Wir empfehlen, die vorhandenen Dateien in diesen Verzeichnissen als Referenz zu verwenden; sie eignen sich gut als Ausgangspunkte/Beispiele.
Eine einfache benutzerdefinierte Komponente würde so aussehen:
components/CustomComponent.py:from .base import *
class CustomComponentForm(ComponentForm):
summary = forms.CharField(label='Komponententext', widget=forms.Textarea, max_length=50000, required=False)
field_order = ['name', 'summary', 'pageBreakBefore', 'showTitle']
class Component(BaseComponent):
default_name = 'Benutzerdefinierte Berichtskomponente'
formClass = CustomComponentForm
# Das Attribut "templatable" entscheidet, ob dieses Feld
# gespeichert wird, wenn der Bericht jemals in eine Vorlage umgewandelt wird.
fieldList = {
'summary': StringField(markdown=True, templatable=True),
}
# Stellen Sie sicher, dass die HTML-Vorlage angegeben wird.
htmlTemplate = 'componentTemplates/CustomComponent.html'
# Font Awesome-Symboltyp + Farbe (HTML/CSS)
# Dies dient nur der Optik in der Web-App.
iconType = 'fas fa-stream'
iconColor = 'var(--blue)'
# Die Funktion "preprocess" wird beim Rendern des Berichts ausgeführt.
# Verwenden Sie diese, um letzte Operationen an den Daten durchzuführen.
def preprocess(self, context):
# Beispiel: Das gesamte "summary"-Feld in Großbuchstaben umwandeln:
# context['summary'] = context['summary'].upper()
return context
Beachten Sie, dass Felder denselben Namen in der Komponentenklasse und im zugehörigen Formular haben müssen. Alle Komponenten müssen entweder von BaseComponent oder einer anderen Komponente erben. Zusätzlich verfügt jede Komponente über integrierte Felder für name, pageBreakBefore (ob auf einer neuen Seite begonnen werden soll) und showTitle (ob das name-Feld als Überschrift angezeigt werden soll). Daher ist es nicht notwendig, diese hinzuzufügen.
componentTemplates/CustomComponent.html:Felder aus dem Python-Modul werden automatisch zum Vorlagenkontext hinzugefügt. In diesem Beispiel möchten wir das summary-Feld als Markdown rendern, daher fügen wir das markdown-Tag davor ein. Beachten Sie, dass Sie auch auf Variablen auf Engagement- und Berichtsebene zugreifen können, wie z.B. report.name, report.findings, engagement.customer.name usw.
{% 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 (optional):Der Dateiname muss mit dem der Python-Datei übereinstimmen (jedoch mit der Erweiterung .css statt .py). Sie wird automatisch geladen, wenn der Bericht gerendert wird.
div.custom-component-summary {
font-weight: bold;
}
Sobald die obigen Dateien erstellt sind, starten Sie einfach die Web-App neu und die neue Komponente wird automatisch angezeigt.
$ docker-compose restart writehat
Wenn ein Update veröffentlicht wird, das das DB-Schema ändert, werden Django-Datenbankmigrationen automatisch beim Neustart des Containers ausgeführt. Manchmal kann jedoch eine Benutzerinteraktion erforderlich sein. So wenden Sie Django-Migrationen manuell an:
systemctl stop writehat)/opt/writehat)$ docker-compose run writehat bash
$ ./manage.py makemigrations
$ ./manage.py migrate
$ exit
$ docker-compose down
$ systemctl start writehat
Beachten Sie, dass es dafür bereits eine App-interne Funktion auf der /admin-Seite der Web-App gibt. Sie können diese Methode verwenden, wenn Sie ein Datei-Backup-Job mittels cron usw. erstellen möchten.
systemctl stop writehat)systemctl stop writehat)mysql, mongo und writehat/migrations in ein TAR-Archiv und kopieren Sie das Archiv auf das Zielsystem (gleicher Speicherort):# MUSS ALS ROOT AUSGEFÜHRT WERDEN
$ sudo tar --same-owner -cvzpf db_backup.tar.gz mongo mysql writehat/migrations
migrations-Verzeichnisses$ mv writehat/migrations writehat/migrations.bak
$ sudo tar --same-owner -xvpzf db_backup.tar.gz
$ systemctl start writehat