Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
SecretsStalker — تقييم قراءة فقط لبيانات اعتماد التطبيقات في Entra ID: يُعدّ أذونات Graph وAzure RBAC والبيانات السحابية القابلة للوصول، ثم يربط النتائج بمسارات تصعيد الامتيازات والحركة الجانبية. | Kitploit
أدوات/GitHubGitHub/rootsecdev/secretsstalker
المصادقة والترخيصأمن البنية التحتية السحابيةتصعيد الامتيازاتالاستطلاعالحركة الجانبيةما بعد الاستغلالاختبار الاختراقأمن السحابةإدارة الهوية والوصول (IAM)الفريق الأحمر
GitHubrootsecdev/secretsstalker
11منذ 14 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

SecretsStalker

تقييم قراءة فقط لبيانات اعتماد التطبيقات في Entra ID: يُعدّ أذونات Graph وAzure RBAC والبيانات السحابية القابلة للوصول، ثم يربط النتائج بمسارات تصعيد الامتيازات والحركة الجانبية.

عرض المستودع

secret_stalker```


/ / ______ ___ ___ / /_ / / / /__ _ / / /_____ ____ \ / -) / -) -)/ / \ \ / __/ _ `// / '/ -) / //_/_/_/_/ _/ // _/_,////_\__/_/

root@kitploit:~
     ╔╦╦╬╬╬╬╬╬╦╦╗
 ╔╬╬╬╝╝┘      ╚╝╝╬╬╬┐
╬╬╝╚╩╬╗╔          ╚╬╬╬

╬╝ ╚╬╬╗╗ ╔ ╚╬╗ ╬╬ ╔╗ ╚╬╬╬╬╬╬╦ ╬╬ we found your secret... ╔╬┤ ╬╬╬ ╬╬╬╬╬╬╬╬╝╝╝╬╬╗ ...now let's see what it ╬╬┤ ╚╩┘ ╚╬╬╬╬╬╩ ╠╬╬ can REALLY do. ( o_o)>=|= ╬╬┤ ╠╬╬ ╬╬ ╦╗ ╗╗ ╬╬ [ client_id + secret -> total recall ] └╬┐ ╚╬╗╗ ╔╬╬╝ ╔╬┘ └╬╗ ╚╩╩╬╬╬╩╩╝╝ ╔╬╬ ╚╬╬╬╗ ┌╗╬╬╝┘ ╚╩╬╬╬╦╦╦╦╦╦╬╬╬╝╝ ╚╚╝╝╝╝ // pst... that app registration talks too much. \

root@kitploit:~
**ما الذي يمكن أن يفعله معرّف عميل Entra ID + السرّ فعليًا؟**

لقد عثرت على بيانات اعتماد تطبيق Entra ID (Azure AD) — معرّف عميل وسرّ —
ضمن مهمة مرخَّصة، والمستأجر (tenant) الذي تنتمي إليه ضمن النطاق المخوَّل.
يأخذ `secret_stalker` هاتين القيمتين ويخبرك، من نقطة البداية الباردة:

1. **هل هو صالح، ومتى تنتهي صلاحية السرّ؟** — وإذا لم يكن صالحًا، *ما السبب*
   (سرّ خاطئ، سرّ منتهي الصلاحية، التطبيق غير موجود في المستأجر…). بالنسبة لسرّ صالح،
   يقرأ `passwordCredentials` لتسجيل التطبيق ويُبلّغ عن تاريخ الانتهاء
   + الأيام المتبقية (يتطلب قراءة الدليل؛ انظر الملاحظة أدناه).
2. **ما صلاحيات Microsoft Graph التي يحملها؟** — أذونات التطبيق تُقرأ
   مباشرةً من الرمز المصدَر، بالإضافة إلى **أدوار دليل Entra** التي يمتلكها (حتى
   يتم اكتشافها سلبيًا من مطالبة `wids` في الرمز) و**الكائنات التي يملكها**
   (تطبيقات/كائنات خدمة (SPs) يمكنك إضافة بيانات اعتماد إليها).
