
بيغل هي أداة للاستجابة للحوادث والتحليل الرقمي الجنائي تقوم بتحويل سجلات الأمان والبيانات إلى رسوم بيانية.
بيغل هو أداة للاستجابة للحوادث والتحقيق الجنائي الرقمي تحول مصادر البيانات والسجلات إلى رسوم بيانية. تشمل مصادر البيانات المدعومة تقارير FireEye HX Triages، وملفات Windows EVTX، وسجلات SysMon، وصور ذاكرة Windows الخام. يمكن إرسال الرسوم البيانية الناتجة إلى قواعد بيانات رسوم بيانية مثل Neo4J أو DGraph، أو الاحتفاظ بها محليًا ككائنات Python NetworkX.
يمكن استخدام بيغل مباشرة كمكتبة بايثون، أو من خلال واجهة ويب مدمجة.
يمكن استخدام المكتبة إما كسلسلة من الاستدعاءات الوظيفية من مصدر بيانات واحد.
>>> from beagle.datasources import SysmonEVTX
>>> graph = SysmonEVTX("malicious.evtx").to_graph()
>>> graph
<networkx.classes.multidigraph.MultiDiGraph at 0x12700ee10>
أو كرسم بياني تم إنشاؤه من مجموعة من القطع الأثرية المتعددة
>>> from beagle.datasources import SysmonEVTX, HXTriage, PCAP
>>> from beagle.backends import NetworkX
>>> nx = NetworkX.from_datasources(
datasources=[
SysmonEVTX("malicious.evtx"),
HXTriage("alert.mans"),
PCAP("traffic.pcap"),
]
)
>>> G = nx.graph()
<networkx.classes.multidigraph.MultiDiGraph at 0x12700ee10>
أو عن طريق استدعاء كل خطوة وسيطة في عملية تحويل مصدر البيانات إلى رسم بياني بشكل صارم.
>>> from beagle.backends import NetworkX
>>> from beagle.datasources import SysmonEVTX
>>> from beagle.transformers import SysmonTransformer
>>> datasource = SysmonEVTX("malicious.evtx")
# تقوم المحولات بأخذ مصدر البيانات، وتحويل كل حدث
# إلى مجموعة من عقدة واحدة أو أكثر.
>>> transformer = SysmonTransformer(datasource=datasource)
>>> nodes = transformer.run()
# مخرجات المحول هي مصفوفة من العقد.
[
(<SysMonProc> process_guid="{0ad3e319-0c16-59c8-0000-0010d47d0000}"),
(<File> host="DESKTOP-2C3IQHO" full_path="C:\Windows\System32\services.exe"),
...
]
# تقوم الواجهات الخلفية بأخذ العقد، وتحويلها إلى رسوم بيانية
>>> backend = NetworkX(nodes=nodes)
>>> G = backend.graph()
<networkx.classes.multidigraph.MultiDiGraph at 0x126b887f0>
تركز الرسوم البيانية حول نشاط العمليات الفردية، وهي مصممة أساسًا لمساعدة المحللين في التحقيق في النشاط على المضيفين، وليس بينهم.
بيغل متاح كملف دوكر:
docker pull yampelo/beagle
mkdir -p data/beagle
docker run -v "$PWD/data/beagle":"/data/beagle" -p 8000:8000 yampelo/beagle
وهي متاحة أيضًا كمكتبة. توثيق واجهة برمجة التطبيقات الكامل متاح على https://beagle-graphs.readthedocs.io
pip install pybeagle
ملاحظة: يتم دعم Python 3.6+ فقط حاليًا.
Rekall لا يتم تثبيته تلقائيًا. لتثبيت Rekall، نفذ الأمر التالي بدلاً من ذلك:
pip install pybeagle[rekall]
يمكن تعديل أي إدخال في ملف الإعدادات باستخدام متغيرات بيئة تتبع التنسيق التالي: BEAGLE__{SECTION}__{KEY}. على سبيل المثال، لتغيير مفتاح API الخاص بـ VirusTotal المستخدم عند استخدام صورة دوكر، يمكنك استخدام معامل -e وتعيين متغير BEAGLE__VIRUSTOTAL__API_KEY:
docker run -v "data/beagle":"/data/beagle" -p 8000:8000 -e "BEAGLE__VIRUSTOTAL__API_KEY=$API_KEY" beagle
يمكن تعريف متغيرات البيئة والدلائل بسهولة باستخدام docker compose
version: "3"
services:
beagle:
image: yampelo/beagle
volumes:
- /data/beagle:/data/beagle
ports:
- "8000:8000"
environment:
- BEAGLE__VIRUSTOTAL__API_KEY=$key$
صورة دوكر الخاصة ببيغل تأتي مع واجهة ويب تغلف عملية تحويل البيانات إلى رسوم بيانية، وكذلك استخدامها للتحقيق في البيانات.
يغلف نموذج التحميل عملية إنشاء الرسم البياني، ويستخدم تلقائيًا NetworkX كواجهة خلفية. بناءً على المعاملات المطلوبة من قبل مصدر البيانات، سيطلب النموذج إما تحميل ملف أو إدخال نصي. على سبيل المثال:
يتم تخزين أي رسم بياني يتم إنشاؤه محليًا في المجلد المحدد تحت مفتاح dir من قسم storage في الإعدادات. يمكن تعديل ذلك بتعيين متغير البيئة BEAGLE__STORAGE__DIR.
اختياريًا، يمكن إضافة تعليق لأي رسم بياني للمساعدة في وصفه بشكل أفضل.
سيقوم كل مصدر بيانات تلقائيًا باستخراج البيانات الوصفية من المعامل المقدم. تكون البيانات الوصفية والتعليق مرئية لاحقًا عند عرض الرسوم البيانية الحالية لمصدر البيانات.
النقر على مصدر بيانات في الشريط الجانبي يعرض جدولًا بجميع الرسوم البيانية المحللة لمصدر البيانات ذلك.
عرض رسم بياني في بيغل يوفر واجهة ويب تسمح للمحللين بالتنقل بسرعة حول حادثة ما.
تنقسم الواجهة إلى جزئين رئيسيين، الجزء الأيسر الذي يحتوي على مناظير مختلفة للرسم البياني (رسم بياني، شجرة، جدول، إلخ)، والجزء الأيمن الذي يسمح لك بتصفية العقد والحواف حسب النوع، والبحث عن العقد، وتوسيع خصائص العقدة. كما يسمح لك بالتراجع والإعادة عن العمليات التي تقوم بها على الرسم البياني.
أي عنصر في الرسم البياني يحتوي على فاصل فوقه قابل للطي:
تعرض العقد في الرسم البياني أول 15 حرفًا من حقل معين. على سبيل المثال، بالنسبة لعقدة عملية، سيكون هذا هو اسم العملية.
تظهر الحواف ببساطة نوع الحافة.
نقرة واحدة على عقدة أو حافة ستركز على تلك العقدة وتعرض معلوماتها في لوحة "معلومات العقدة" في الشريط الجانبي الأيمن.
نقرة مزدوجة على عقدة ستجذب أي عقد مجاورة. العقدة المجاورة هي أي عقدة متصلة بالعقدة التي تم النقر عليها بواسطة حافة. إذا لم يكن هناك جيران لجذبهم، فلن يظهر أي تغيير في الرسم البياني.
نقرة واحدة طويلة على عقدة ستخفيها من الرسم البياني، بالإضافة إلى أي حواف تعتمد عليها.
النقر بزر الماوس الأيمن على عقدة يعرض قائمة سياق تتيح لك تشغيل محولات الرسم البياني. المحولات هي دوال تأخذ حالة الرسم البياني، وتعيد حالة جديدة.
هناك نوعان من المحولات المفيدة للغاية:
تتبع العقدة بالرجوع إلى الخلف مفيد للغاية ويشبه القيام بتحليل السبب الجذري للإصابة في ملفات السجل.
يتيح لك توسيع أحفاد العقدة عرض كل ما حدث بسبب هذه العقدة فورًا. يكشف هذا الإجراء عن الرسم البياني الفرعي المتجذر في العقدة المحددة.
أحيانًا، قد لا تكون عقدة أو حافة ذات صلة بالحادثة الحالية، يمكنك تشغيل وإيقاف أنواع الحواف والعقد. بمجرد تبديل النوع، تتم إزالة العقد أو الحواف من هذا النوع من الرسم البياني المرئي.
إيقاف نوع عقدة يمنع استخدام هذا النوع من العقد عند استخدام المحولات، أو عند سحب الجيران.
أي إجراء في الرسم البياني يمكن عكسه فورًا! باستخدام أزرار التراجع/الإعادة يمكنك التراجع عن أي إجراء تقوم به. زر إعادة التعيين يعيد حالة الرسم البياني إلى وقت تحميله، مما يوفر عليك إعادة التحميل.
عندما تقوم بتغيير الحالة الحالية للرسم البياني باستخدام الإجراءات أعلاه، قد ترغب أيضًا في عرض المجموعة الحالية من العقد والحواف المرئية من منظور مختلف. تسمح لك الألسنة في أعلى شاشة الرسم البياني بتحويل البيانات إلى مجموعة متنوعة من العروض:
كل المناظير تدعم التركيز على العقد عن طريق النقر عليها.
يمكن تنفيذ عملية إنشاء الرسم البياني برمجيًا باستخدام مكتبة بايثون. تتكون عملية إنشاء الرسم البياني من ثلاث خطوات:
DataSource تقوم بتحليل وإنتاج الأحداث واحدًا تلو الآخر.Transformer تأخذ تلك المدخلات وتحولها إلى فئات Node مختلفة مثل Process.Backend تأخذ مصفوفة العقد، وتضعها في هيكل رسم بياني، وترسلها إلى الموقع المطلوب.يمكن تثبيت حزمة بايثون عبر pip:
pip install pybeagle
يتطلب إنشاء رسم بياني ربط هذه العناصر معًا. يمكن القيام بذلك تلقائيًا باستخدام الدالة to_graph().
from beagle.datasources import HXTriage
# افتراضيًا، استخدام دالة to_graph() يستخدم NetworkX والمحول الأول.
G = HXTriage('test.mans').to_graph()
<networkx.classes.multidigraph.MultiDiGraph at 0x12700ee10>
يمكن أيضًا القيام بذلك بشكل صريح في كل خطوة. باستخدام الاستدعاءات الوظيفية، يمكنك أيضًا تحديد الواجهة الخلفية التي ترغب في استخدامها، على سبيل المثال، لإرسال البيانات إلى DGraph
from beagle.datasources import HXTriage
from beagle.backends import DGraph
from beagle.transformers import FireEyeHXTransformer
# سيتم إرسال البيانات إلى مثيل DGraph المكون في ملف الإعدادات
backend = HXTriage('test.mans').to_graph(backend=DGraph)
# يمكن أيضًا تحديد المحول
backend = HXTriage('test.mans').to_transformer(transformer=FireEyeHXTransformer).to_graph(backend=DGraph)
عند استدعاء طريقتي to_graph أو to_transformer، يمكنك تمرير أي وسائط لتلك الفئات:
from beagle.datasources import HXTriage
from beagle.backends import Graphistry
# أرسل إلى Graphistry، وقم بإخفاء هوية البيانات أولاً، وأعد عنوان URL
graphistry_url = HXTriage('test.mans').to_graph(backend=Graphistry, anonymize=True, render=False)
يمكنك أيضًا استدعاء كل خطوة يدويًا في العملية المذكورة أعلاه، والوصول إلى المخرجات الوسيطة
>>> from beagle.backends import NetworkX
>>> from beagle.datasources import HXTriage
>>> from beagle.transformers import FireEyeHXTransformer
>>> datasource = HXTriage("test.mans")
>>> transformer = FireEyeHXTransformer(datasource=datasource)
>>> nodes = transformer.run()
>>> backend = NetworkX(nodes=nodes)
>>> G = backend.graph()
إذا كنت ترغب في استدعاء كل خطوة يدويًا، فستحتاج إلى التأكد من أن مثيل فئة Transformer متوافق مع مخرجات فئة DataSource المقدمة.
يحدد كل مصدر بيانات قائمة المحولات المتوافقة معه، ويمكن الوصول إليها عبر الخاصية .transformers:
>>> from beagle.datasources import HXTriage
>>> HXTriage.transformers
[beagle.transformers.fireeye_hx_transformer.FireEyeHXTransformer]
افتراضيًا، لا يتم تكثيف الحواف، مما يعني أنه إذا كانت عقدة عملية u تكتب إلى عقدة ملف v 5000 مرة، فسيكون لديك 5000 حافة بين تلك العقد. في بعض الأحيان، خاصة عند محاولة تصور البيانات، قد يطغى ذلك على المحلل.
يمكنك تكثيف جميع الحواف البالغ عددها 5000 في حافة واحدة لهذا النوع من الإجراءات (كتب في هذه الحالة)، عن طريق تمرير المعامل consolidate_edges=True إلى فئة الواجهة الخلفية، على سبيل المثال:
SysmonEVTX("data/sysmon/autoruns-sysmon.evtx").to_graph(NetworkX, consolidate_edges=False)
# الرسم البياني يحتوي على 826 عقدة و 2469 حافة.
SysmonEVTX("data/sysmon/autoruns-sysmon.evtx").to_graph(NetworkX, consolidate_edges=True)
# الرسم البياني يحتوي على 826 عقدة و 1396 حافة
بشكل افتراضي، ستقوم الواجهة الويب بتكثيف الحواف.
يتيح لك استخدام الواجهة الخلفية NetworkX حفظ الرسم البياني الناتج ككائن JSON، وحفظه للاستخدام لاحقًا. يمكنك استخدام الطريقة الثابتة NetworkX.from_json لتحميله مرة أخرى.
import json
from beagle.datasources import SysmonEVTX
from beagle.backends import NetworkX
# الحصول على كائن nx.MultiDiGraph
graph = SysmonEVTX("malicious.evtx").to_graph()
# تحويل الكائن إلى JSON
graph_json = NetworkX.graph_to_json(graph)
with open("my_graph.json", "w") as f:
json.dump(graph_json, f)
# لاحقًا:
# G هو نفس كائن nx.MultiDiGraph الذي تم إنشاؤه بواسطة `.to_graph()`
G = NetworkX.from_json("my_graph.json")