
تقييم مسارات الهجوم في BloodHound مع مراعاة كشف الأنظمة - أهدأ مسار نحو هدفك، معاير عبر خمسة مستويات كشف (audit/EDR/Elastic/MDI/WDAC) إضافةً إلى Azure.
<p align="center"><img src="https://assets.kitploit.com/production/public/readmes/50019/502beed5defd8b7d32991f173f6339e3214eb604968886518cd026cc2e4d3ee5.png" alt="NoiseHound" width="600"></p>
<h1 align="center">NoiseHound</h1>
<p align="center">
<a href="https://pypi.org/project/noisehound/"><img src="https://img.shields.io/pypi/v/noisehound" alt="PyPI"></a>
<a href="https://github.com/warpedatom/NoiseHound/releases"><img src="https://img.shields.io/github/v/release/warpedatom/NoiseHound" alt="Release"></a>
<a href="https://github.com/warpedatom/noisehound/blob/main/LICENSE"><img src="https://img.shields.io/github/license/warpedatom/NoiseHound" alt="License"></a>
<img src="https://img.shields.io/badge/python-3.10+-3776AB?logo=python&logoColor=white" alt="Python 3.10+">
<a href="https://github.com/warpedatom/NoiseHound/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/warpedatom/NoiseHound/ci.yml?branch=main&label=CI" alt="CI"></a>
<a href="https://github.com/warpedatom/noisehound/blob/main/SECURITY.md"><img src="https://img.shields.io/badge/Security-Policy-green" alt="Security policy"></a>
<a href="https://x.com/warped_atom"><img src="https://img.shields.io/badge/X-@warped__atom-000000?logo=x&logoColor=white" alt="X (Twitter): @warped_atom"></a>
</p>
**تقييم مسارات الهجوم في Active Directory مع مراعاة الكشف.**
_DreadHost Research | رفيق لـ OffsetInspect (PowerShell) وOffsetScan (Rust)_
يعثر BloodHound (وPlumHound فوقه) على *مسار* واحد نحو الهدف.
يستوعب NoiseHound بيانات الرسم البياني نفسها ويعيد ترتيب المسارات حسب **التكلفة
المتوقعة للكشف** بدلاً من عدد القفزات، حتى يتمكن المشغّل من السؤال "ما هو أهدأ
طريق إلى Domain Admin" بدلاً من مجرد "ما هو أحد الطرق".
> **جديد هنا؟ [Operator Walkthrough](https://github.com/warpedatom/noisehound/blob/main/docs/WALKTHROUGH.md) هو أسرع طريقة لرؤية
> ما يفعله هذا** - جولة عملية مدعومة بلقطات الشاشة من التثبيت إلى إثبات مفهوم حي
> لـ BloodHound CE (تُكتب الدرجات مرة أخرى في الواجهة)، ومحرك DeadAir، وتقرير
> فجوة الكشف الخاص بالفريق الأزرق.
> **حالة المشروع (v1.2.0):** مستقر ومُختبَر على بيانات BloodHound حقيقية عبر
> نطاقات متعددة. **37 من أصل 77 حافة في المجموعة مُقاسة معمليًا** عبر خمسة
> مستويات كشف محلية (Windows audit، وDefender for Endpoint، وElastic SIEM،
> وتنبيهات Defender for Identity أثناء التشغيل، وWDAC audit) بالإضافة إلى مستوى
> Azure/Entra مُقاس - تُشحن كستة ملفات تعريف جاهزة في [`profiles/`](https://github.com/warpedatom/noisehound/blob/main/profiles)،
> مع إثبات حلقي مغلق أنها تغيّر ترتيب المسارات ([`docs/VALIDATION.md`](https://github.com/warpedatom/noisehound/blob/main/docs/VALIDATION.md)).
> تتضمن المجموعة 13 حافة **Azure/Entra** ([`docs/AZURE.md`](https://github.com/warpedatom/noisehound/blob/main/docs/AZURE.md))،
> قابلة للاستيعاب مباشرة من مخرجات AzureHound.
> الحواف المحلية غير المُقاسة وجميع حواف Azure تحمل **تقديرات خبيرة**؛ وأداة
> المعايرة (`noisehound-calibrate`) هي الطريقة التي تُقاس بها، وبيئتك الخاصة أيضًا.
> تعامل مع الترتيبات غير المُعايَرة كإرشاد مدروس جيدًا، وليس كحقيقة مطلقة.
> للاستخدام في المهام المصرّح بها فقط. تقيّم هذه الأداة مسارات الهجوم لتخطيط
> OPSEC ضد الأنظمة التي لديك إذن كتابي باختبارها.
> NoiseHound مشروع مجتمعي مستقل. وهو غير تابع لـ SpecterOps أو مشروع BloodHound،
> ولا مُعتمد منهما، ولا مرتبط بهما؛ بل يستهلك تنسيق البيانات المفتوح الخاص بـ
> BloodHound.
---
## كيف يعمل
1. **الاستيعاب** تصدير BloodHound CE (`.zip`)، أو ملف JSON خام، أو دليل من
عمليات التصدير إلى رسم بياني داخلي. كما يُقبل تنسيق JSON مُطبَّع `{nodes, edges}`
للتحليل دون الاتصال بالشبكة والاختبارات. تُصنَّع حواف تصعيد AD CS **ESC1-8**
في وقت التحميل من حقائق قوالب الشهادات وCA التي يجمعها BloodHound (انظر أدناه).
2. **التعليق** على كل حافة من مجموعة بيانات القياس عن بُعد للحواف، مع إرفاق
`effective_noise_score` (0-100). حيثما تربط عدة حقوق الزوج نفسه
من العُقد، يُختار الأهدأ. أنواع الحواف الغائبة عن المجموعة تعود
افتراضيًا إلى درجة متحفظة (60) حتى تفشل الفجوات بأمان بدلًا من التقليل من الإبلاغ.
ويضبط **ملف تعريف البيئة** الاختياري الدرجات وفقًا لوضع الكشف المُعلن للهدف (انظر أدناه).
3. **الحل** لأهدأ المسارات. ولأن درجة المسار هي عنق زجاجة زائد
المتوسط (وليس مجموعًا بسيطًا)، فلا يمكن تحسينها مباشرةً بواسطة Dijkstra. يجمع
الحلّال بين *مسح عتبات* (لكل مستوى ضوضاء مميز، أهدأ مسار يبقى تحته) وتمريرة محدودة
لأقصر k حسب الوزن، ثم يعيد ترتيب الاتحاد وفق درجة المسار الحقيقية. مسح العتبات
هو الضمانة الخلفية للصحة: فهو يُبرز مسارًا طويلًا لكنه هادئ بانتظام
كان بحث الوزن المجموع المحض سيصنّفه أدنى من مسار قصير لكنه صاخب.
4. **الإبلاغ** كنص، أو JSON (قابل للتشغيل البيني مع مخطط نتيجة OffsetInspect)،
أو تقرير HTML مكتفٍ ذاتيًا منسّق ليطابق مجموعة الأدوات.
### تقييم المسار
ضوضاء المسار **ليست** عمدًا مجموعًا بسيطًا. فإطلاق الكشف نفسه
مرتين ليس بصخب مضاعف (فرز SOC، وليس عدد الأحداث الخام). يستخدم NoiseHound:
```
path_score = max(edge_scores) * 0.6 + mean(edge_scores) * 0.4
```
يُرجّح هذا نحو الخطوة الفردية الأعلى صوتًا (فغالبًا ما تُحرق خطوة سيئة واحدة العملية بأكملها) مع مراعاة التعرض التراكمي في الوقت نفسه. الأوزان قابلة للضبط (`--max-weight` / `--mean-weight`) بحيث يمكن ضبطها تجريبيًا بمجرد توفر بيانات كشف حقيقية من مختبر APT29/Caldera.
كما يُبلّغ كل مسار عن **احتمالية كشف** - أي فرصة إطلاقه تنبيهًا مترابطًا - عبر مزج الحافة الأعلى صوتًا مع OR الضجيجي التراكمي لجميع الحواف (يُضبط عبر `--correlation`). وهو يجيب عن سؤال مختلف عن درجة الضجيج: فقد يكون لمسار قصير لكن عالٍ الصوت *احتمالية* إجمالية أقل للكشف من مسار طويل لكن هادئ. رتّب حسبها باستخدام `--rank-by probability`.
### محرك من طبقتين (DeadAir)
بالنسبة للرسوم البيانية الكبيرة، يُوجَّه الحل إلى [DeadAir](https://github.com/warpedatom/DeadAir)، وهو محرك Rust مرافق (طبقة OffsetScan-to-OffsetInspect). يبقى NoiseHound الواجهة الأمامية الغنية بالميزات - الاستيعاب، والمجموعة، والبيئة/Sigma، والقيود، وإعداد التقارير - ويسلّم الرسم البياني المُجهَّز إلى المحرك الذي يحلّه، لذا تكون النتائج متطابقة في كلتا الحالتين.
- `--engine auto` (الافتراضي): DeadAir عندما يُعثر على ملفه التنفيذي *و* كان الرسم البياني كبيرًا (>= 5000 عقدة)؛ وإلا فمحرك Python المدمج.
- `--engine python`: فرض المحرك المدمج (لا حاجة لملف تنفيذي).
- `--engine rust`: فرض DeadAir (يُظهر أخطاءً إذا كان الملف التنفيذي مفقودًا).
يُعثر على DeadAir عبر `$NOISEHOUND_DEADAIR`، ثم `PATH`، ثم بناء الشقيق `../deadair/target/{release,debug}/`. وهو أسرع بمقدار 10-100x على الرسوم البيانية الكبيرة (يُحلّ رسم بياني بـ 250k عقدة في ~2s مقابل ~30s في Python) مع إنتاج تصنيفات متطابقة بايتًا ببايت. ويُسجّل المخرجات أي محرك قد شُغّل.
### التوجيه متعدد الأهداف والمقيّد
يسحب الضجيج وعدد القفزات واحتمالية الكشف في اتجاهات مختلفة، لذا يُرجع `--pareto` **حدود Pareto** - كل مسار لا يتفوق عليه أي مسار آخر في الثلاثة دفعة واحدة - بدلًا من فرض فائز واحد. وللعمليات الحقيقية قيود: `--avoid NODE` يُبقي المسار بعيدًا عن مضيف محدد (صندوق قفز مراقب بـ EDR، أو honeypot)، و`--avoid-edge TYPE` يرفض تقنية ما (مثل `--avoid-edge DCSync`). كلاهما قابل للتكرار ويُعاد الحل فوريًا.
```bash
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" --pareto
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" --avoid FILESERVER01 --avoid-edge HasSession
```
---
## كيف تُقارَن NoiseHound
إن توجيه المسارات الموزون في BloodHound ليس جديدًا، لذا إليك التموضع الصادق:
- **BloodHound / BloodHound CE** يجدان *مسارًا* عبر عدّ القفزات غير الموزون. لا يوجد
نموذج ضجيج.
- **GoodHound** يُسنِد تكاليف للحواف ويجد أرخص المسارات، لكن نموذج التكلفة لديه
هو صعوبة الاستغلال والمخاطر التجارية، وليس ضجيج الكشف.
- **PlumHound / ImproHound** يقومان بإعداد التقارير وتحليل انتهاكات المستويات؛ ولا
يعيد أيٌّ منهما حل مسار هادئ نحو الهدف.
- **تعيينات الكشف** (Sigma، DeTT&CT، مراجع معرّفات الأحداث إلى ATT&CK) غنية
لكنها موجّهة للبشر وغير مرتبطة بأنواع حواف BloodHound.
إسهام NoiseHound هو الجمع بين: مجموعة بيانات قابلة للقراءة آليًا تربط حواف
BloodHound ببيانات الكشف والقياس، وإعادة حل موزون بالضجيج مصاغة
كـ OPSEC للمشغّل ("أهدأ طريق إلى DA")، ونموذج بيئة يتكيّف مع
الوضعية المعلنة للهدف، وحلقة معايرة تحوّل عمليات الكشف المخبرية إلى
درجات مقيسة. رياضيات الرسم البياني سلعة عامة؛ أما مجموعة البيانات والصياغة فهما
المقصود. وقيمتها لا تتجاوز جودة مجموعة البيانات، ولهذا فإن المعايرة
والمساهمة المجتمعية من الأولويات - انظر أدناه.
## التثبيت
```bash
cd NoiseHound
python -m pip install -r requirements.txt # networkx>=3.0
# optional editable install to get the `noisehound` command on PATH:
python -m pip install -e .
```
يتطلب Python 3.10+.
## الاستخدام
```bash
# Text summary (default)
python -m noisehound --input export.zip --objective "Domain Admins" --source jdoe
# JSON, for downstream tooling / correlation across the DreadHost suite
python -m noisehound -i export.zip -o "Domain Admins" -s jdoe -f json --out paths.json
# Self-contained HTML report
python -m noisehound -i export.zip -o "Domain Admins" -s jdoe -f html --out report.html
```
أولًا، تحقّق من سلامة المحلّل على تصديرك (المدرّجات التكرارية + تغطية المجموعة، دون تتبّع المسارات) - أسرع طريقة للتحقق من NoiseHound على بيانات واقعية:
```bash
noisehound-inspect -i export.zip
```
### BloodHound CE / Neo4j المباشر
بدلاً من ملف zip، وجّه `--input` إلى قاعدة بيانات Neo4j التي يملؤها BloodHound CE
ويقرأ NoiseHound الرسم البياني (المحلَّل مسبقاً) مباشرةً عبر Bolt:
```bash
pip install 'noisehound[neo4j]'
export NEO4J_PASSWORD=bloodhoundcommunityedition # match your BHCE compose
noisehound-inspect -i bolt://localhost:7687
python -m noisehound -i bolt://localhost:7687 -s jdoe -o "Domain Admins"
```
شغّل BloodHound CE (يتضمن Neo4j على المنفذ 7687) باستخدام ملف compose الرسمي الخاص به:
`curl -L https://ghst.ly/getbhce | docker compose -f - up`.
جرّبه على العينات المرفقة:
```bash
python -m noisehound -i samples/sample_graph.json -s jdoe -o "Domain Admins" -d CONTOSO.LOCAL
python -m noisehound -i samples/sample_bloodhound_ce.zip -s jdoe -o "Domain Admins"
python -m noisehound -i samples/sample_adcs_ce.zip -s jdoe -o "Domain Admins" # ADCS ESC1
# Full-spectrum export exercising every edge family (sessions, delegation, DCSync, ADCS, trusts):
python -m noisehound -i samples/sample_fullspectrum_ce.zip -s ALICE -o "Domain Admins" -d CONTOSO.LOCAL -k 3
```
هذا الأخير هو أوضح عرض للأطروحة: أهدأ مسار إلى مسؤولي النطاق هو مسار جلسة من 4 قفزات، مُرتَّب *فوق* مسار RDP من 3 قفزات ومسار ADCS ESC1 من قفزة واحدة — أكثر القفزات، وأقل الضجيج.
تُظهر العينة القيمة الجوهرية: أهدأ مسار هو مسار جلسة من 4 قفزات (النتيجة 19.9)، مُرتَّب *فوق* اختصار ForceChangePassword من قفزتين (36.4). القفزات الأقل لا تعني بالضرورة هدوءًا أكبر.
### وضع فجوة الكشف للفريق الأزرق
المسار الأهدأ هو حيث يكون الكشف أضعف، لذا أضف `--defensive` لعكس المخرجات لصالح المدافعين: فهو يحدد الحواف الهادئة فقط لأن القياس عن بُعد الخاص بها معطّل أو غائب، ويربط كلًا منها بالضابط الذي سيكشفها، ويرتب تلك الضوابط حسب مقدار ما ترفعه من نتيجة المسار الأهدأ.
```bash
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" --defensive
```
على العينة كاملة الطيف، يجد أن المسار الأكثر هدوءًا إلى Domain Admins
يتوقف على وصول LSASS غير المكتشف (`HasSession`، 20 -> 65 إذا تمت المراقبة) ويوصي
بنشر Sysmon Event 10 - إغلاق هذه الفجوة الواحدة يرفع المسار الأكثر هدوءًا من 19.9 إلى 48.4. راجع [`docs/ROADMAP.md`](https://github.com/warpedatom/noisehound/blob/main/docs/ROADMAP.md) لمعرفة إلى أين يتجه هذا
وبقية النموذج.
### الخيارات الرئيسية
| الخيار | المعنى |
|--------|---------|
| `--input, -i` | ملف BloodHound بصيغة `.zip` أو `.json` أو مجلد يحتوي على الصادرات |
| `--source, -s` | الهوية الرئيسية للبدء (`jdoe` أو معرّف كائن) |
| `--objective, -o` | العقدة الهدف (`Domain Admins` أو معرّف كائن) |
| `--paths, -k` | عدد المسارات الأكثر هدوءًا المطلوب إرجاعها (الافتراضي 5) |
| `--format, -f` | `text` (الافتراضي) أو `json` أو `html` |
| `--defensive` | عرض الفريق الأزرق: فجوات الكشف على المسارات الأكثر هدوءًا + الإصلاحات |
| `--rank-by` | `noise` (الافتراضي) أو `probability` (احتمال P لتنبيه مترابط) |
| `--correlation` | معامل الترابط لدى SOC لـ P(detected)، من 0 إلى 1 (الافتراضي 0.5) |
| `--pareto` | إرجاع حدود Pareto وفقًا لـ noise/hops/P(detect) |
| `--engine` | `auto` (الافتراضي) أو `python` أو `rust` (محرك DeadAir) |
| `--avoid NODE` | استبعاد عقدة من جميع المسارات (قابل للتكرار) |
| `--avoid-edge TYPE` | استبعاد نوع حافة من جميع المسارات (قابل للتكرار) |
| `--corpus` | تجاوز دليل corpus الخاص بتعيين الحواف |
| `--environment, -e` | ملف JSON يعلن فيه المشغّل وضعية الهدف (يعدّل الدرجات) |
| `--max-weight` / `--mean-weight` | أوزان التقييم (يجب أن يكون مجموعها 1.0) |
| `--default-noise` | درجة أنواع الحواف الغائبة عن corpus (الافتراضي 60) |
---
## ملفات تعريف البيئة
لا يمكن لدرجة corpus ثابتة أن تعرف ما إذا كان هدف معين لديه تدقيق كائنات 4662
مفعّلًا، أو يشغّل Sysmon، أو يشغّل ITDR مثل MDI - ومع ذلك فإن هذه الأمور تغيّر الضجيج
الحقيقي لحافة بشكل هائل (فـ DCSync شبه صامت دون تدقيق 4662
وشبه مؤكد الكشف معه). بدلًا من التظاهر بأن رقمًا واحدًا يناسب كل
بيئة، أعلن وضعية الهدف في ملف JSON صغير وسيقوم NoiseHound
بتعديل الدرجات بشفافية وفقًا لتعليقات القياس عن بُعد الخاصة بالـ corpus:
```json
{
"name": "CONTOSO.LOCAL-prod",
"object_auditing_4662": true,
"ds_change_auditing_5136": false,
"edr": "MDI",
"sysmon": true,
"powershell_logging_4104": true,
"adjustments": { "HasSession": 65 }
}
```
التعديلات لا تفعل سوى *رفع* النتيجة نحو حد أدنى للكشف يستلزمه الوضع المُعلن. `adjustments` هي تجاوزات صارمة لكل حافة - المكان المخصص لتسجيل القيم التي عايرتها مقابل مختبرك الخاص. هذه القيم مقدَّمة من المشغّل، وليست مقيسة؛ فهي لا تحل محل التحقق الحي في المرحلة 2، لكنها تحوّل المجموعة الثابتة من "رقم واحد لجميع البيئات" إلى "الرقم الخاص بالبيئة التي أنت فيها فعليًا". في العينة المرفقة، يؤدي الإعلان عن الملف التعريفي أعلاه إلى تحويل أهدأ مسار من مسار جلسة تفريغ LSASS إلى مسار كتابة دليل - وهو القرار الصحيح بمجرد أن تصبح بيانات القياس عن بُعد للمضيف حيّة.
```bash
python -m noisehound -i samples/sample_graph.json -s jdoe -o "Domain Admins" \
-e samples/env_profile.example.json
```
أسبقية التقييم: `static -> environment-adjusted -> live (Phase 2)`.
---
## أداة المعايرة
ملفات تعريف البيئة لا تكون أفضل من الأرقام التي تضعها فيها.
`noisehound-calibrate` يغلق الحلقة: شغّل التقنيات في مختبر كشف،
وسجّل ما تم تفعيله، فيُصدر ملف تعريف بيئة معايَرًا.
**لقد تم هذا بالفعل.** يُشحن [`profiles/`](https://github.com/warpedatom/noisehound/blob/main/profiles) ستة ملفات تعريف مقاسة من
نطاق Hyper-V Vulnerable-AD حقيقي ومستأجر Azure مختبري - تدقيق، وEDR (Defender for
Endpoint)، وElastic SIEM، وDefender for Identity، وطبقات WDAC بالإضافة إلى طبقة
Azure/Entra مقاسة، 37 حافة - أنتجتها أداة المعايرة الآلية (`lab/`) وهذه
الأداة. استخدمها مباشرةً، أو قِس ملفاتك الخاصة:
```bash
# Use a shipped measured profile:
noisehound -i export.zip -s jdoe -o "Domain Admins" -e profiles/vulnad-hyperv-audit.json
# Or measure your own lab:
# 1. noisehound-calibrate --plan -o plan.json (per-edge detection events)
# 2. lab/Invoke-NoiseHoundCalibration.ps1 (run + auto-count -> lab_detections.json)
noisehound-calibrate -i lab_detections.json -o env.calibrated.json
noisehound -i export.zip -s jdoe -o "Domain Admins" -e env.calibrated.json
```
نموذج الدرجة هو مقدّر انكماشي، صادق بشأن حجم العينة:
```
p = detections / runs (detection probability)
lab_score = p * severity_loudness + (1 - p) * residual
w = runs / (runs + smoothing) (confidence in the lab)
calibrated = w * lab_score + (1 - w) * corpus_static
```
`lab_score` هو تكلفة الكشف المتوقعة - شدة SOC عند إطلاقه، وبقايا صغيرة عندما لا يُطلق. يحافظ الوزن `w` على عدم تغلّب تشغيل واحد على المجموعة مع السماح لنتيجة جيدة العينات بالهيمنة. في المثال، يرتفع HasSession من 20 ثابتة إلى 52 (التقط المختبر تفريغ LSASS في 4 من 5 تشغيلات) بينما ينخفض Kerberoast من 60 إلى 34 (لم يُطلق أبدًا). استخدم `--merge existing.json` لتركيب معايرة جديدة على ملف تعريف مع الحفاظ على أعلام وضعه، و`--smoothing` / `--residual` لضبط النموذج.
---
## التقييم مقابل عمليات الكشف المنشورة (Sigma)
ملفات تعريف البيئة والمعايرة مُعلنة ذاتيًا. يقيّم `noisehound-sigma` مقابل عمليات الكشف التي *كتبها المدافع فعليًا*: وجّهه إلى مجموعة قواعد Sigma وسيحسب على أي حواف المجموعة ستُطلق كل قاعدة (بمطابقة معرّفات أحداث القياس عن بُعد للحافة وتقنية ATT&CK)، ثم يُصدر ملف تعريف بيئة يرفع الحواف المغطاة - بديل جاهز لـ `--environment`.
```bash
noisehound-sigma -r ./sigma-rules/ -o env.sigma.json
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" -e env.sigma.json --defensive
```
بالنسبة لطبقة الهوية، يقوم **`noisehound-mdi`** بالشيء نفسه تجاه اكتشافات Microsoft Defender for Identity المدمجة - فهو يربط تنبيهات MDI وقت التشغيل (ومع `--include-posture`، تقييمات ISPM الخاصة به) على حواف المجموعة ويُصدر ملف تعريف لطبقة الهوية. إن MDI مستقل عن الأدوات، لذا فإن تغطيته تصمد بغض النظر عن أدوات المهاجم.
```bash
noisehound-mdi -o env.mdi.json # + coverage report (which edges MDI watches, and the gaps)
```
بالنسبة لحواف **Azure/Entra**، يقيس **`noisehound-entra`** طبقة السحابة بالطريقة التي قِيست بها الطبقات المحلية: فعّل إساءات `AZ*` في مستأجر مختبري، وصدّر سجل `directoryAudits` الخاص بـ Entra، ثم يحسب ما تم تسجيله فعليًا في ملف تعريف معاير (`docs/AZURE_CALIBRATION.md`).
```bash
noisehound-entra -a directoryAudits.json -m entra_runs.json --profile-out profiles/lab-tenant-azure.json
```
المطابقة محافظة عن قصد حتى لا تخفي أي فجوة أبدًا: لا تُحتسب القاعدة إلا إذا كانت تشير إلى معرّف حدث يولّده الضلع *و*، عندما تكون القاعدة موسومة بـ ATT&CK، تتفق تقنيتها - لذا لا تُنسب قاعدة DCSync من نوع DS-Access (4662) خطأً إلى تغطية قراءات LAPS التي تشترك فقط في معرّف الحدث. يسرد التقرير كلاً من ما تغطيه قواعدك، والأهم من ذلك، أضلاع الهجوم التي لا تغطيها أي قاعدة. وبالاقتران مع `--defensive`، يجيب هذا عن السؤال: "بالنظر إلى وسائل الكشف التي نشرتها، أين يظل مسار هجومي الأكثر هدوءً غير مرئي؟"
### جرد Elastic Security المباشر
يجيب `noisehound-elastic` عن السؤال نفسه مقابل وسائل الكشف **المفعّلة فعليًا الآن** في حزمة Elastic Security قيد التشغيل، بدلاً من القواعد الموجودة على القرص. يقرأ محرك الكشف عبر واجهة `_find` للقراءة فقط في Kibana (أو تصدير دون اتصال)، ويُسند تقنية ATT&CK لكل قاعدة مفعّلة وأي رموز أحداث Windows في استعلامها، ويُصدر ملف تعريف التغطية `--environment` نفسه.
```bash
export KIBANA_URL=https://kibana:5601 KIBANA_API_KEY=<base64 ApiKey>
noisehound-elastic -o env.elastic.json # live, read-only
noisehound-elastic --rules-json rules_find.json -o env.elastic.json # offline export
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" -e env.elastic.json --defensive
```
يعيد استخدام مطابق Sigma ويضيف طبقة خاصة بالتقنيات فقط (موسومة `[technique]`، بدرجة أقل) لقواعد KQL/EQL السلوكية التي لا تذكر رمز حدث أبدًا. يتم تجاهل القواعد المعطّلة. النمط نفسه المتمثل في التطبيع ثم التقييم سيُطبَّق لاحقًا على Splunk / Sentinel / MDI.
---
## AD CS ESC1-8
عند التحميل، ينفّذ NoiseHound نسخة مركّزة من المعالجة اللاحقة لـ ADCS الخاصة بـ BloodHound، حيث يركّب حواف التصعيد من حقائق القوالب/الجهات المُصدرة للشهادات (CA) المحتفظ بها. يتحول حق `Enroll` على قالب معرّض للخطر إلى حافة `ADCSESCn` مباشرة من الأصل إلى مجموعة Domain Admins الخاصة بالنطاق (RID 512)، بحيث يصبح تصعيد الشهادات قابلًا للتتبع والتقييم كأي حافة أخرى:
| الحافة | الشرط |
|------|-----------|
| `ADCSESC1` | Enrollee-supplies-subject + client-auth EKU، بدون موافقة/توقيعات RA |
| `ADCSESC2` | Any-Purpose / SubCA EKU، بدون موافقة |
| `ADCSESC3` | قالب وكيل تسجيل + قالب مصادقة على نفس CA |
| `ADCSESC4` | تحكّم كتابة خطير على قالب منشور |
| `ADCSESC5` | التحكّم في كائن CA أو الحاسوب المستضيف له |
| `ADCSESC6` | تم تعيين `EDITF_ATTRIBUTESUBJECTALTNAME2` على CA |
| `ADCSESC7` | `ManageCA` / `ManageCertificates` على CA |
| `ADCSESC8` | نقطة نهاية تسجيل ويب HTTP معرّضة للخطر (coerce + NTLM relay) |
جرّبه: `python -m noisehound -i samples/sample_adcs_ce.zip -s jdoe -o "Domain Admins"`.
تبسيطات موثّقة (تفشل بأمان نحو إظهار مسارات أكثر): لا يتم نمذجة قيود التسجيل على مستوى CA (يُعتبر تسجيل القالب كافيًا)؛ يغطي ESC5 كائن CA ومضيفه، وليس كل حاوية PKI؛ ESC9/10/13 خارج النطاق. تُحفظ حواف ESC الاصطناعية الموجودة بالفعل في تصدير معالَج لاحقًا.
---
## المجموعة (`edge_mappings/`)
مجموعة بيانات القياس عن بُعد للحواف هي الملكية الفكرية الفعلية لهذه الأداة؛ أما الكود فهو رياضيات رسم بياني بسيطة نسبيًا فوقها. كل ملف `edge_mappings/<Edge>.json` يربط نوع حافة BloodHound بسطح الكشف الخاص بها:
- مصادر القياس عن بُعد المتوقعة (معرّفات أحداث أمان Windows، ومعرّفات أحداث Sysmon، والشبكة، واستدلالات EDR/ITDR) مع موثوقية لكل مصدر وما إذا كانت المراجعة ذات الصلة مفعّلة افتراضيًا
- درجة ضوضاء ثابتة (0-100)
- تقنية MITRE، والامتياز المطلوب مسبقًا، والبدائية المعتادة لإساءة الاستخدام، وملاحظات
```json
{
"edge_type": "DCSync",
"static_noise_score": 85,
"telemetry": [
{"source": "windows_security", "event_id": 4662,
"detail": "Directory Service Access - requires object auditing (default OFF)",
"reliability": "high_if_auditing_enabled", "default_enabled": false},
{"source": "edr_heuristic", "product_class": "MDI",
"detail": "Non-DC hosts issuing DRSGetNCChanges - high fidelity",
"reliability": "high"}
],
"mitre_technique": "T1003.006",
"notes": "Assumes default audit policy (mostly OFF) but high EDR/MDI coverage."
}
```
توسيع المجموعة هو المكان الذي ينبغي أن يذهب إليه معظم الجهد المستمر. أضف ملف JSON جديدًا، واحتفظ بالمخطط (يُتحقق منه عند التحميل)، وسيُلتقط تلقائيًا. تُوفّر v0.3 43 نوعًا من الحواف تغطي حواف إساءة استخدام ACL، وKerberos، والتفويض، وADCS ESC1-8، وLAPS/gMSA، وGPO، والثقة، وحقوق الوصول التي تهم في إيجاد المسارات.
تُهيّأ الدرجات من مصفوفة الضوضاء في DreadHost Red Team Operator Playbook (تعيينات أحداث Windows/Sysmon، وتقييمات ضوضاء التقنيات) ومن حقائق الكشف القياسية في AD. اضبطها وفقًا لبيانات الكشف في مختبرك الخاص.
---
## خارطة الطريق
- **تغطية Azure / Entra ID (الأساس مُطلق، ويتوسّع).** تُطلق الآن 13 حافة من حواف مسار الهجوم `AZ*` مع بيانات قياس الكشف الأصلية لـ Entra - انظر [`docs/AZURE.md`](https://github.com/warpedatom/noisehound/blob/main/docs/AZURE.md). تُقيَّم بيانات Azure المجمّعة عبر AzureHound في BloodHound CE اليوم (`noisehound -o "Global Administrator"`)، كما يُطلق الآن الاستيعاب الأصلي لـ AzureHound بالإضافة إلى طبقة معايرة Azure/Entra المقيسة (`noisehound-entra`، `profiles/lab-tenant-azure.json`). التالي: ملفات تعريف وضع Entra (MDCA / ID Protection / Sentinel) والحواف الهجينة (Entra Connect / PHS-PTA) حتى يساهم **MDI** عبر الحدود بين المحلي والسحابي.
- **إنهاء المعايرة - 37/77 مقيسة، مستمرة.** ما تبقّى نحو 40 حافة (الإكراه/الترحيل، ADCS ESC2-13، CanRDP على العتاد المجرّد)، ومعايرة أعمق متعددة البيئات، ومجموعة متعددة EDR (CrowdStrike/S1 إلى جانب MDE)، بالإضافة إلى معايرة الأدوات لكل حافة لتوسيع محور `--tooling`.
- **توليف ADCS ESC10a/10b/13** (توليف ESC1-9 يُطلق الآن).
---
[Read more](https://github.com/warpedatom/noisehound)