3. **ما التحكم الذي يملكه على Azure؟** — تعيينات أدوار RBAC على نطاق
   مجموعة الإدارة والاشتراك.
4. **هل يمكنه الوصول إلى بيانات حقيقية؟** — فحوصات اختيارية لقابلية الوصول إلى
   Key Vault (الأسرار / المفاتيح / الشهادات)، وStorage (blob / file / queue / table)،
   وCosmos DB على مستوى البيانات.
5. **ما الأثر؟** — الأذونات والخطيرة والأدوار والملكية والبيانات التي يمكن الوصول إليها
   مرتبطة بأساليب معروفة لتصعيد الامتيازات / الحركة الجانبية، مقيَّمة حسب الخطورة،
   مع سرديات ملموسة **لمسارات الهجوم**.

يُصادق باستخدام إما **سرّ عميل** أو **شهادة** (`--cert`)،
ويعمل مع **السحب التجارية والسيادية** (`--cloud`).

إنه **سلبي افتراضيًا** و**لا يعدّل أي شيء مطلقًا** — تعداد للقراءة فقط.

> ⚠️ **للاستخدام المصرَّح به فقط.** شغّله فقط على المستأجرين الذين هم
> ضمن النطاق صراحةً لمهمة مخوَّل لك تنفيذها.

---

## التثبيت```bash
pip install -r requirements.txt        # just runs it from source
#   — or —
pip install .                          # installs the `secret_stalker` command
pip install '.[cert]'                  # + certificate (--cert) auth support
pip install '.[dev]'                   # + pytest for the test suite

الاعتماد الوحيد في وقت التشغيل هو requests. يتم فك تشفير الرموز محليًا (base64 + JSON) — بدون التحقق من التوقيع، بدون مكتبة تشفير، بدون Microsoft SDK. الاستثناء الوحيد هو مصادقة الشهادة (--cert)، والتي تتطلب حزمة cryptography الاختيارية لتوقيع تأكيد عميل JWT. يتطلب Python 3.7+.

بعد pip install . يمكنك استدعاؤه كـ secret_stalker … بدلاً من python -m secret_stalker ….


بداية سريعة

أسرع طريقة لمعرفة ما يمكن أن تفعله بيانات الاعتماد:```bash python -m secret_stalker
--tenant contoso.onmicrosoft.com
--client-id 11111111-2222-3333-4444-555555555555
--secret ''

root@kitploit:~
`--tenant` يقبل إما GUID لمعرّف مستأجر (tenant) أو نطاقًا (domain) — ويُحلّ النطاق إلى معرّف المستأجر الخاص به تلقائيًا عبر نقطة نهاية تكوين OpenID العامة.

### أبقِ السرّ خارج سجلّ محفوظات الصدفة (shell history)

مرّر بيانات الاعتماد عبر متغيرات البيئة بدلاً من الخيارات (flags):```bash
export SS_TENANT=contoso.onmicrosoft.com
export SS_CLIENT_ID=11111111-2222-3333-4444-555555555555
export SS_SECRET='<client-secret>'

python -m secret_stalker

أي من --tenant / --client-id / --secret يمكن أن يأتي من SS_TENANT / SS_CLIENT_ID / SS_SECRET. الخيارات (Flags) لها الأولوية على البيئة.

لا يقتصر الأمر على محفوظات الصدفة فقط: قيمة argv قابلة للقراءة من قبل أي مستخدم محلي طوال عمر العملية (ps, /proc/<pid>/cmdline). إذا تم تمرير --secret أو --cert-password كخيار، تطبع الأداة تذكيرًا من سطر واحد إلى stderr — ولا يظهر أبدًا في مخرجات --json أو --export.

المصادقة بشهادة بدلاً من سرّ

