
تقييم قراءة فقط لبيانات اعتماد التطبيقات في Entra ID: يُعدّ أذونات Graph وAzure RBAC والبيانات السحابية القابلة للوصول، ثم يربط النتائج بمسارات تصعيد الامتيازات والحركة الجانبية.
/ / ______ ___ ___ / /_ / / / /__ _ / / /_____ ____ \ / -) / -) -)/ / \ \ / __/ _ `// / '/ -) / //_/_/_/_/ _/ // _/_,////_\__/_/
╔╦╦╬╬╬╬╬╬╦╦╗
╔╬╬╬╝╝┘ ╚╝╝╬╬╬┐
╬╬╝╚╩╬╗╔ ╚╬╬╬
╬╝ ╚╬╬╗╗ ╔ ╚╬╗ ╬╬ ╔╗ ╚╬╬╬╬╬╬╦ ╬╬ 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. \
**ما الذي يمكن أن يفعله معرّف عميل 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 ''
`--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
python -m secret_stalker ... --cert app.pfx --cert-password ''
يتطلب مصادقة الشهادة حزمة `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 ...
--cloud | سلطة Entra | Microsoft Graph | ARM | Key Vault |
|---|---|---|---|---|
public (الافتراضي) | login.microsoftonline.com | graph.microsoft.com | management.azure.com | vault.azure.net |
usgov (GCC High) | login.microsoftonline.us | graph.microsoft.us | management.usgovcloudapi.net | vault.usgovcloudapi.net |
usdod (DoD) | login.microsoftonline.us | dod-graph.microsoft.us | management.usgovcloudapi.net | vault.usgovcloudapi.net |
china (21Vianet) | login.chinacloudapi.cn | microsoftgraph.chinacloudapi.cn | management.chinacloudapi.cn | vault.azure.cn |
الأسماء المستعارة مثل gov وdod وcommercial وgcc-high و21vianet مقبولة.
(إن audience الخاص بمستوى البيانات في Storage، storage.azure.com، هو نفسه في كل سحابة.)
يُجري المصادقة، ويخزّن خريطة appRole الخاصة بـ Graph للمستأجر مؤقتًا في
~/.secret_stalker/app_roles_cache.json، ثم يخرج. تخطَّ هذه الخطوة إذا كانت
بيانات الاعتماد غير قادرة على قراءة كيانات الخدمة — فما زالت الخريطة المرفقة تغطي
الأذونات المعروفة.
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)
OK graph OK arm NO storage — no storage token