
Uma ferramenta de relatório de pentest escrita em Python. Liberte-se do Microsoft Word.
WriteHat é uma ferramenta de relatórios que elimina o Microsoft Word (e muitas horas de sofrimento) do processo de elaboração de relatórios. Markdown --> HTML --> PDF. Criada por testadores de penetração, para testadores de penetração - mas pode ser usada para gerar qualquer tipo de relatório. Escrita em Django (Python 3).

dockerdocker-composeapt, pacman, dnf, etc.$ sudo apt install docker.io docker-compose
WriteHat pode ser implantado com um único comando:
$ git clone https://github.com/blacklanternsecurity/writehat && cd writehat && docker-compose up
Faça login em https://127.0.0.1 (padrão: admin / PLEASECHANGETHISFORHEAVENSSAKE)
Instale o Docker e o Docker Compose
Clone o Repositório WriteHat em /opt
$ cd /opt
$ git clone https://github.com/blacklanternsecurity/writehat
$ cd writehat
Crie Senhas Seguras em writehat/config/writehat.conf para:
docker-compose.yml)docker-compose.yml)writehat/config/writehat.conf e docker-compose.yml: (chown root:root; chmod 600)Adicione o Nome de Host Desejado a allowed_hosts em writehat/config/writehat.conf
(Opcional) Substitua os certificados SSL autoassinados em nginx/:
writehat.crtwritehat.keyTeste se Tudo Está Funcionando:
$ docker-compose up --build
Nota: Se estiver usando uma VPN, você precisa estar desconectado da VPN na primeira vez que iniciar os serviços com docker-compose. Isso é para que o docker possa criar a rede virtual com sucesso.
Instale e Ative o Serviço Systemd:
Isso iniciará o WriteHat automaticamente na inicialização
$ sudo cp writehat/config/writehat.service /etc/systemd/system/
$ sudo systemctl enable writehat --now
Acompanhe os Logs do Serviço:
$ sudo journalctl -xefu writehat.service
Crie Usuários
Navegue até https://127.0.0.1/admin após fazer login com o usuário admin especificado em writehat/config/writehat.conf
Nota: Existem algumas ações que apenas um admin pode realizar (por exemplo, backups do banco de dados). Um usuário admin é criado automaticamente a partir do nome de usuário e senha em writehat/config/writehat.conf, mas você também pode promover um usuário LDAP a admin:
# Entre no contêiner da aplicação
$ docker-compose exec writehat bash
# Promova o usuário e saia
$ ./manage.py ldap_promote <ldap_username>
$ exit
Aqui estão explicações básicas para alguns termos do WriteHat que podem não ser óbvios.
Engagement
├─ Customer
├─ Finding Group 1
│ ├─ Finding
│ └─ Finding
├─ Finding Group 2
│ ├─ Finding
│ └─ Finding
├─ Report 1
└─ Report 2
└─ Page Template
Um Engagement é onde o conteúdo é criado para o cliente. Aqui é onde o trabalho acontece - criar relatórios e inserir descobertas.
Um Relatório é um arranjo modular e hierárquico de Componentes que pode ser facilmente atualizado através de uma interface de arrastar e soltar, depois renderizado em HTML ou PDF. Um engagement pode ter múltiplos Relatórios. Um Page Template pode ser usado para personalizar o fundo e o rodapé. Um Relatório também pode ser convertido em um Modelo de Relatório (Report Template).
Um Componente de relatório é uma seção ou módulo do relatório que pode ser arrastado/soltado no lugar dentro do criador de relatórios. Exemplos incluem "Página de Título", "Markdown", "Descobertas", etc. Existem muitos componentes embutidos, mas você também pode criar os seus próprios. (Eles são apenas HTML/CSS + Python, então é bem fácil. Veja o guia abaixo)
Um Modelo de Relatório pode ser usado como ponto de partida para um Relatório (em um Engagement). Relatórios também podem ser convertidos em Modelos de Relatório (Report Template).
Um Grupo de Descobertas é uma coleção de descobertas que são pontuadas da mesma forma (por exemplo, CVSS ou DREAD). Você pode criar múltiplos grupos de descobertas por engagement (por exemplo, "Descobertas Técnicas" e "Descobertas do Tesouro"). Ao inserir as descobertas no Relatório (via o Componente "Descobertas", por exemplo), você precisa selecionar qual Grupo de Descobertas deseja popular naquele Componente.
Um Modelo de Página permite personalizar imagens de fundo e rodapés dos relatórios. Você pode definir um Page Template como padrão, e ele será aplicado globalmente a menos que seja sobrescrito no nível do Engagement ou Relatório.
Cada componente de relatório é composto pelo seguinte:
writehat/components/writehat/templates/componentTemplates/writehat/static/css/component/ (opcional)Recomendamos consultar os arquivos existentes nesses diretórios; eles funcionam bem como pontos de partida / exemplos.
Um componente personalizado simples seria assim:
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
Observe que os campos devem compartilhar o mesmo nome tanto na classe do componente quanto no seu formulário. Todos os componentes devem herdar de BaseComponent ou de outro componente. Além disso, cada componente possui campos embutidos para name, pageBreakBefore (se deve começar em uma nova página) e showTitle (se deve exibir o campo name como cabeçalho). Portanto, não é necessário adicioná-los.
componentTemplates/CustomComponent.html:Os campos do módulo Python são automaticamente adicionados ao contexto do template. Neste exemplo, queremos renderizar o campo summary como markdown, então adicionamos a tag markdown na frente dele. Observe que você também pode acessar variáveis do nível do engagement e do relatório, como report.name, report.findings, engagement.customer.name, etc.
{% 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 (opcional):O nome do arquivo deve corresponder ao do arquivo Python (mas com extensão .css em vez de .py). Ele é carregado automaticamente quando o relatório é renderizado.
div.custom-component-summary {
font-weight: bold;
}
Assim que os arquivos acima forem criados, basta reiniciar o aplicativo web e o novo componente será populado automaticamente.
$ docker-compose restart writehat
Se uma atualização for enviada que altere o esquema do banco de dados, as migrações do banco de dados Django são executadas automaticamente quando o contêiner é reiniciado. No entanto, a interação do usuário pode ser necessária às vezes. Para aplicar as migrações 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
Observe que já existe funcionalidade no aplicativo para isso na página /admin do aplicativo web. Você pode usar este método se quiser fazer um trabalho de backup em nível de arquivo via cron, etc.
systemctl stop writehat)systemctl stop writehat)mysql, mongo e writehat/migrations em um TAR e copie o arquivo para o sistema de destino (mesma localização):# DEVE SER EXECUTADO COMO 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