غالبًا ما تستخدم تسجيلات التطبيقات شهادة بدلاً من سرّ. مرّر --cert (PEM يحتوي على المفتاح الخاص و الشهادة، أو .pfx/.p12) وستقوم الأداة بالمصادقة عبر تأكيد عميل JWT موقّع:```bash python -m secret_stalker --tenant contoso.onmicrosoft.com
--client-id --cert ./app.pem # or app.pfx

encrypted key / PFX:

python -m secret_stalker ... --cert app.pfx --cert-password ''

root@kitploit:~
يتطلب مصادقة الشهادة حزمة `cryptography` الاختيارية (`pip install '.[cert]'`).
يُبلغ الأداة عن تاريخ انتهاء صلاحية الشهادة نفسها (المطابقة عبر بصمة الإبهام في
`keyCredentials` الخاصة بالتطبيق)، تمامًا كما يفعل للسر. يقرأ `--cert`/`--cert-password`
أيضًا من `SS_CERT` / `SS_CERT_PASSWORD`.

### السحابات السيادية والحكومية

بشكل افتراضي، يستهدف secret_stalker السحابة **التجارية**. بالنسبة للمستأجرين السياديين،
مرر `--cloud` (أو `SS_CLOUD`) بحيث تتطابق سلطة Entra ونقاط نهاية Graph / ARM / Key
Vault — وإلا ستبدو بيانات الاعتماد الصالحة كما لو أنها لا تملك أي وصول:```bash
# US Government (GCC High)
python -m secret_stalker --cloud usgov  --tenant contoso.onmicrosoft.us ...

# US DoD (L5)
python -m secret_stalker --cloud usdod  ...

# Azure operated by 21Vianet (China)
python -m secret_stalker --cloud china  --tenant contoso.partner.onmschina.cn ...

الأسماء المستعارة مثل gov وdod وcommercial وgcc-high و21vianet مقبولة. (إن audience الخاص بمستوى البيانات في Storage، storage.azure.com، هو نفسه في كل سحابة.)


سير العمل الموصى به في مهمة

  1. حدِّث خريطة الأذونات لهذا المستأجر (مرة واحدة). يحلّ معرّفات GUID الخاصة بأذونات Graph إلى أسماء رسمية للمستأجر الهدف: ```bash python -m secret_stalker --update-manifest
    root@kitploit:~

يُجري المصادقة، ويخزّن خريطة appRole الخاصة بـ Graph للمستأجر مؤقتًا في ~/.secret_stalker/app_roles_cache.json، ثم يخرج. تخطَّ هذه الخطوة إذا كانت بيانات الاعتماد غير قادرة على قراءة كيانات الخدمة — فما زالت الخريطة المرفقة تغطي الأذونات المعروفة.

  1. خط الأساس السلبي. تحقّق من الصلاحية وأذونات Graph وAzure RBAC دون لمس كائنات المستأجر: ```bash python -m secret_stalker
    root@kitploit:~
  2. كن نشطًا عندما تريد عمقًا + تقريرًا للاحتفاظ به. يضيف عينات كائنات Graph للقراءة فقط وقابلية الوصول إلى data-plane لـ Key Vault / Storage، ويكتب تصديرًا مسطحًا للفرز أو الإدخال: ```bash python -m secret_stalker --active --export results.ndjson
    root@kitploit:~

قراءة المخرجات

يتم تنظيم تقرير الطرفية من الأعلى إلى الأسفل بدءًا من "هل يعمل" وصولًا إلى "ما هي الأضرار." يبدو التشغيل النموذجي كما يلي:``` secret_stalker — credential assessment

Credential status : VALID Tenant : aaaaaaaa-... Client (app) id : 1111... App display name : Recon App SP object id : cccc... Secret : valid — expires 2027-03-01 (in 207 days)

Token acquisition

OK graph OK arm NO storage — no storage token

Microsoft Graph application permissions (from token)

  • Application.ReadWrite.All
  • Mail.Read

...

Findings — escalation / control

[CRITICAL] (GRAPH) Application.ReadWrite.All Can add credentials to any app/SP and impersonate it — tenant-wide pivot. [CRITICAL] (ARM) Owner Full control including granting access to others. [CRITICAL] (DATA) keyvault:secrets Can read Key Vault secret values — connection strings, passwords, tokens. [MEDIUM] (GRAPH) Mail.Read Read all mailboxes — data exposure.

