
Uno strumento di reporting per pentest scritto in Python. Liberati da Microsoft Word.
WriteHat è uno strumento di reporting che elimina Microsoft Word (e molte ore di sofferenza) dal processo di redazione dei report. Markdown --> HTML --> PDF. Creato da penetration tester, per penetration tester - ma può essere utilizzato per generare qualsiasi tipo di report. Scritto in Django (Python 3).

docker e docker-compose
apt, pacman, dnf, ecc.$ sudo apt install docker.io docker-compose
WriteHat può essere distribuito con un singolo comando:
$ git clone https://github.com/blacklanternsecurity/writehat && cd writehat && docker-compose up
Accedi su https://127.0.0.1 (predefinito: admin / PLEASECHANGETHISFORHEAVENSSAKE)
Installa Docker e Docker Compose
Clona il repository WriteHat in /opt
$ cd /opt
$ git clone https://github.com/blacklanternsecurity/writehat
$ cd writehat
Crea password sicure in writehat/config/writehat.conf per:
docker-compose.yml)docker-compose.yml)writehat/config/writehat.conf e docker-compose.yml: (chown root:root; chmod 600)Aggiungi il nome host desiderato a allowed_hosts in writehat/config/writehat.conf
Ecco le spiegazioni di base per alcuni termini di WriteHat che potrebbero non essere ovvi.
Engagement
├─ Customer
├─ Finding Group 1
│ ├─ Finding
│ └─ Finding
├─ Finding Group 2
│ ├─ Finding
│ └─ Finding
├─ Report 1
└─ Report 2
└─ Page Template
Un Engagement è il luogo in cui viene creato il contenuto per il cliente. Qui avviene il lavoro: creazione di report e inserimento dei risultati.
Un Report è una disposizione modulare e gerarchica di Componenti che può essere facilmente aggiornata tramite un'interfaccia drag-and-drop, per poi essere renderizzata in HTML o PDF. Un engagement può avere più Report. Un Page Template può essere utilizzato per personalizzare lo sfondo e il piè di pagina. Un Report può anche essere convertito in un Report Template.
Un Componente del report è una sezione o un modulo del report che può essere trascinato/rilasciato all'interno del creatore di report. Esempi includono "Pagina del titolo", "Markdown", "Risultati", ecc. Ci sono molti componenti predefiniti, ma puoi crearne di tuoi. (Sono solo HTML/CSS + Python, quindi è abbastanza facile. Vedi la guida qui sotto)
Un Report Template può essere utilizzato come punto di partenza per un Report (in un Engagement). I Report possono anche essere convertiti in Report Template.
Un Finding Group è una raccolta di risultati che vengono valutati allo stesso modo (ad esempio CVSS o DREAD). Puoi creare più gruppi di risultati per engagement (ad esempio "Risultati tecnici" e "Risultati finanziari"). Quando inserisci i risultati nel Report (tramite il Componente "Risultati", ad esempio), devi selezionare quale Finding Group vuoi popolare in quel Componente.
Un Page Template ti permette di personalizzare le immagini di sfondo e i piè di pagina del report. Puoi impostare un Page Template come predefinito e verrà applicato globalmente a meno che non venga sovrascritto a livello di Engagement o Report.
Ogni componente del report è composto da:
writehat/components/writehat/templates/componentTemplates/writehat/static/css/component/ (opzionale)Consigliamo di fare riferimento ai file esistenti in queste directory; funzionano bene come punti di partenza / esempi.
Un semplice componente personalizzato sarebbe simile a questo:
components/CustomComponent.py:from .base import *
class CustomComponentForm(ComponentForm):
summary = forms.CharField(label='Component Text', widget=forms.Textarea, max_length=50000, required=False)
field_order = ['name', 'summary', 'pageBreakBefore', 'showTitle']
class Component(BaseComponent):
default_name = 'Custom Report Component'
formClass = CustomComponentForm
# the "templatable" attribute decides whether or not that field
# gets saved if the report is ever converted into a template
fieldList = {
'summary': StringField(markdown=True, templatable=True),
}
# make sure to specify the HTML template
htmlTemplate = 'componentTemplates/CustomComponent.html'
# Font Awesome icon type + color (HTML/CSS)
# This is just eye candy in the web app
iconType = 'fas fa-stream'
iconColor = 'var(--blue)'
# the "preprocess" function is executed when the report is rendered
# use this to perform any last-minute operations on its data
def preprocess(self, context):
# for example, to uppercase the entire "summary" field:
# context['summary'] = context['summary'].upper()
return context
Nota che i campi devono condividere lo stesso nome sia nella classe del componente che nel suo form. Tutti i componenti devono ereditare da BaseComponent o da un altro componente. Inoltre, ogni componente ha campi predefiniti per name, pageBreakBefore (se iniziare una nuova pagina) e showTitle (se visualizzare il campo name come intestazione). Quindi non è necessario aggiungerli.
componentTemplates/CustomComponent.html:I campi del modulo Python vengono automaticamente aggiunti al contesto del template. In questo esempio, vogliamo renderizzare il campo summary come markdown, quindi aggiungiamo il tag markdown davanti ad esso. Nota che puoi anche accedere a variabili a livello di engagement e report, come report.name, report.findings, engagement.customer.name, ecc.
{% 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 (opzionale):Il nome del file deve corrispondere a quello del file Python (ma con estensione .css invece di .py). Viene caricato automaticamente quando il report viene renderizzato.
div.custom-component-summary {
font-weight: bold;
}
Una volta creati i file sopra, riavvia semplicemente l'app web e il nuovo componente verrà popolato automaticamente.
$ docker-compose restart writehat
Se viene pubblicato un aggiornamento che modifica lo schema del database, le migrazioni del database Django vengono eseguite automaticamente al riavvio del container. Tuttavia, a volte potrebbe essere richiesta l'interazione dell'utente. Per applicare le migrazioni Django manualmente:
systemctl stop writehat)/opt/writehat)$ docker-compose run writehat bash
$ ./manage.py makemigrations
$ ./manage.py migrate
$ exit
$ docker-compose down
$ systemctl start writehat
Nota che esiste già una funzionalità integrata nell'app per questo nella pagina /admin dell'app web. Puoi usare questo metodo se vuoi creare un backup a livello di file tramite cron, ecc.
systemctl stop writehat)systemctl stop writehat)mysql, mongo e writehat/migrations e copia l'archivio sul sistema di destinazione (stessa posizione):# DEVE ESSERE ESEGUITO COME 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
(Opzionale) Sostituisci i certificati SSL autofirmati in nginx/:
writehat.crtwritehat.keyVerifica che tutto funzioni:
$ docker-compose up --build
Nota: Se si utilizza una VPN, è necessario disconnettersi dalla VPN la prima volta che si avviano i servizi con docker-compose. Questo per consentire a docker di creare correttamente la rete virtuale.
Installa e attiva il servizio Systemd:
Questo avvierà WriteHat automaticamente all'avvio
$ sudo cp writehat/config/writehat.service /etc/systemd/system/
$ sudo systemctl enable writehat --now
Monitora i log del servizio:
$ sudo journalctl -xefu writehat.service
Crea utenti
Vai su https://127.0.0.1/admin dopo aver effettuato l'accesso con l'utente amministratore specificato in writehat/config/writehat.conf
Nota: Ci sono alcune azioni che solo un amministratore può eseguire (ad esempio i backup del database). Un utente amministratore viene creato automaticamente dal nome utente e dalla password in writehat/config/writehat.conf, ma puoi anche promuovere un utente LDAP ad amministratore:
# Entra nel container dell'app
$ docker-compose exec writehat bash
# Promuovi l'utente ed esci
$ ./manage.py ldap_promote <ldap_username>
$ exit