
أداة تقارير اختبار الاختراق مكتوبة بلغة Python. حرر نفسك من مايكروسوفت وورد.
WriteHat هي أداة إعداد تقارير تزيل Microsoft Word (وساعات طويلة من المعاناة) من عملية إعداد التقارير. ماركداون --> 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)إضافة اسم المضيف المطلوب إلى allowed_hosts في writehat/config/writehat.conf
(اختياري) في :
فيما يلي شروحات أساسية لبعض مصطلحات WriteHat التي قد لا تكون واضحة.
مهمة
├─ العميل
├─ مجموعة نتائج 1
│ ├─ نتيجة
│ └─ نتيجة
├─ مجموعة نتائج 2
│ ├─ نتيجة
│ └─ نتيجة
├─ تقرير 1
└─ تقرير 2
└─ قالب صفحة
المهمة هي المكان الذي يتم فيه إنشاء المحتوى للعميل. هذا هو مكان العمل - إنشاء التقارير وإدخال النتائج.
التقرير هو ترتيب هرمي معياري من المكونات يمكن تحديثه بسهولة عبر واجهة السحب والإفلات، ثم تحويله إلى HTML أو PDF. يمكن أن تحتوي المهمة على تقارير متعددة. يمكن استخدام قالب الصفحة لتخصيص الخلفية والتذييل. يمكن أيضًا تحويل التقرير إلى قالب تقرير.
مكون التقرير هو قسم أو وحدة من التقرير يمكن سحبها/إفلاتها في مكانها داخل منشئ التقارير. تشمل الأمثلة "صفحة العنوان" و"ماركداون" و"النتائج" إلخ. هناك العديد من المكونات المدمجة، ولكن يمكنك أيضًا إنشاء مكوناتك الخاصة. (هي مجرد HTML/CSS + Python، لذا فهي سهلة جدًا. انظر الدليل أدناه)
يمكن استخدام قالب التقرير كنقطة بداية لـ تقرير (في المهمة). يمكن أيضًا تحويل التقارير إلى قوالب تقارير.
مجموعة النتائج هي مجموعة من النتائج التي يتم تسجيلها بنفس الطريقة (مثل CVSS أو DREAD). يمكنك إنشاء مجموعات نتائج متعددة لكل مهمة (مثل "النتائج الفنية" و"نتائج الخزانة"). عند إدراج النتائج في التقرير (عبر مكون "النتائج" على سبيل المثال)، تحتاج إلى تحديد مجموعة النتائج التي تريد ملء ذلك المكون بها.
يتيح لك قالب الصفحة تخصيص صور الخلفية والتذييلات للتقارير. يمكنك تعيين قالب صفحة واحد كافتراضي، وسيتم تطبيقه بشكل عام ما لم يتم تجاوزه على مستوى المهمة أو التقرير.
يتكون كل مكون تقرير من العناصر التالية:
writehat/components/writehat/templates/componentTemplates/writehat/static/css/component/ (اختياري)نوصي بالرجوع إلى الملفات الموجودة في هذه الدلائل؛ فهي تعمل كنقاط بداية / أمثلة جيدة.
سيبدو المكون المخصص البسيط كما يلي:
components/CustomComponent.py:from .base import *
class CustomComponentForm(ComponentForm):
summary = forms.CharField(label='نص المكون', widget=forms.Textarea, max_length=50000, required=False)
field_order = ['name', 'summary', 'pageBreakBefore', 'showTitle']
class Component(BaseComponent):
default_name = 'مكون تقرير مخصص'
formClass = CustomComponentForm
# السمة "templatable" تحدد ما إذا كان سيتم حفظ ذلك الحقل
# إذا تم تحويل التقرير إلى قالب
fieldList = {
'summary': StringField(markdown=True, templatable=True),
}
# تأكد من تحديد قالب HTML
htmlTemplate = 'componentTemplates/CustomComponent.html'
# نوع أيقونة Font Awesome + اللون (HTML/CSS)
# هذا مجرد زينة في تطبيق الويب
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 أمامه. لاحظ أنه يمكنك أيضًا الوصول إلى المتغيرات على مستوى التقرير والمهمة، مثل report.name و report.findings و engagement.customer.name إلخ.
{% 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 (ولكن بامتداد .css بدلاً من .py). يتم تحميله تلقائيًا عند عرض التقرير.
div.custom-component-summary {
font-weight: bold;
}
بمجرد إنشاء الملفات أعلاه، ما عليك سوى إعادة تشغيل تطبيق الويب وسيتم ملء المكون الجديد تلقائيًا.
$ 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
لاحظ أن هناك بالفعل وظيفة داخل التطبيق لهذا الغرض في صفحة /admin لتطبيق الويب. يمكنك استخدام هذه الطريقة إذا كنت ترغب في إنشاء مهمة نسخ احتياطي على مستوى الملف عبر cron إلخ.
systemctl stop writehat)systemctl stop writehat)mysql و mongo و writehat/migrations في أرشيف TAR وانسخ الأرشيف إلى النظام الوجهة (نفس الموقع):# يجب التشغيل كجذر
$ 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
nginx/writehat.crtwritehat.keyاختبار أن كل شيء يعمل:
$ docker-compose up --build
ملاحظة: إذا كنت تستخدم VPN، فيجب قطع الاتصال بـ VPN في المرة الأولى التي تشغل فيها الخدمات باستخدام docker-compose. وذلك ليتمكن Docker من إنشاء الشبكة الافتراضية بنجاح.
تثبيت وتفعيل خدمة Systemd:
سيؤدي هذا إلى بدء تشغيل WriteHat تلقائيًا عند التمهيد
$ sudo cp writehat/config/writehat.service /etc/systemd/system/
$ sudo systemctl enable writehat --now
متابعة سجلات الخدمة:
$ sudo journalctl -xefu writehat.service
إنشاء المستخدمين
تصفح إلى https://127.0.0.1/admin بعد تسجيل الدخول باستخدام المستخدم المسؤول المحدد في writehat/config/writehat.conf
ملاحظة: هناك بعض الإجراءات التي يمكن للمسؤول فقط تنفيذها (مثل النسخ الاحتياطي لقاعدة البيانات) يتم إنشاء مستخدم مسؤول تلقائيًا من اسم المستخدم وكلمة المرور في writehat/config/writehat.conf، ولكن يمكنك أيضًا ترقية مستخدم LDAP إلى مسؤول:
# أدخل حاوية التطبيق
$ docker-compose exec writehat bash
# ترقية المستخدم والخروج
$ ./manage.py ldap_promote <ldap_username>
$ exit