Overall risk: CRITICAL

root@kitploit:~
- **اقتناء التوكن** يسرد كل جمهور تم فحصه (Graph وARM و— عند استخدام
  `--active`, عند اكتشاف موارد مطابقة — Key Vault / Storage /
  Cosmos DB). Graph وARM *مستقلان*: يمكن أن تحمل البيانات الاعتمادية أحدهما دون
  الآخر.
- **السر** يُظهر الصلاحية، وبالنسبة للسر الصالح، تاريخ الانتهاء والأيام
  المتبقية (يتم تمييز قرب الانتهاء). راجع الملاحظة أدناه حول الأسرار منتهية الصلاحية.
- **النتائج** هي الجزء الذي يجب قراءته أولاً — أذونات Graph عالية التأثير (`GRAPH`),
  وأدوار ARM (`ARM`), وأدوار دليل Entra (`ROLE`), والتطبيقات/كيانات الخدمة المملوكة (`OWN`),
  وأسطح مستوى البيانات القابلة للوصول (`DATA`), وأهداف هجمات الموافقة المطلوبة لكن غير الممنوحة
  (`WANT`) — مع إزالة التكرار وتقييم الخطورة. القدرة على
  قراءة كل سر في Key Vault، أو الاحتفاظ بدور دليلي، تُعد نتيجة بحد ذاتها
  حتى بدون منح Graph/ARM خطير.
- **مسارات الهجوم** تحوّل أهم النتائج إلى خطوات تالية ملموسة (مثل *Privileged
  Role Administrator ← تعيين Global Administrator للنفس ← السيطرة على المستأجر*).
- **تعداد Graph النشط** (`--active`) يبلّغ بما أعاده كل فحص للقراءة فقط.
  معظم الفحوصات تطلب صفحة صغيرة محدودة السقف، لذا تُعرض الصفحة الممتلئة كـ
  `N+` (مثل `users  accessible  (returned 5+)`) — أي *خمسة على الأقل*، وليس
  خمسة بالضبط. الفحوصات بدون سقف (`organization`, `directoryRoles`) تبلغ
  عن إجمالي حقيقي بدون `+`.
- **أدوار الدليل / الكائنات المملوكة / الأذونات المفوضة** لها أقسامها الخاصة.
  يتم اكتشاف أدوار الدليل من مطالبة `wids` في التوكن حتى بدون قراءة الدليل؛
  الأذونات المفوضة غير قابلة للاستخدام بواسطة بيانات اعتماد خاصة بالتطبيق فقط ولكن يتم عرضها
  للتحويلات في سياق المستخدم واستهداف هجمات الموافقة.
- **الخطر العام** هو أعلى خطورة لنتيجة واحدة.

> **انتهاء صلاحية السر — ما يمكن معرفته.** تاريخ الانتهاء *ليس* في التوكن؛
> بل موجود في `passwordCredentials` لتسجيل التطبيق في Entra ID. بالنسبة لسر
> **صالح**, يقرؤه secret_stalker عبر Graph ويطابق سرّك مع
> البيانات الاعتمادية الصحيحة عبر `hint` (أول 3 أحرف) — وهذا يتطلب قراءة الدليل
> (`Application.Read.All` / `Directory.Read.All`); إذا كان كيان الخدمة يفتقر إليها، يُبلَّغ عن
> التاريخ على أنه غير متاح بدلاً من تخمينه. بالنسبة لسر **منتهي الصلاحية**, يفشل
> المصادقة نفسها، لذا لا يمكن للبيانات الاعتمادية الميتة قراءة بياناتها الوصفية الخاصة — الأداة
> تعلّمه كـ `EXPIRED (AADSTS7000222)` لكن تاريخ الانتهاء الدقيق غير قابل للاسترجاع
> عبر تلك البيانات الاعتمادية وحدها.

### رموز الخروج

