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)添加所需主机名 到 writehat/config/writehat.conf 的 allowed_hosts 中。
(可选)替换自签名 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
创建用户
使用 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
以下是一些可能不明显的 WriteHat 术语的基本解释。
Engagement
├─ Customer
├─ Finding Group 1
│ ├─ Finding
│ └─ Finding
├─ Finding Group 2
│ ├─ Finding
│ └─ Finding
├─ Report 1
└─ Report 2
└─ Page Template
项目 (Engagement) 是为客户创建内容的地方。这是实际工作发生的地方——创建报告和录入发现项。
报告 (Report) 是 组件 (Components) 的模块化、分层排列,可通过拖放界面轻松更新,然后渲染为 HTML 或 PDF。一个项目可以有多个 报告 (Reports)。页面模板 (Page Template) 可用于自定义背景和页脚。报告 (Report) 也可以转换为 报告模板 (Report Template)。
报告 组件 (Component) 是报告中的一个部分或模块,可以在报告创建器中拖放到合适位置。例如“标题页”、“Markdown”、“发现项”等。内置组件很多,你也可以自行创建。(它们只是 HTML/CSS + Python,因此相当简单。参见下面的指南)
报告模板 (Report Template) 可用作 报告 (Report)(在 项目 中)的起点。报告 (Reports) 也可以转换为 报告模板 (Report Templates)。
发现项组 (Finding Group) 是一组以相同方式评分(例如 CVSS 或 DREAD)的发现项。你可以为每个项目创建多个发现项组(例如“技术发现项”和“资金发现项”)。当将发现项插入 报告 (Report) 时(例如通过“发现项” 组件),你需要选择用哪个 发现项组 来填充该 组件。
页面模板 (Page Template) 让你自定义报告背景图片和页脚。你可以将一个 页面模板 设置为默认,它将全局应用,除非在 项目 或 报告 级别进行覆盖。
每个报告组件由以下部分组成:
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
# 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
注意:字段在组件类及其表单中的名称必须相同。所有组件必须继承自 BaseComponent 或其他组件。此外,每个组件都有内置字段用于 name、pageBreakBefore 和 showTitle。因此无需添加这些。
componentTemplates/CustomComponent.html:{% 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>
来自 Python 模块的字段会自动添加到模板上下文中。在此示例中,我们希望将 summary 字段渲染为 markdown,因此我们在其前面添加 markdown 标签。注意,你还可以访问项目级和报告级变量,例如 report.name、report.findings、engagement.customer.name 等。
componentTemplates/CustomComponent.css (optional):div.custom-component-summary {
font-weight: bold;
}
文件名必须与 Python 文件匹配(但扩展名为 .css 而非 .py)。报告渲染时会自动加载。
创建上述文件后,只需重启 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