
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 は以下の1コマンドでデプロイできます:
$ 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)希望するホスト名を writehat/config/writehat.conf の allowed_hosts に追加
(任意) 自己署名SSL証明書を nginx/ 内の以下のファイルで置き換え:
以下は、WriteHat の用語のうち、わかりにくいかもしれない基本的な説明です。
Engagement
├─ Customer
├─ Finding Group 1
│ ├─ Finding
│ └─ Finding
├─ Finding Group 2
│ ├─ Finding
│ └─ Finding
├─ Report 1
└─ Report 2
└─ Page Template
Engagement は、顧客向けのコンテンツを作成する場所です。ここで実際の作業(レポートの作成や所見の入力)を行います。
Report は、ドラッグ&ドロップインターフェースで簡単に更新し、HTML または PDF にレンダリングできる、モジュール化された階層的なComponentの集まりです。1つの Engagement に複数のReportを作成できます。Page Templateを使用して背景やフッターをカスタマイズできます。ReportはReport Templateに変換することもできます。
レポートComponentは、レポート作成ツール内でドラッグ&ドロップで配置できるレポートのセクションまたはモジュールです。例: 「タイトルページ」「Markdown」「所見」など。多くの組み込みコンポーネントがありますが、自分で作成することもできます。(HTML/CSS + Python で構成されているため、簡単です。以下のガイドを参照してください。)
Report Template は、Engagement内のReportの開始点として使用できます。ReportをReport Templateに変換することもできます。
Finding Group は、同じ方法(例: CVSS または DREAD)でスコアリングされる所見のコレクションです。Engagement ごとに複数の Finding Group を作成できます(例: 「技術的所見」と「財務的所見」)。所見をReportに挿入するとき(たとえば「所見」Componentを使用)、そのComponentにどのFinding Groupを入力するかを選択する必要があります。
Page Template を使用すると、レポートの背景画像とフッターをカスタマイズできます。デフォルトのPage Templateを1つ設定すると、EngagementまたはReportレベルで上書きされない限り、グローバルに適用されます。
各レポートコンポーネントは、以下の要素で構成されています:
writehat/components/ にある Python ファイルwritehat/templates/componentTemplates/ にある HTML テンプレートwritehat/static/css/component/ にある CSS ファイル(オプション)これらのディレクトリ内の既存ファイルを参考にすることをお勧めします。出発点や例として適しています。
簡単なカスタムコンポーネントは次のようになります:
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
# "templatable" 属性は、レポートがテンプレートに変換されたときにそのフィールドを保存するかどうかを決定します
fieldList = {
'summary': StringField(markdown=True, templatable=True),
}
# HTML テンプレートを必ず指定してください
htmlTemplate = 'componentTemplates/CustomComponent.html'
# Font Awesome アイコンの種類と色 (HTML/CSS)
# これは Web アプリ内で視覚的な飾りとして使用されます
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 などの Engagement および Report レベルの変数にもアクセスできます。
{% 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 ファイルと同じでなければなりません(拡張子は .py ではなく .css)。レポートがレンダリングされるときに自動的に読み込まれます。
div.custom-component-summary {
font-weight: bold;
}
上記のファイルを作成したら、Web アプリを再起動するだけで、新しいコンポーネントが自動的に反映されます。
$ 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
注意: Web アプリの /admin ページにはすでにアプリ内機能があります。cron などを使用してファイルレベルのバックアップジョブを作成したい場合にこの方法を使用できます。
systemctl stop writehat)systemctl stop writehat)mysql、mongo、writehat/migrations ディレクトリを TAR でアーカイブし、移行先システムの同じ場所にコピー:# 必ず 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
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
ユーザーを作成
writehat/config/writehat.conf で指定した管理者ユーザーでログイン後、https://127.0.0.1/admin にアクセス
注意: 管理者のみ実行可能な操作もあります(例: データベースのバックアップ)。writehat/config/writehat.conf のユーザー名とパスワードから管理者ユーザーが自動的に作成されますが、LDAP ユーザーを管理者に昇格させることもできます:
# アプリコンテナに入る
$ docker-compose exec writehat bash
# ユーザーを昇格して終了
$ ./manage.py ldap_promote <ldap_username>
$ exit