مفيدة للبرمجة النصية:

| الرمز | المعنى |
|------|---------|
| `0`  | البيانات الاعتمادية صالحة (تم الحصول على توكن واحد على الأقل). |
| `2`  | البيانات الاعتمادية غير صالحة / ليس لديها وصول. |
| `1`  | خطأ — تعذّر حل المستأجر، أو تعذّر تحميل الشهادة، أو تعذّر كتابة ملف `--export`. |

---

## جميع الخيارات

| الخيار | التأثير |
|------|--------|
| `--tenant` | GUID المستأجر أو النطاق. (أو `SS_TENANT`) |
| `--cloud` | سحابة Azure: `public` (الافتراضي), `usgov` (GCC High), `usdod` (DoD), `china` (21Vianet). يختار سلطة Entra ونقاط نهاية Graph/ARM/Key Vault. الأسماء المستعارة مثل `gov`/`dod`/`commercial` مقبولة. (أو `SS_CLOUD`) |
| `--client-id` | معرّف التطبيق (العميل). (أو `SS_CLIENT_ID`) |
| `--secret` | سر العميل. يُفضَّل استخدام `SS_SECRET` لإبقائه خارج سجل الأوامر. |
| `--cert` | شهادة لمصادقة تأكيد JWT بدلاً من السر: ملف PEM (مفتاح + شهادة) أو `.pfx`/`.p12`. يتطلب `cryptography`. (أو `SS_CERT`) |
| `--cert-password` | كلمة مرور لمفتاح/PFX مشفّر في `--cert`. (أو `SS_CERT_PASSWORD`) |
| `--active` | تعداد قراءة فقط اختياري: عينات كائنات Graph **بالإضافة إلى** قابلية الوصول لمستوى بيانات Key Vault / Storage. مغلق افتراضيًا للبقاء هادئًا. |
| `--deep` | مع `--active`: النزول مستوى واحد داخل Storage القابل للوصول — سرد blobs في الحاويات القابلة للوصول وملفات في المشاركات القابلة للوصول (الأسماء فقط، محدود). أكثر ضجيجًا. |
| `--no-arm` | تخطّي تعداد مجموعات الإدارة / الاشتراكات / RBAC (Graph فقط). |
| `--workers N` | عمال HTTP متوازون لعمليات بحث نطاق ARM وفحوصات مستوى البيانات (الافتراضي 8؛ `1` = تسلسلي). |
| `--update-manifest` | جلب خريطة GUID لاسم appRole الموثوقة من المستأجر المباشر (Graph **بالإضافة إلى** أي واجهات برمجة تطبيقات موارد أخرى تم تعيين هذه البيانات الاعتمادية عليها)، تخزينها مؤقتًا، ثم الخروج. |
| `--json` | طباعة النتيجة المتداخلة الكاملة بصيغة JSON بدلاً من التقرير. |
| `--export PATH` | كتابة النتائج إلى ملف. يُستنتج التنسيق من الامتداد (`.csv` / `.ndjson` / `.jsonl` / `.json` / `.html`). تُكتب الملفات للمالك فقط (`0600`). |
| `--export-format` | فرض تنسيق التصدير (`ndjson` / `csv` / `json` / `html`). |
| `--timeout N` | مهلة كل طلب بالثواني (الافتراضي 20). تستخدم طلبات مستوى التحكم في ARM (تعداد RBAC + اكتشاف Resource Graph) مهلة أطول — `1.5×`, بحد أدنى 30 ثانية — لأنها تعمل بشكل أبطأ. |
| `--verbose`, `-v` | تتبّع كل طلب HTTP في Graph/ARM/مستوى البيانات (الطريقة، URL، الحالة) إلى stderr. |
| `--no-banner` | إخفاء شعار ASCII. |
| `--version` | طباعة الإصدار والخروج. |

---

## تصدير النتائج

