
هذا المشروع يستكشف ما إذا كان OpenSSH الحديث يكشف عن أسماء مستخدمين صالحة من خلال اختلافات دقيقة في الاستجابة أو التوقيت. تحقيق في تعداد المستخدمين CVE-2016-6210 (اختبار t الخاص بـ Welch، ومعامل d لكوهين، وهندسة الكشف) على مختبر مُتحكم به على Ubuntu 22.04.5 LTS، كما يفحص الآثار التي تتركها هذه المحاولات وكيف يمكن اكتشافها.
إعادة تحقيق قابلة للتكرار لاستخراج أسماء المستخدمين في OpenSSH باستخدام التحليل الإحصائي.
يعيد هذا المشروع تحقيق CVE-2016-6210، وهو قناة جانبية زمنية موثقة في OpenSSH، لتحديد ما إذا كانت لا تزال قابلة للملاحظة على خادم Ubuntu حديث باستخدام تكوين PAM الافتراضي.
بدلاً من افتراض أن السلوك المنشور لا يزال ساريًا، يقوم المشروع بتقييم قياسات توقيت المصادقة التي تم جمعها من خلال الاستكشاف اليدوي و Hydra و Metasploit باستخدام اختبار t الخاص بـ Welch و Cohen's d لتمييز إشارات التوقيت الحقيقية عن ضوضاء القياس.
وجدت الدراسة عدم وجود فرق زمني ذي دلالة إحصائية على التكوين الافتراضي المختبر، مما يوضح قيمة التجارب القابلة للتكرار والتحقق القائم على الأدلة من ادعاءات الأمان المنشورة.
⚠️ إشعار قانوني
تم إجراء هذا المشروع بالكامل ضمن بيئة معملية معزولة ومملوكة ذاتيًا. تنطبق جميع النتائج فقط على التكوين المختبر. لا تختبر أبدًا أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
استخراج أسماء المستخدمين - القدرة على تحديد ما إذا كان اسم مستخدم معين موجودًا على نظام بعيد دون بيانات اعتماد صالحة. إنها خطوة أولى حاسمة في سلسلة الهجوم المؤدية إلى اختراق الحساب:``` Reconnaissance → [User Enumeration] → Password Attack → Access ↑ This project investigates here
إذا تمكن المهاجم من التمييز بين "هذا المستخدم موجود" و"هذا المستخدم غير موجود" من خلال تحليل استجابات الخادم، فيمكنه تقليص فضاء المفاتيح بشكل كبير لهجمات القوة العمياء أو حشو بيانات الاعتماد اللاحقة.
بروتوكول SSH هو هدف متكرر لأنه معرّض للجميع تقريبًا، ويتعامل مع مصادقة كلمة المرور، وكانت الإصدارات الأقدم تحتوي على فروق زمنية قابلة للقياس بين أسماء المستخدمين الصالحة وغير الصالحة (CVE-2016-6210).
**هذا التحقيق يطرح سؤالين:**
1. هل OpenSSH الحديث على Ubuntu 22.04.5 LTS مع الإعدادات الافتراضية يتسرب وجود اسم المستخدم
عبر رسائل الاستجابة، التوقيت، أو الإشارات التي يُبلغ عنها بواسطة الأدوات؟
2. إذا حاول المهاجم ذلك بغض النظر، فما هي الآثار التي يتركها؟ وبأي درجة من الموثوقية يمكن اكتشافها؟
---
## 🖥️ الإعداد المختبري
تم إجراء جميع الاختبارات على شبكة افتراضية معزولة كليًا (host-only) دون تعرض للإنترنت.
| الآلة | نظام التشغيل | الدور | عنوان IP | إصدار SSH |
|----------|---------------------------|-----------------------------------------|------------------|------------------|
| المهاجم | Kali Linux 2024.1 | أدوات هجومية، نصوص تحليلية | 192.168.56.5 | — |
| الهدف | Ubuntu Server 22.04.5 LTS | تشغيل OpenSSH مع إعدادات **افتراضية** | 192.168.56.10 | OpenSSH 8.9p1 |
**إعداد SSH الهدف (`/etc/ssh/sshd_config` الإعدادات الافتراضية):**```
PasswordAuthentication yes
UsePAM yes # Key setting — normalises timing via dummy hash
PermitRootLogin prohibit-password
MaxAuthTries 6
LogLevel INFO
UsePAM yes هو إعداد التعزيز الحرج. فهو يُجبر OpenSSH على إجراء حساب bcrypt وهمي للمستخدمين غير الموجودين، ليتوافق مع توقيت فحص كلمة المرور الحقيقي.
تم تقديم هذا تحديدًا كإجراء مضاد لـ CVE-2016-6210.
تم تنفيذ كل أسلوب هجوم كتجربة مستقلة مع حالة سجل نظيفة:```bash
sudo truncate -s 0 /var/log/auth.log
sudo cp /var/log/auth.log ~/evidence/trial-N-auth.log
الأدلة التي تم جمعها لكل تجربة:
- stdout/stderr للأداة (محفوظ حرفيًا)
- `/var/log/auth.log` من الهدف
- عينات توقيت الاستجابة عبر `time.perf_counter()` في `manual_ssh.py`
- لافتة SSH التي تم الحصول عليها قبل أي محاولة مصادقة
### طرق الهجوم
| الطريقة | الأداة | قائمة الكلمات | الغرض |
|---------|--------|--------------|--------|
| SSH اليدوي | `ssh` CLI + Paramiko | 50 اسم مستخدم شائع | خط الأساس؛ فحص الردود الأولية |
| القوة الغاشمة باستخدام Hydra | `hydra` | نفس الـ 50 | آلي؛ يستخدم وضع التعداد المدمج في Hydra |
| وحدة Metasploit | `auxiliary/scanner/ssh/ssh_enumuser` | نفس الـ 50 | وحدة التعداد المخصصة للإطار |
| بصمة اللافتة | `BannerFingerprinter` مخصص | غير متاح | تسريب الإصدار بدون مصادقة، فحص CVE |
| تحليل التوقيت | `ResponseAnalyzer` مخصص | مجموعة فرعية صالحة مقابل غير صالحة | فحص قناة جانبية إحصائية |
---
## ما تم بناؤه
يتجاوز هذا المشروع مجرد تشغيل الأدوات — فهو يغلف كل هجوم وكل منطق الكشف في قاعدة أكواد Python منظمة ويوفر منسقًا يقوم بتشغيل خط الأنابيب بالكامل من البداية إلى النهاية.
### أدوات الهجوم (`src/attack_tools/`)
**`ManualSSHEnumerator`** — يختبر كل اسم مستخدم N مرة باستخدام `paramiko`، مسجلاً التوقيت الدقيق ونوع النتيجة ولافتة SSH. يحسب المتوسط/الانحراف المعياري لكل اسم مستخدم. والأهم من ذلك أنه **لا** يعيد استخدام الاتصالات بين المحاولات، مما يضمن أن كل عينة تلتقط وقت المعالجة الكامل من جانب الخادم.
**`BannerFingerprinter`** — يحصل على لافتة SSH عبر مأخذ TCP خام (لا حاجة لبيانات الاعتماد). يحلل اسم التطبيق وسلسلة الإصدار وتلميح نظام التشغيل. يقارن مع سجل CVE محلي. يكشف إصدار مثل `OpenSSH_8.9p1 Ubuntu-3ubuntu0.6` عن برنامج الخادم بالضبط — قد يكون كافيًا لتحديد الثغرات المعروفة قبل محاولة أي مصادقة.
**`HydraAutomation`** — غلاف عملية فرعية حول Hydra. يحلل stdout لاستخراج عمليات تسجيل الدخول الناجحة ورسائل الخطأ وحكم التعداد الخاص بـ Hydra (`لا يدعم تعداد المستخدم`).
**`MetasploitScanner`** — يكتب سكريبت مورد مؤقت ويقود `msfconsole` عبر عملية فرعية. يحلل المخرجات للكشف عن التحصين وأي أسماء مستخدمين تم العثور عليها.
### أدوات الكشف (`src/detection_tools/`)
**`LogParser`** — محلل auth.log يعتمد على التعبيرات النمطية يدعم خمسة أنواع من أحداث SSH: `failed_invalid_user`، `failed_valid_user`، `pre_auth_reject`، `accepted`، `disconnected`. يُرجع قواميس أحداث منظمة مع الطابع الزمني ونوع الحدث واسم المستخدم وعنوان IP المصدر والمنفذ.
**`ResponseAnalyzer`** — يقوم باختبار t الخاص بـ Welch على توزيعات التوقيت من أسماء المستخدمين الصالحة مقابل غير الصالحة. يحسب فرق التوقيت (مللي ثانية) وقيمة p وحجم تأثير Cohen's d واستنتاج بلغة بسيطة. العتبة: فرق ≥ 5 مللي ثانية و p < 0.05 يؤدي إلى تحذير قناة جانبية.
**`EnumerationDetector`** — أربعة أنماط كشف:
- **استقصاءات المستخدم السريعة**: نافذة منزلقة - نفس عنوان IP، ≥10 أسماء مستخدمين مميزة خلال 60 ثانية
- **ارتباط قائمة الكلمات**: معدل المطابقة بين أسماء المستخدمين التي تمت محاولتها وقوائم الهجوم المعروفة
- **التوقيت التسلسلي**: معامل الاختلاف على الفجوات بين المحاولات (CoV منخفض → أداة)
- **الاستقصاء الموزع**: نفس اسم المستخدم من عناوين IP متعددة (استطلاع حشو بيانات الاعتماد)
**`AlertingSystem`** — باعث تنبيهات خفيف الوزن. يُنشئ تنبيهات JSON ذات طابع زمني إلى stdout. يمكن توسيعه بتكاملات البريد الإلكتروني/SIEM/webhook حسب الحاجة.
### المنسق
**`run_investigation.py`** — مشغل CLI يقوم بتشغيل جميع المراحل الأربع بالتسلسل ويكتب النتائج إلى `data/results/`. قم بتشغيله مع `--help` للحصول على الاستخدام الكامل.```bash
python run_investigation.py \
-target 192.168.xx.xxxx \
-usernames data/wordlists/common-usernames-50.txt \
-log data/sample-logs/auth.log \
-known-valid root ubuntu \
-samples 10
الفرضية المختبرة: هل يُرجع OpenSSH رسالة خطأ مختلفة لاسم مستخدم غير موجود مقارنةً باسم مستخدم موجود مع كلمة مرور خاطئة؟```bash
$ ssh [email protected] Permission denied (publickey,password).
$ ssh [email protected] Permission denied (publickey,password).
**النتيجة:** الاستجابات متطابقة بايتًا ببايت. البروتوكول لا يُسرب أي شيء.
**السبب:** منذ OpenSSH 7.3، يفرض `UsePAM yes` على الخادم تنفيذ عملية `crypt()` وهمية للمستخدمين غير الموجودين، مما يطابق توقيت ومسار الخطأ لعملية مصادقة فاشلة حقيقية. كان الإصلاح استجابة مباشرة لـ CVE-2016-6210.
---
### الاكتشاف 2: لم يتم اكتشاف قناة جانبية زمنية