
وحدة تحكم مركزية لمجمعات Douglas-042 HEADQUARTERS. تمسح أسطولاً، وتربط النتائج عبر المضيفين، وتدير موجزات IOC وتسليم SIEM من مكان واحد.
امسح أسطولاً من مضيفات Windows وLinux بحثاً عن علامات الاختراق، وحدّد ما يهم فعلاً، وتصرّف بناءً عليه — من وحدة تحكم واحدة، بأمر واحد لكل مضيف.
عملية الاصطياد ليست مجرد فحص. يجمع Douglas الآثار التي يجمعها المحلل يدوياً — العمليات، والخدمات، والمهام المجدولة، وبرامج التشغيل التلقائي، والاتصالات، والحسابات، والتعريفات (drivers)، وسجلات الأحداث، وcron، وsystemd، وسجل الأوامر (shell history)، وجذور الويب — ويشغّل 201 كشفاً مدمجاً عليها، إضافة إلى قواعد Sigma وYARA والقواعد المخصصة الخاصة بك.
ثم يقوم بالأجزاء التي تتركها معظم الأدوات لك: يخبرك بالنتائج التي لا تزال بحاجة إلى قرار، وأي من العناوين الخارجية الستين يجب النظر إليه أولاً، ويتيح لك اتخاذ إجراء بشأنها دون فتح جلسة RDP.
deploy one command ──▶ hunt ──▶ findings appear live
│
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
IOC feed match reputation score response actions
"this is a known C2" "92/100, 340 reports" isolate · kill · collect
غالباً ما تكون البيئات الأكثر حاجة إلى الاصطياد هي تلك التي تفتقر إلى EDR: بضع عشرات من الخوادم، وميزانية لا تسمح بوكيل، وحادث بدأ قبل ثلاثة أيام. عادةً ما يكون الخيار بين منصة تجارية لم يوافق عليها أحد ومجلد من سكربتات PowerShell يشغّلها شخص يدوياً.
يقع Douglas بينهما. لا شيء يُثبَّت على المضيف الذي تحقّق منه — يعمل المُجمِّع (collector) مرة واحدة ثم يخرج — وكل نتيجة تصل إلى وحدة تحكم واحدة يمكنك تسليمها لمن يتولى الحادث بعدك.
إنتاج النتائج سهل، وقراءتها مكلفة. هذه الشاشة موجودة لإبقاء قائمة الانتظار قصيرة بما يكفي ليبقى أحدهم يقرأها في الجولة الثالثة.
ثلاث نتائج، والفرق بينها يهم بعد ستة أشهر:
| القرار | ما الذي يفعله |
|---|---|
| مؤكَّد | حقيقي. يبقى في درجة المخاطر، ويبقى المضيف أحمر. |
| إيجابية كاذبة | يُسقَط من الدرجة لهذا المضيف فقط. |
| كبت (Suppression) | قاعدة دائمة تخفي نفس النتيجة في كل فحص مستقبلي. |
لا شيء يُحذف أبداً. اسحب قاعدة كبت وسيعود كل ما أخفته. تقع أكثر القواعد إزعاجاً في الأسفل لأن ضبطها يفرّغ قائمة الانتظار أسرع من العمل عليها نتيجة تلو الأخرى.
جميع الكشوفات الـ201 مجمّعة في 15 فئة — قابلة للتبديل واحدة تلو الأخرى أو فئة كاملة دفعة واحدة. انقر على أي قاعدة لقراءة ما تفحصه، وكيف تُطلَق بشكل مشروع، وما الذي يجب فعله بعد ذلك.
التمييز الذي توضحه الشاشة، لأن الخطأ فيه شائع:
إيقاف قاعدة ليس مثل كبتها. الإيقاف يعني أن المُجمِّع لا يشغّل الفحص أبداً — لا شيء يُنتَج ولا شيء للمراجعة. أما الكبت فيسجّل النتيجة ويضع عليها علامة قرار اتخذه أحدهم، مع سبب مرفق.
استخدم الإيقاف لفئة من الضجيج تقبّلتها. واستخدم الكبت لنمط محدد على مضيف محدد.
الشرطة تحت Fired هي عادةً الإجابة السليمة: DGL-014 لا يُطلَق إلا عندما يبدو سجل قد مُسح. القائمة هي ما تفحصه الأداة، وليست ما هو خطأ.
النموذج أسرع لقاعدتك الأولى وأبطأ لقاعدتك العشرين. لذا يمكن أيضاً كتابة القواعد كنص — تُفحَص أثناء الكتابة، مقابل 11 جدول آثار و13 معاملاً.
الصندوق بالأسفل يقوم بمهمتين. عندما تكون القاعدة خاطئة يسمّي السطر، لا القاعدة:
line 7: Condition 1: 'is_maybe' is not an operator.
وعندما تكون صحيحة، يقول ما الذي ستطابقه القاعدة فعلاً — لأن قاعدة تُجيز التحقق ثم تطابق شيئاً غير ما قصده كاتبها هي الفشل الجدير بالالتقاط:
Valid — ACME-001 Reads Services and matches when Signed is false and PathName does not contain 'Program Files' and PathName does not contain 'System32'
استيراد وتصدير بصيغ JSON أو YAML أو CSV. الذهاب والإياب مضمون — تصديرنا الخاص يجتاز المدقّق الخاص بنا في الصيغ الثلاث جميعها.
| السؤال | متى | النتيجة | |
|---|---|---|---|
| خلاصة IOC | هل يوجد أي شيء من قائمة C2 هذه على مضيفاتي؟ |
خمسة عشر مصدر خلاصة تأتي جاهزة للاستخدام — Feodo وThreatFox وURLhaus وTweetFeed وUSOM وSSL Blacklist وEmerging Threats وOpenPhish وMISP — إضافة إلى خلاصة مخصصة تقرأ أي URL يُعيد بيانات على شكل مؤشرات.
أربعة مزوّدي سمعة: AbuseIPDB وVirusTotal وThreatFox (الطبقات المجانية) وGreyNoise (مدفوع، معطّل افتراضياً). لا تُدمج الأحكام أبداً في رقم واحد — AbuseIPDB يعدّ الشكاوى، وVirusTotal يعدّ المحرّكات، وThreatFox يعرف البنية التحتية، ومتوسط هذه الأرقام رقم لا يدافع عنه أي منهم. تُظهر الشارة أسوأ حكم مع المزوّد الذي أصدره.
الطبقات المجانية محمية: النتائج مخزّنة مؤقتاً 12 ساعة، و40 عنواناً لكل تشغيل، وعدّاد يومي يتوقف قبل أن يتوقف المزوّد. لا تُرسَل العناوين الخاصة أبداً.
أحد عشر إجراءً في ثلاث مجموعات — انظر، تصرّف، احتوِ. الإجراءات الخمسة للقراءة فقط موسومة بشكل مختلف عن الستة التي تغيّر المضيف، وكل إجراء مُعدِّل يتطلب سبباً مكتوباً.
العزل يبقي وحدة التحكم قابلة للوصول عن قصد: المضيف المقطوع عن وكيله
الخاص لا يمكن تحريره عن بُعد، وسيضطر أحدهم إلى المشي إليه. الأهداف التي
ستُعطّل الجهاز بدلاً من احتواء الاختراق — lsass.exe وsystemd وpid 1
وAdministrator و/bin/bash — تُرفض، لا يُحذَّر منها، لأن اللحظة التي
يُستخدم فيها هذا هي اللحظة التي لا يقرأ فيها أحد التحذيرات.
تعود المخرجات كبطاقات منظّمة بدلاً من تفريغ طرفية، والصفوف قابلة للتنفيذ: قائمة العمليات فيها زر Kill لكل صف، والعنوان فيه Reputation.
| Windows | Linux | |
|---|---|---|
| Sigma | Event Log + Sysmon | auditd execve + auth/cron/syslog |
| YARA | محتوى الملف | محتوى الملف |
قواعد Sigma على Linux التي لا يمكن قراءة مصدر سجلها تُرفض عند الرفع مع سبب، بدلاً من تحميلها وتركها لا تُطلَق أبداً — نتيجة فارغة من قاعدة لم تستطع العمل تبدو تماماً مثل مضيف نظيف.
يتحقق وكيل Linux مما إذا كان auditd مثبّتاً، ويعمل، ولديه قواعد
محمّلة، ثم يقول ما المفقود وما تكلفته:
Detection capabilities on this host
auditd : NOT RUNNING
Nothing records what executes on this host, so execution
rules cannot fire and a clean result only means the sweep
could not look. Install it:
apt install auditd && systemctl enable --now auditd
أحد عشر وجهة في ثلاث مجموعات:
وجهات الدردشة والتنبيه تعرض جملة بدلاً من سجل، وتحدّد سقفاً لعدد النتائج في رسالة واحدة: القناة التي يُلصق فيها مئة سطر هي قناة يكتمها الناس.
git clone https://github.com/YOURNAME/douglas-042.git
cd douglas-042
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8000
أو باستخدام Docker:
docker compose up -d
تسجيل الدخول الافتراضي
اسم المستخدم:
adminكلمة المرور:douglasتفرض وحدة التحكم تغيير كلمة المرور عند أول تسجيل دخول — إذ يجب ألا يبقى افتراضي مضمّن في حزمة دون أن يُلاحَظ. عيّن
DOUGLAS_CONSOLE_PASSWORDفي.envقبل أول تشغيل إن كنت تفضّل اختيار كلمتك الخاصة.لا يُقرأ
.envإلا عندما تكون قاعدة البيانات فارغة. بعد أول تشغيل، أعد التعيين باستخدامpython3 -m app.manage passwd admin.
عند بدء التشغيل تحصل على رمز التسجيل (enrolment token) للخطوة التالية:
Created the initial admin account: admin
The default password is still in use. Change it at first sign-in.
Enrollment token ready: dgl-enroll-xBAk8...
Douglas-042 console 1.0 ready
Deploy → اختر المنصة → انسخ أمراً واحداً.
Windows — PowerShell بصلاحيات مرتفعة:
iex (irm 'http://console:8000/api/v1/reports/deploy/script?token=YOUR_TOKEN')
Linux — كـroot:
curl -sSL 'http://console:8000/api/v1/reports/deploy/script?token=YOUR_TOKEN&platform=linux' | sudo bash
تتدفق ست خطوات في الطرفية: التنزيل، والتسجيل، وجلب المُجمِّع، وتثبيت الخدمة، والتأكد من أنها حيّة، وأول تسجيل وصول. إذا فشل التسجيل، لا شيء يُثبَّت، ويقول ذلك صراحةً.
┌──────────────────────────────────────────────────────────┐
│ Console — FastAPI + SQLite, one process, no queue │
│ triage · findings · graph · rules · response · reports │
└───────────────▲──────────────────────────────────────────┘
│ agents poll: heartbeat 20s, actions 5s
┌───────────────┴──────────────────────────────────────────┐
│ Agent (PowerShell / shell) │
│ └── Collector — runs, reports, exits │
│ 201 built-in rules + Sigma + YARA + your rules │
└──────────────────────────────────────────────────────────┘
Dashboard · Cases · Fleet · Hunts · Response · Findings · Triage · Frequency · Graph · MITRE matrix · Timeline · Diff · Built-in rules · My rules · Sigma · YARA · IOC feeds · Threat intel · Integrations · Schedules · Users · Deploy · Logs & events
سلامة الجمع · برامج التشغيل التلقائي وبدء التشغيل · العمليات والشبكة · الخدمات والمهام · آليات الاستمرارية · الوضع الأمني · التعريفات والنواة · أدلة التنفيذ · المصادقة والحسابات · الوصول عن بُعد · Sysmon وKerberos وAD · الملفات وأصداف الويب والتسريب · نشاط المستخدم والثقة · Rootkit والذاكرة · مطابقات المؤشرات
كلاهما: الحسابات والمجموعات المحلية · العمليات الجارية مع التوقيعات والتجزئات · اتصالات TCP والنقاط الطرفية الخارجية · الخدمات · الملفات المكتوبة حديثاً · الكود في الذاكرة · جذور الويب وأنماط أصداف الويب
Windows: سجلات الأحداث · المهام المجدولة · برامج التشغيل التلقائي · استمرارية السجل (registry) · اشتراكات WMI · التعريفات · مشاركات SMB · Prefetch · مخازن الشهادات
Linux: cron · وحدات systemd · ملفات بدء تشغيل الصدفة · LD_PRELOAD · ثنائيات setuid · authorized_keys وإعدادات sshd · سجل الأوامر · سجلات المصادقة · تلوّث النواة · WordPress
وحدة التحكم: Python 3.11+، وست تبعيات (FastAPI، uvicorn، SQLAlchemy، pydantic، python-multipart، PyYAML). تعمل على جهاز افتراضي بسعة 1 GB.
مضيفات Windows: PowerShell 5.1+، ومسؤول. لا شيء غير ذلك.
مضيفات Linux: bash وcurl. يُمكّن python3 التقدم المباشر وقواعد محتوى
الملفات؛ ويُمكّن auditd كشوفات التنفيذ. تخبرك وحدة التحكم أيها مفقود على
أي مضيف.
0600 — المفتاح الثابت
المضمّن في حزمة سيتشاركه كل من نزّلها.📄 التقرير التقني (PDF) — 14 صفحة تغطي البنية المعمارية، وكل شاشة في وحدة التحكم، وجميع وحدات المُجمِّع الـ37، ونموذج الكشف، وإجراءات الاستجابة، والنموذج الأمني.
مرخّص بموجب رخصة MIT. انظر LICENSE.
| أثناء الاصطياد |
DGL-IOC — مطابقة مؤكدة، وليست درجة |
| الإثراء (Enrichment) | تحدّث هذا المضيف إلى 60 عنواناً — أيها أولاً؟ | بعد الاصطياد | 92/100، 340 تقريراً، C2 معروف لـCobalt Strike |
| # | الشاشة | افعل هذا | تحصل على |
|---|
| 1 | IOC feeds | أضف Feodo Tracker، واضغط Refresh | كشف C2 — دون قاعدة تكتبها |
| 2 | Threat intel | الصق مفتاح AbuseIPDB مجاني، واضغط Test | ترتيب الفرز على الرسم البياني |
| 3 | Fleet | اختر مضيفاً، وابدأ الاصطياد | نتائج، مباشرةً |
| 4 | Logs & events | ابحث عن أخطاء الوحدات | ما إذا كان المسح استطاع النظر فعلاً |
| 5 | Triage | اعمل على قائمة الانتظار، واضبط أكثر القواعد إزعاجاً | قائمة لا يزال أحدهم يقرأها |
| 6 | My rules | حمّل الأمثلة الستة، وافتح واحداً | كيف تكتب قاعدتك الخاصة |
| 7 | Integrations | Slack webhook، بحد أدنى HIGH | تسمع عنها دون مراقبة |