`--export` يبسّط النتيجة إلى **سجل واحد لكل شيء مكتشف** —
بيانات اعتمادية، توكن، إذن Graph، تعيين دور تطبيق، دور ARM، إصابة مستوى بيانات
ونتيجة مُقيَّمة — كل منها يحمل سياق البيانات الاعتمادية بحيث يقف الصف
بمفرده.```bash
# NDJSON — stream into a SIEM / log pipeline
python -m secret_stalker --export results.ndjson

# CSV — open in a spreadsheet for triage
python -m secret_stalker --active --export results.csv

# Full nested JSON to a file
python -m secret_stalker --export results.json

يحتوي كل سجل على record_type (credential, secret, token, graph_permission, app_role_assignment, directory_role, owned_object, arm_role, dataplane, delegated_permission, requested_permission, finding)، بحيث يمكن للمستهلك التصفية إلى ما يحتاجه فقط — على سبيل المثال، النتائج المُقيَّمة فقط:```bash jq 'select(.record_type=="finding")' results.ndjson

root@kitploit:~
يعمل تقرير الطرفية و`--export` معًا — لا يُثبِّط التصدير التقرير (رسالة التأكيد "Exported …" تذهب إلى stderr، لذا يبقى تمرير `--json` نظيفًا).

تحمل ملفات التصدير سياق بيانات الاعتماد (مطالبات الرمز token claims، وسرّ `hint`، ومعرّفات المفاتيح)، لذا تُكتب بصلاحيات **المالك فقط (`0600`)** لتجنّب تسرّبها على مضيف مشترك أو متزامن. عاملها كأدلة حساسة من أصول الاختبار. يُرفض الكتابة عبر رابط رمزي (symlink) تمامًا، لذا لا يمكن إعادة توجيه مسار التصدير لاقتطاع شيء آخر.

الأسماء في النتيجة تأتي من المستأجر (tenant) قيد التقييم — أسماء عرض التطبيقات والمجموعات، وأسماء الحاويات والكائنات blob — لذا تُعامل كمخرجات غير موثوقة:

- **CSV** القيم التي قد تُقرأ كصيغة (تبدأ بـ `=` أو `+` أو `-` أو `@`) تُسبَق بعلامة اقتباس مفردة، لذا لا يمكن لاسم عرض مثل `=cmd|' /C calc'!A0` أن يُنفَّذ عند فتح الملف في جدول بيانات. تزيل برامج الجداول علامة الاقتباس عند العرض.
- **Terminal وCSV وHTML** تُجرَّد من أحرف التحكم، لذا لا يمكن لاسم يحمل تسلسلات هروب ANSI أن يعيد تسمية طرفيتك أو يكتب فوق النتائج أعلاه — سواء قرأت التقرير مباشرةً، أو نفّذت `cat` على CSV، أو نفّذت `cat` على HTML.
- **JSON / NDJSON تبقى كما هي بأمانة**: يرمّز `json.dumps` أحرف التحكم بصيغة `\uXXXX`، وهذا خامل كنص بينما يظل المحلِّل قادرًا على استعادة القيمة الدقيقة التي أعادها المستأجر. الاسم الخام هو دليل، لذا يُحفظ هناك.

---

## كيفية تحليل GUIDs الخاصة بالأذونات

تعود `appRoleAssignments` كقيم GUID. يحوّلها secret_stalker إلى أسماء عبر بحث مسطّح (GUIDs الخاصة بـ appRole فريدة عالميًا)، ويستمر هذا في العمل **حتى عندما تُرفض قراءات الدليل**:

- تأتي خريطة اجتهادية لأذونات Graph المعروفة داخل `secret_stalker/data/graph_app_roles.json`.
- يتجاوز `--update-manifest` هذه الخريطة ببيانات موثوقة تُسحب مباشرةً من المستأجر قيد النطاق — Microsoft Graph **بالإضافة إلى كل واجهة برمجة تطبيقات موارد أخرى مُسند إليها هذا الاعتماد** (مثل Exchange Online وSharePoint) — لذا تُحل أيضًا GUIDs غير الخاصة بـ Graph.
- يُعرض أي GUID غير معروف **كما هو ومعلمًا** — لا تخمّن الأداة اسمًا أبدًا.

