
مُحدِّث رسوم بيانية آلي لـ BloodHound للفرق الزرقاء. يُثري مسارات الهجوم في Active Directory ببيانات الجلسات والمجموعات و CVEs في الوقت الفعلي من أنظمة SIEM، مما يتيح المراقبة والتنبيه المستمرين.

اعتبارًا من إصدار BloodHound CE 7.0، تم تبديل قاعدة البيانات الافتراضية إلى Postgres. لا يزال إصدار FalconHound هذا يعتمد على Neo4j كقاعدة بيانات افتراضية.
إذا كنت ترغب في الاستمرار في استخدام FalconHound أثناء تشغيل أحدث إصدار من BloodHound، أضف السطر التالي إلى ملف bloodhound.config.json الخاص بك.```json "graph_driver": "neo4j",
فريق BloodHound سيستمر في دعم Neo4j لمدة عام على الأقل. في هذا الإطار الزمني، نأمل أن يكون هناك إما تحسين كبير لواجهة API أو أننا قمنا بتطبيق دعم PGSQL في FalconHound.
---
FalconHound هو أداة متعددة الاستخدامات لفريق الدفاع. يتيح لك استخدام وتعزيز قدرات BloodHound بطريقة أكثر تلقائية. صُمم لاستخدامه مع نظام SIEM أو أداة أخرى لتجميع السجلات.
أحد الجوانب الصعبة في BloodHound هو أنه يمثل لقطة زمنية. يتضمن FalconHound وظائف يمكن استخدامها للحفاظ على رسم بياني لبيئتك محدثة باستمرار. يتيح لك ذلك رؤية بيئتك كما هي الآن. وهذا مفيد بشكل خاص للبيئات التي تتغير باستمرار.
من أصعب العلاقات التي يجب جمعها لـ BloodHound هي عضويات المجموعات المحلية ومعلومات الجلسات. كفريق دفاعي، لدينا هذه المعلومات متاحة بسهولة في سجلاتنا. يمكن استخدام FalconHound لجمع هذه المعلومات وإضافتها إلى الرسم البياني، مما يسمح باستخدامها بواسطة BloodHound.
هذا مجرد مثال على كيفية استخدام FalconHound. يمكن استخدامه لجمع أي معلومات لديك في سجلاتك أو أدواتك الأمنية وإضافتها إلى رسم بياني BloodHound.
بالإضافة إلى ذلك، يمكن استخدام الرسم البياني لتشغيل التنبيهات أو إنشاء قوائم إثراء.
على سبيل المثال، إذا تم إضافة مستخدم إلى مجموعة معينة، يمكن استخدام FalconHound للاستعلام عن قاعدة بيانات الرسم البياني للعثور على أقصر مسار إلى مجموعة حساسة أو ذات امتيازات عالية. إذا كان هناك مسار، يمكن تسجيل ذلك في نظام SIEM أو استخدامه لتشغيل تنبيه.
أمثلة أخرى حيث يمكن استخدام FalconHound:
- إضافة أو إزالة أو إنهاء مهلة الجلسات في الرسم البياني، بناءً على أحداث تسجيل الدخول والخروج.
- وضع علامة على المستخدمين وأجهزة الكمبيوتر كمخترقين في الرسم البياني عند وجود حادث في Sentinel أو MDE.
- إضافة معلومات CVE وما إذا كان هناك استغلال عام متاح إلى الرسم البياني.
- جميع أنواع أنشطة Azure.
- إعادة حساب أقصر مسار إلى المجموعات الحساسة عند إضافة مستخدم إلى مجموعة أو الحصول على دور جديد.
- إضافة مستخدمين ومجموعات وأجهزة كمبيوتر جديدة إلى الرسم البياني.
- إنشاء قوائم إثراء لـ Sentinel و Splunder، على سبيل المثال، المستخدمين القابلين لـ Kerberoast أو المستخدمين الذين يمتلكون كيانات معينة.
الإمكانيات لا حصر لها هنا. يرجى إضافة المزيد من الأفكار إلى متتبع المشكلات أو تقديم طلب سحب.
مدونة تشرح بالتفصيل سبب تطويرنا لها وبعض الأمثلة على حالات الاستخدام يمكن العثور عليها [هنا](https://medium.com/falconforce/falconhound-attack-path-management-for-blue-teams-42adedc9cae5?source=friends_link&sk=9f64b6b3028c5a2a6087d63b4fd2c82f)
فهرس:
- [مصادر البيانات والأهداف المدعومة](#supported-data-sources-and-targets)
- [التثبيت](#installation)
- [الاستخدام](#usage)
- [الإجراءات](#actions)
- [إضافات إلى الرسم البياني](#extensions-to-the-graph)
- [إدارة بيانات الاعتماد](#credential-management)
- [النشر](#deployment)
- [الترخيص](#license)
## مصادر البيانات والأهداف المدعومة
تم تصميم FalconHound لاستخدامه مع BloodHound. إنه ليس بديلاً عن BloodHound. تم تصميمه للاستفادة من قوة BloodHound وجميع منصات البيانات الأخرى التي يدعمها بطريقة تلقائية.
حاليًا، يدعم FalconHound مصادر البيانات و/أو الأهداف التالية:
- Azure Sentinel
- Azure Sentinel Watchlists
- Splunk
- Microsoft Defender for Endpoint
- Neo4j
- MS Graph API (مرحلة مبكرة)
- ملفات CSV
- Azure Data Explorer (ADX) - تجريبي
- LogScale
- BloodHound CE و BHE (مرحلة مبكرة)
- ملفات MarkDown
- Elastic (مرحلة مبكرة)
مصادر وأهداف بيانات إضافية مخطط لها في المستقبل.
في هذه اللحظة، يدعم FalconHound فقط قاعدة بيانات Neo4j لـ BloodHound. دعم API لـ BH CE و BHE قيد التطوير النشط.
---
## التثبيت
نظرًا لأن FalconHound مكتوب بلغة Go، فلا حاجة للتثبيت. فقط قم بتنزيل الملف الثنائي من قسم الإصدارات وقم بتشغيله.
تتوفر ملفات ثنائية مترجمة لأنظمة Windows و Linux و MacOS. يمكنك العثور عليها في قسم [الإصدارات](https://github.com/FalconForceTeam/FalconHound/releases).
قبل أن تتمكن من تشغيله، تحتاج إلى إنشاء ملف تكوين. يمكنك العثور على ملف تكوين مثال في المجلد الجذر. تعليمات حول كيفية إنشاء جميع بيانات الاعتماد يمكن العثور عليها [هنا](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md).
الطريقة الموصى بها لتشغيل FalconHound هي تشغيله كمهمة مجدولة أو وظيفة cron. سيسمح لك ذلك بتشغيله بانتظام والحفاظ على الرسم البياني والتنبيهات والإثراءات محدثة.
### المتطلبات
- BloodHound، أو على الأقل قاعدة بيانات Neo4j في الوقت الحالي.
- نظام SIEM أو أداة أخرى لتجميع السجلات. حاليًا، يتم دعم Azure Sentinel و Splunk.
- بيانات اعتماد لكل نقطة نهاية تريد التحدث معها، مع [الأذونات المطلوبة](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md).
### التكوين
يتم تكوين FalconHound باستخدام ملف YAML. يمكنك العثور على ملف تكوين مثال في المجلد الجذر.
كل قسم من ملف التكوين موضح أدناه.
---
## الاستخدام
#### التشغيل الافتراضي
لتشغيل FalconHound، فقط قم بتشغيل الملف الثنائي وأضف المعامل `-go` لتشغيل جميع الاستعلامات في مجلد الإجراءات.```bash
./falconhound -go
لسرد جميع الإجراءات المفعلة، استخدم المعامل -actionlist. سيقوم هذا بإدراج جميع الإجراءات المفعلة في ملفات التهيئة في مجلد الإجراءات. يجب استخدام هذا مع المعامل -go.```bash
./falconhound -actionlist -go
### التشغيل باستخدام مجموعة محددة من الإجراءات
لتشغيل مجموعة محددة من الإجراءات، استخدم المعامل `-ids` متبوعًا بمعرّف إجراء واحد أو قائمة من معرّفات الإجراءات مفصولة بفواصل. سيؤدي هذا إلى تشغيل الإجراءات المحددة في المعامل، وهو ما قد يكون مفيدًا جدًا عند الاختبار أو استكشاف الأخطاء أو عندما تحتاج إلى تحديثات محددة وأكثر تواترًا. يجب استخدام هذا مع المعامل `-go`.```bash
./falconhound -ids action1,action2,action3 -go
بشكل افتراضي، سيبحث FalconHound عن ملف إعدادات في الدليل الحالي. يمكنك أيضًا تحديد ملف إعدادات باستخدام العلامة -config. يتيح لك ذلك تشغيل مثيلات متعددة من FalconHound بإعدادات مختلفة، ضد بيئات مختلفة.```bash
./falconhound -go -config /path/to/config.yml
#### التشغيل باستخدام مجلد إجراءات مختلف
بشكل افتراضي، سيبحث FalconHound عن مجلد الإجراءات في الدليل الحالي. يمكنك أيضًا تحديد مجلد مختلف باستخدام العلم `-actions-dir`. وهذا يسهل عملية الاختبار واستكشاف الأخطاء وإصلاحها، ولكنه يسمح لك أيضًا بتشغيل مثيلات متعددة من FalconHound بإعدادات مختلفة، ضد بيئات مختلفة، أو في فترات زمنية مختلفة.```bash
./falconhound -go -actions-dir /path/to/actions
بشكل افتراضي، سيستخدم FalconHound بيانات الاعتماد الموجودة في config.yml (أو ملف مخصص تم تحميله). عن طريق تعيين العلم -keyvault، سيحصل FalconHound على keyvault من الإعدادات ويسترد جميع الأسرار منه. إذا كانت هناك عناصر مفقودة في keyvault، فسيتم الرجوع إلى ملف الإعدادات. إذا كنت ترغب في الحصول على الأسرار من azure keyvault باستخدام هوية مُدارة، فقم بتعريف متغير authtype على أنه msi.```bash
./falconhound -go -keyvault
---
## الإجراءات
الإجراءات هي جوهر FalconHound. وهي الاستعلامات التي سيقوم FalconHound بتشغيلها. وهي مكتوبة باللغة الأصلية للمصدر والهدف، ويتم تخزينها في مجلد الإجراءات. كل إجراء هو ملف منفصل ويتم تخزينه في دليل مصدر المعلومات، هدف الاستعلام. يُستخدم اسم الملف كاسم الإجراء.
### هيكل مجلد الإجراءات
ينقسم مجلد الإجراءات إلى مجلدات فرعية حسب مصدر الاستعلام. ستتم معالجة جميع المجلدات بشكل متكرر، وسيتم تنفيذ جميع ملفات YAML بترتيب أبجدي.
يجب معالجة إجراءات Neo4j **في النهاية**، لأن مخرجاتها تعتمد على مصادر بيانات أخرى لتحديث قاعدة بيانات الرسم البياني أولاً، للحصول على أحدث النتائج.
### ملفات الإجراءات
جميع الملفات هي ملفات YAML. يحتوي ملف YAML على الاستعلام وبعض البيانات الوصفية والهدف (الأهداف) من المعلومات التي تم الاستعلام عنها.
يوجد ملف قالب متاح في المجلد الجذر. يمكنك استخدامه لإنشاء إجراءاتك الخاصة. ألقِ نظرة على الإجراءات في مجلد الإجراءات لمزيد من الأمثلة.
بينما ستكون معظم العناصر واضحة بذاتها، هناك بعض الأمور الهامة التي يجب ملاحظتها حول الإجراءات:
#### مفعّل
كما يوحي الاسم، يُستخدم هذا لتفعيل أو تعطيل إجراء. إذا تم ضبط هذا على false، فلن يتم تشغيل الإجراء.```yaml
Enabled: true
يُستخدم هذا لتمكين أو تعطيل وضع التصحيح لإجراء ما. إذا تم ضبط هذا على true، فسيتم تشغيل الإجراء في وضع التصحيح. سيؤدي ذلك إلى إخراج نتائج الاستعلام إلى وحدة التحكم. هذا مفيد للاختبار واستكشاف الأخطاء وإصلاحها، ولكن لا يُنصح باستخدامه في الإنتاج. سيؤدي ذلك إلى إبطاء معالجة الإجراء اعتمادًا على عدد النتائج.```yaml Debug: false
#### الاستعلام
حقل `Query` هو الاستعلام الذي سيتم تشغيله على المصدر. يمكن أن يكون استعلام KQL أو استعلام SPL أو استعلام Cypher اعتمادًا على `SourcePlatform` الخاص بك.
هام: حاول الاحتفاظ بالاستعلام دقيقًا قدر الإمكان وإرجاع الحقول التي تحتاجها فقط. سيجعل ذلك معالجة النتائج أسرع وأكثر كفاءة.
بالإضافة إلى ذلك، عند تشغيل استعلامات Cypher، تأكد من إرجاع كائن JSON كنتيجة، وإلا ستفشل المعالجة.
على سبيل المثال، سيعيد هذا الاسم والعدد والدور وأصحاب اشتراكات Azure:```cypher
MATCH p = (n)-[r:AZOwns|AZUserAccessAdministrator]->(g:AZSubscription)
RETURN {Name:g.name , Count:COUNT(g.name), Role:type(r), Owners:COLLECT(n.name)}
كل هدف لديه عدة خيارات يمكن تكوينها. اعتمادًا على الهدف، قد يتطلب بعضها تكوينًا أكثر من غيره.
جميع الأهداف تحتوي على حقلي Name و Enabled. يُستخدم حقل Name لتحديد الهدف. يُستخدم حقل Enabled لتمكين أو تعطيل الهدف. إذا تم ضبط هذا على false، فسيتم تجاهل الهدف.
يدعم CSV المتغير {{date}}، والذي سيتم استبداله بالتاريخ الحالي بتنسيق YYYY-MM-DD. يمكن استخدام هذا لإنشاء تقارير يومية.
يمكن استخدام هذا في اسم مجلد أو ملف (مثل path/to/filename-{{date}}.csv) أو في اسم المجلد نفسه.```yaml
#### Markdown
يدعم Markdown المتغير {{date}}، والذي سيتم استبداله بالتاريخ الحالي بتنسيق `YYYY-MM-DD`. يمكن استخدام هذا لإنشاء تقارير يومية.
يمكن استخدام هذا في اسم مجلد أو ملف (مثل `path/to/filename-{{date}}.md`) أو في اسم المجلد نفسه.```yaml
- Name: Markdown
Enabled: true
Path: path/to/filename.md
مثال للإخراج:```markdown
Description: Get a list of Domain Admins. Date: 2024-02-19
| Name | ObjectID |
|---|---|
| [email protected] | S-1-5-21-1122334455-112233445-1112223334-11223344 |
#### Neo4j
هدف Neo4j سيكتب نتائج الاستعلام إلى قاعدة بيانات Neo4j. هذا الإخراج سطرًا بسطر، وبالتالي يتطلب بعض التكوين الإضافي.
نظرًا لأنه يمكننا نقل جميع أنواع البيانات في جميع الاتجاهات، يحتاج FalconHound إلى فهم ما يجب فعله بالبيانات. يتم ذلك باستخدام متغيرات الاستبدال في السطر الأول من استعلامات Cypher الخاصة بك. يتم تمريرها إلى Neo4j كمعاملات ويمكن استخدامها في الاستعلام.
يتم تكوين حقول `ReplacementFields` أدناه.```yaml
- Name: Neo4j
Enabled: true
Query: |
MATCH (x:Computer {name:$Computer}) MATCH (y:User {objectid:$TargetUserSid}) MERGE (x)-[r:HasSession]->(y) SET r.since=$Timestamp SET r.source='falconhound'
Parameters:
Computer: Computer
TargetUserSid: TargetUserSid
Timestamp: Timestamp
يحدد قسم المعلمات مجموعة من المعلمات التي سيتم استبدالها بالقيم من نتائج الاستعلام. يمكن الرجوع إلى هذه المعلمات كمعلمات Neo4j باستخدام الصيغة $parameter_name.
الهدف Sentinel سيكتب نتائج الاستعلام إلى جدول Sentinel. سيتم إنشاء الجدول إذا لم يكن موجودًا. سيتم إنشاء الجدول في مساحة العمل المحددة في ملف التهيئة. ستتم إضافة البيانات من الاستعلام إلى حقل EventData. سيكون EventID هو معرف الإجراء وسيكون الوصف هو اسم الإجراء.
لهذا السبب أيضًا يجب التحكم في مخرجات الاستعلام، وإلا قد تغمر هدفك.```yaml
#### Sentinel Watchlists
سيقوم target Sentinel Watchlists بكتابة نتائج الاستعلام إلى watchlist الخاصة بـ Sentinel. سيتم إنشاء watchlist إذا لم تكن موجودة. سيتم إنشاء watchlist في workspace المحددة في config file. ستتم إضافة جميع الأعمدة التي تم إرجاعها بواسطة الاستعلام إلى watchlist.```yaml
- Name: Watchlist
Enabled: true
WatchlistName: FH_MDE_Exploitable_Machines
DisplayName: MDE Exploitable Machines
SearchKey: DeviceName
Overwrite: true
حقل WatchlistName هو اسم قائمة المراقبة. حقل DisplayName هو الاسم المعروض لقائمة المراقبة.
حقل SearchKey هو العمود الذي سيُستخدم كمفتاح بحث.
حقل Overwrite يُستخدم لتحديد ما إذا كان يجب استبدال قائمة المراقبة أو الإضافة إليها. إذا تم ضبط هذا على false، فسيتم إلحاق نتائج الاستعلام بقائمة المراقبة. إذا تم ضبطه على true، فسيتم حذف قائمة المراقبة وإعادة إنشائها بنتائج الاستعلام.
مثل Sentinel، يقوم Splunk بكتابة نتائج الاستعلام إلى فهرس Splunk. يجب إنشاء الفهرس وربطه بنقطة نهاية HEC. ستتم إضافة البيانات من الاستعلام إلى حقل EventData. سيكون EventID هو معرف الإجراء وسيكون Description هو اسم الإجراء.```yaml
#### Azure Data Explorer
مثل Sentinel، سيقوم Splunk بكتابة نتائج الاستعلام إلى جدول ADX. ستتم إضافة البيانات من الاستعلام إلى حقل EventData. سيكون EventID هو معرف الإجراء وسيكون Description هو اسم الإجراء.```yaml
- Name: ADX
Enabled: true
Table: "name"
لإنشاء جدول في ADX يمكنك استخدام الأمر التالي:```kql .create table FalconHound (Name: string, Description: string, EventID: string, BHQuery: string, EventData: dynamic, Timestamp: datetime)
### امتدادات الرسم البياني
#### العلاقة: HadSession
بمجرد انتهاء الجلسة، كان لا بد من إزالتها من الرسم البياني، لكن هذا بدا وكأنه إهدار للمعلومات. لذا بدلاً من إزالة الجلسة، ستتم إضافتها كعلاقة بين الكمبيوتر والمستخدم. ستسمى العلاقة `HadSession`. ستكون للعلاقة الخصائص التالية:```json
{
"till": "2021-08-31T14:00:00Z",
"source": "falconhound",
"reason": "logoff",
}
هذا يسمح باكتشاف مسارات إضافية حيث يمكننا التحقق مما إذا كان المستخدم قد سجل الدخول إلى نظام معين، حتى لو انتهت الجلسة.
سيضيف FalconHound الخصائص التالية إلى العُقد في الرسم البياني:
Computer: - 'exploitable': true/false - 'exploits': list of CVEs - 'exposed': true/false - 'ports': list of ports accessible from the internet - 'alertids': list of alert ids
الطرق المدعومة حاليًا لتوفير بيانات الاعتماد لـ FalconHound هي:
يحتفظ ملف التكوين بجميع التفاصيل المطلوبة لكل منصة. جميع العناصر في ملف التكوين حساسة لحالة الأحرف. أفضل الممارسات هي فصل التطبيقات على مستوى الخدمة، ولكن يمكنك استخدام 1 AppID/AppSecret لجميع الإجراءات المستندة إلى Azure.
الأذونات المطلوبة لـ AppID/AppSecret مدرجة هنا.
طريقة أكثر أمانًا لتخزين بيانات الاعتماد هي استخدام Azure KeyVault. كن على دراية بوجود جانب تكلفة بسيط لاستخدام Keyvaults. يدعم الوصول إلى KeyVaults حاليًا المصادقة المستندة إلى هوية النظام المُدارة (Managed System Identity) أو AppID/AppSecret والتي يجب تكوينها في ملف config.yml.
الطريقة الموصى بها لإعداد ذلك هي تعيين هوية نظام مُدارة للجهاز الافتراضي الذي يعمل عليه FalconHound وتعيينها دور Key Vault Secrets User إلى Keyvault هذا. سيسمح هذا لـ FalconHound بالمصادقة إلى Keyvault دون الحاجة إلى أي تكوين إضافي.
بدلاً من ذلك، يمكنك استخدام ServicePrincipal الذي لديه فقط دور Key Vault Secrets User إلى Keyvault هذا. هذا الدور يسمح فقط بالوصول إلى الأسرار، وليس حتى إدراجها. لا تقم أبدًا بإعادة استخدام ServicePrincipal الذي لديه حق الوصول إلى Sentinel و/أو MDE، لأن هذا يلغي تقريبًا تمامًا فائدة استخدام Keyvault.
العناصر التي يجب تكوينها في Keyvault مدرجة أدناه. يُرجى ملاحظة أن أسرار Keyvault ليست حساسة لحالة الأحرف.``` SentinelAppSecret SentinelAppID SentinelTenantID SentinelTargetTable SentinelResourceGroup SentinelSharedKey SentinelSubscriptionID SentinelWorkspaceID SentinelWorkspaceName MDETenantID MDEAppID MDEAppSecret Neo4jUri Neo4jUsername Neo4jPassword GraphTenantID GraphAppID GraphAppSecret AdxTenantID AdxAppID AdxAppSecret AdxClusterURL AdxDatabase SplunkUrl SplunkApiToken SplunkIndex SplunkApiPort SplunkHecToken SplunkHecPort BHUrl BHTokenID BHTokenKey LogScaleUrl LogScaleToken LogScaleRepository LimaCharlieAPIUrl LimaCharlieOrgId LimaCharlieIngestKey ElasticCloudID ElasticApiKey
بمجرد التهيئة، يمكنك إضافة المعامل `-keyvault` أثناء بدء تشغيل FalconHound.
#### الوضع المختلط / الاحتياطي
عند تعيين المعامل `-keyvault` في سطر الأوامر، سيكون هذا المصدر الأساسي لجميع الأسرار المطلوبة. إذا فشل FalconHound في استرداد العناصر، فسوف يتراجع إلى العنصر المكافئ في `config.yml`. إذا فشل كلاهما وكانت هناك إجراءات مفعلة لذلك المصدر أو الهدف، فسيتم إلقاء تحذير وتخطي الإجراء(ات).
## النشر
تم تصميم FalconHound ليتم تشغيله كمهمة مجدولة أو وظيفة cron. سيسمح لك ذلك بتشغيله بشكل دوري والحفاظ على تحديث الرسم البياني والتنبيهات والإثراءات. اعتمادًا على عدد الإجراءات التي قمت بتمكينها، وكمية البيانات التي تعالجها، وكمية البيانات التي تكتبها إلى الرسم البياني، قد يستغرق ذلك بعض الوقت.
تم تصميم جميع الاستعلامات المستندة إلى السجل لتعمل كل 15 دقيقة. إذا استغرقت المعالجة وقتًا طويلاً، فقد تحتاج إلى تعديل ذلك قليلاً. إذا كان الأمر كذلك، فقد يُوصى بتعطيل بعض الإجراءات.
قد يكون هناك أيضًا بعض التداخل مع على سبيل المثال إجراءات الجلسات. إذا كان لديك الكثير من الجلسات، فقد ترغب في تعطيل إجراءات الجلسات لـ Sentinel والاعتماد على الجلسات من MDE. هذا يفترض أنك قمت بتوصيل MDE و Sentinel وأن معظم الأجهزة قد تم إعدادها في MDE.
### Sharphound / Azurehound
بينما تم تصميم FalconHound لاستخدامه مع BloodHound، فإنه ليس بديلاً عن Sharphound و Azurehound. تم تصميمه ليكمل عملية الجمع وإزالة مشكلة اللحظة الزمنية للتجميع الدوري. لا يزال كل من Sharphound و Azurehound مطلوبين لجمع البيانات، نظرًا لعدم توفر جميع البيانات المماثلة في السجلات.
يُوصى بتشغيل Sharphound و Azurehound بشكل دوري، على سبيل المثال مرة واحدة يوميًا/أسبوعيًا أو شهريًا، و FalconHound كل 15 دقيقة.
## الترخيص
هذا المشروع مرخص بموجب رخصة BSD3 - راجع ملف [LICENSE](https://github.com/falconforceteam/falconhound/blob/HEAD/LICENSE) للحصول على التفاصيل.
هذا يعني أنه يمكنك استخدام هذا البرنامج مجانًا، حتى في المنتجات التجارية، طالما أنك تنسب الفضل إلينا. لا يمكنك تحميلنا المسؤولية عن أي أضرار ناجمة عن هذا البرنامج.