---

## كيف يعمل (النسخة المختصرة)

- **الصلاحية والأذونات في طلب واحد.** مطالبة `roles` في رمز Graph ناجح *هي* قائمة أذونات التطبيق الممنوحة. يقرأها secret_stalker من الرمز المفوَّك — بسرعة وهدوء، دون الحاجة إلى استدعاءات Graph.
- **Graph ≠ ARM.** هما جمهوران مختلفان للرمز. يمكن لاعتماد أن يملك حقوقًا على أحدهما دون الآخر، لذا يُختبر كل منهما بشكل مستقل.
- **مستوى البيانات ≠ مستوى التحكم.** امتلاك حقوق ARM على Key Vault (إدارة) ليس مثل القدرة على قراءة أسراره (مستوى البيانات). تحت `--active`، تُختبر إمكانية الوصول إلى مستوى البيانات باستخدام جمهور الرمز الخاص بالموارد — ويعرض **أسماء الكائنات فقط**، وليس القيم أو المحتويات أبدًا.
- **اختبار مستوى البيانات لكل سطح.** تُمنح RBAC لمستوى البيانات لكل نوع كائن / خدمة، لذا يُختبر كل منها بشكل مستقل: Key Vault **الأسرار / المفاتيح / الشهادات**، وStorage **blob / ملف / قائمة انتظار / جدول**، وCosmos DB **قواعد البيانات**. أي اعتماد يملك دور `Storage File Data SMB Share Reader` دون أن يكون قارئ blob سيظهر ولن يُغفل عنه. (يستخدم Cosmos ترويسة AAD REST غير قياسية وهو **بأفضل جهد** — تحقق من نتيجة `denied` مقابل حساب حي.)
- **اكتشاف على مستوى المستأجر.** تُعثر الموارد عبر مسح واحد لـ Azure Resource Graph على كل اشتراك يمكن للكيان الرئيسي رؤيته (مع احترام RBAC)، مع العودة إلى سرد الموفّر لكل اشتراك إذا كانت ARG مرفوضة. يضع التقرير علامة على المسار المستخدم (`[discovery: resource-graph]` مقابل `per-subscription`). يتنقل المسح عبر النتائج حتى حد أقصى (40 صفحة × 1000 صف لكل نوع مورد) بحيث ينتهي التشغيل دائمًا؛ ويذكر `--verbose` ذلك إذا تم الوصول إلى الحد.
- **خريطة الخطورة** موجودة في `secret_stalker/risk.py` — عدّلها لضبط ما يعتبره فريقك عالي الأثر.

---

## هيكل المشروع```
secret_stalker/
  clouds.py      Azure cloud endpoint table (public / usgov / usdod / china)
  auth.py        client_credentials flow + tenant discovery + AADSTS decoding
  jwt_utils.py   local JWT claim extraction
  manifest.py    Graph appRole GUID -> name resolution (bundled + live cache)
  graph.py       service principal lookup + appRole resolution + active probes
  arm.py         management-group / subscription RBAC + resource discovery
  dataplane.py   Key Vault / Storage data-plane reachability probes
  risk.py        permission/role/data-plane -> impact mapping (tune this)
  report.py      terminal + JSON output
  export.py      flatten to NDJSON / CSV / JSON records for ingestion
  util.py        shared HTTP (retry/backoff + safe JSON), pmap parallel map,
                 untrusted-output sanitizing
  banner.py      ASCII banner (stderr only)
  cli.py         orchestration
  data/graph_app_roles.json   bundled permission manifest
tests/           pytest suite (run: pytest)
pyproject.toml   packaging + `secret_stalker` console entry point

أبرز ما تم تنفيذه

  • مصادقة بالسر أو الشهادة (--cert) — تأكيد عميل JWT (RS256) من ملف PEM أو PFX، مع الإبلاغ عن انتهاء صلاحية الشهادة. auth.py
  • أدوار دليل Entra التي يملكها الكيان المعني — بما في ذلك الكشف السلبي من حقل wids في الرمز (لا حاجة لقراءة الدليل) — مُقيَّمة حسب الدور. graph.py / risk.py
  • الكائنات المملوكة — تطبيقات/SPs التي تملكها بيانات الاعتماد (نقطة ارتكاز لإضافة بيانات اعتماد). graph.py
  • رؤية الأذونات المفوضة (--active) — المنح المُوافَق عليها + الأذونات المطلوبة، مع الإشارة إلى الأذونات الخطرة غير المُوافَق عليها كأهداف لهجمات الموافقة. graph.py / risk.py
  • سرد مسارات الهجوم + تقرير HTML (--export report.html). risk.py / report.py

أفكار خارطة الطريق

  • قراءة سمات مفاتيح/شهادات Key Vault (مفعّل/منتهي الصلاحية) للفرز — لا تزال بيانات وصفية فقط، بدون مواد المفاتيح.
  • الاطلاع على محتوى قوائم الانتظار/الجداول في Storage سيعني الانتقال إلى قراءة البيانات، لذا فهو خارج النطاق عمدًا لهذه الأداة للقراءة فقط.
تنزيل الأداة
--cloudسلطة EntraMicrosoft GraphARMKey Vault
public (الافتراضي)login.microsoftonline.comgraph.microsoft.commanagement.azure.comvault.azure.net
usgov (GCC High)login.microsoftonline.usgraph.microsoft.usmanagement.usgovcloudapi.netvault.usgovcloudapi.net
usdod (DoD)login.microsoftonline.usdod-graph.microsoft.usmanagement.usgovcloudapi.netvault.usgovcloudapi.net
china (21Vianet)login.chinacloudapi.cnmicrosoftgraph.chinacloudapi.cnmanagement.chinacloudapi.cnvault.azure.cn
  • السحب التجارية والسيادية (--cloud) — العامة، US Gov (GCC High)، US DoD، والصين (21Vianet)، كلٌّ بسلطة Entra الصحيحة وجماهير Graph / ARM / Key Vault. clouds.py
  • اكتشاف الموارد على مستوى المستأجر عبر مسح واحد لـ Azure Resource Graph (يحترم RBAC)، مع احتياط لكل اشتراك واستعادة أحفاد مجموعة الإدارة للاشتراكات التي تتجاهلها القائمة المسطّحة. arm.py
  • تغطية كاملة لمستوى البيانات — أسرار / مفاتيح / شهادات Key Vault، وblob / file / queue / table في Storage، وقواعد بيانات Cosmos DB، كلٌّ يُفحص بشكل مستقل ويُدمج في النتائج المُصنَّفة (البيانات القابلة للوصول هي نتيجة وليست مجرد بيانات وصفية). dataplane.py / risk.py
  • أعداد دقيقة — قوائم مستوى البيانات تتبع رموز الاستمرار (محدودة)، لذا يعكس العدد الظاهر الإجمالي الحقيقي؛ وعلامة + (مثل 25+) تشير إلى أن القائمة حُدّت بسقف بدلاً من الإبلاغ الناقص الصامت. dataplane.py
  • طلبات مرنة تجاه التقييد — مسار HTTP مشترك واحد يعيد المحاولة عند 429/503 مع احترام Retry-After، فلا يُفسَر التقييد المؤقت خطأً على أنه "مرفوض / لا وصول." util.py
  • النزول العميق في Storage (--deep) — يسرد الـ blobs في الحاويات القابلة للوصول والملفات في المشاركات القابلة للوصول، أسماء فقط وبسقف. dataplane.py
  • حل معرّفات GUID غير Graph — --update-manifest يخزّن appRoles مؤقتًا لكل واجهة برمجية للموارد التي تُسند إليها بيانات الاعتماد، وليس Graph فقط. graph.py / manifest.py
  • التزامن (--workers N) عبر عمليات بحث نطاقات ARM وفحوصات مستوى البيانات، مع عزل الأخطاء لكل عنصر. util.py