
في الأصل مصيدة (Honeypot) لـ CVE-2026-20131
honeypot منخفض التفاعل يحاكي واجهة الويب الخاصة بـ Cisco Secure Firewall Management Center (FMC) ويلتقط حركة مرور هجوم غير مصادَق عليها بنمط إلغاء تسلسل Java (استكشافات إلغاء تسلسل غير آمن بنمط CVE).
\xac\xed\x00\x05 (وBase64 rO0AB…) ويستخرج سلاسل أوامر shell أو عناوين URL باستخدام التعبيرات النمطية والاستدلالات.requests إلى وحدة تخزين تنزيلات غير قابلة للتنفيذ.سجلات JSON أحادية السطر (متوافقة مع Splunk وELK)، وتنبيهات Telegram اختيارية، وقطع أثرية مُجزّأة للمرحلة الثانية، ومستخدم حاوية غير جذر. المشروع موجه للباحثين الذين يحتاجون إلى فخ بنمط FMC مركّز دون كود تكامل إضافي.
| العنصر | ملاحظات |
|---|---|
| Docker وDocker Compose الإصدار 2 | ثبّت Docker |
| VPS أو مضيف | يُنصح بقطاع شبكة مخصص أو معزول |
| نطاق (اختياري) | لـ HTTPS: اضبط DNS واسمح بدخول TCP 80 وTCP 443 إلى المضيف |
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
cp .env.example .env
عدّل .env حسب الحاجة (انظر متغيرات البيئة). بالنسبة لعمليات النشر خلف Caddy المرفق، اضبط TRUST_X_FORWARDED_FOR=1 بحيث تعكس عناوين IP الخاصة بالعملاء في السجلات هوية العميل الأصلي.
عدّل Caddyfile: استبدل أسماء المضيفات النائبة بنطاقك الخاص (وwww إذا كان ذلك مناسباً):
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
بشكل اختياري، أزل التعليق عن الكتلة العامة email [email protected] في Caddyfile لإشعارات انتهاء صلاحية Let’s Encrypt.
yourdomain.com إلى عنوان IP العام لخادمك، و**www** إذا كان مستخدَماً.ufw allow 80,443/tcp).يعمل التطبيق بمعرّف المستخدم UID 10001 داخل الحاوية. يجب أن يكون دليل ./data المثبّت عبر bind قابلاً للكتابة:
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
بدون الملكية الصحيحة، قد تُرجع طلبات POST الاستغلالية 500 (Permission denied عند كتابة السجلات أو البيانات الخام).
docker compose up -d --build
docker compose ps
curl -sI https://yourdomain.com/
توقّع HTTP/2 200 (أو 301 أو 302) و**Via: Caddy**. في المتصفح، يجب أن تعرض https://yourdomain.com/ صفحة تسجيل دخول FMC المحاكاة.
لمعرفة أين تقرأ الأحداث والحمولات ومخرجات Docker، راجع العثور على السجلات والتنزيلات ومخرجات الخدمة والعمليات الشائعة.
كل ما يلي مرتبط بدليل مشروعك (المجلد الذي يحتوي على docker-compose.yml، وعادةً FMC-Trap بعد الاستنساخ). المسارات على المضيف؛ يقوم Docker بتثبيتها عبر bind داخل الحاوية.
عندما يظهر شيء ما في ملف السجل: يتلقى fmc-trap.json كائن JSON واحداً لكل سطر عندما يطابق الطلب سلوك استكشاف إلغاء التسلسل (بايتات سحرية في POST). طلبات GET العادية إلى صفحة تسجيل الدخول المزيفة لا تُكتب في هذا الملف افتراضياً.
عندما يحتوي مجلد التنزيلات على ملفات: تظهر الإدخالات فقط إذا استخرج خط المعالجة عنوان URL من استكشاف ونجح الحاصد في جلب محتوى بعيد مسموح به ضمن MAX_DOWNLOAD_MB. إذا بقي الدليل فارغاً، فقد لا توجد عناوين URL مؤهلة بعد، أو قد تكون عمليات الجلب محجوبة بسياسة في التطبيق.
طباعة JSON بتنسيق مقروء (اختياري): لسطر واحد، مرّره عبر python -m json.tool أو استخدم jq إذا كان مثبتاً.
Internet :443/:80 → Caddy (TLS, Let’s Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (bind mounts)
expose: "5000" في Compose).يمرر Compose هذه المتغيرات إلى خدمة fmc-trap؛ راجع docker-compose.yml للتفاصيل.
كل سطر في data/logs/fmc-trap.json هو كائن JSON واحد. تشمل المفاتيح الشائعة timestamp وevent_type وsrc_ip وheaders وraw_payload_hash وextracted_commands وdownloaded_file_hash عند تخزين ملف. تستخدم البيانات المحفوظة تحت data/downloads/ الوضع 0400 (للقراءة فقط للمالك).
للوصول إلى Gunicorn مباشرة دون Caddy، أضف ما يلي تحت fmc-trap في docker-compose.yml:
ports:
- "127.0.0.1:5000:5000"
لا تربط التطبيق بـ0.0.0.0 في الإنتاج عندما ينهي Caddy بروتوكول TLS.
.env على المضيف (لا ترفع .env أبداً إلى المستودع).انشر فقط على أنظمة تملكها أو مُصرّح لك صراحةً بنشر أدوات المراقبة عليها. قد تجمع honeypots حركة الهجوم والبرمجيات الخبيثة؛ التزم بالقانون المعمول به وبسياسة المؤسسة. هذا البرنامج مخصص لأبحاث الأمن.
| ماذا | مسار المضيف | كيف تفتحه أو تتابعه |
|---|
| سجل الأحداث (سطور JSON) | data/logs/fmc-trap.json | tail -f data/logs/fmc-trap.json (بث مباشر)، أو افتحه في محرر، أو أدخله إلى Splunk أو ELK |
| حمولات المرحلة الثانية المُنجزة | data/downloads/ | تظهر الملفات فقط عندما يحفظ الحاصد استجابة بعيدة؛ يُسمّى كل ملف بمجمّع SHA256 الخاص به (64 حرفاً سداسياً عشرياً)، بدون امتداد. ادرجها باستخدام ls -la data/downloads (Linux أو macOS) أو Get-ChildItem data\downloads (Windows PowerShell) |
| مخرجات عملية التطبيق | ليس ملفاً؛ Docker | docker compose logs -f fmc-trap |
| Caddy (TLS، وكيل، ACME) | ليس ملفاً؛ Docker | docker compose logs -f caddy |
| تنبيهات Telegram (اختيارية) | غير مخزنة في data/ | اضبط TELEGRAM_BOT_TOKEN وTELEGRAM_CHAT_ID في .env؛ تُطلق التنبيهات عند تسجيل الأحداث |
| الهدف | الأمر أو الإجراء |
|---|
| معرفة ما إذا كانت الحاويات تعمل | docker compose ps |
إعادة التشغيل بعد تعديل .env أو Caddyfile | docker compose up -d --build (أو docker compose up -d --force-recreate إذا تغيّرت البيئة فقط) |
| إيقاف الحزمة | docker compose down |
| متابعة أحداث JSON الجديدة باستمرار | tail -f data/logs/fmc-trap.json |
| فحص آخر الأحداث | tail -n 50 data/logs/fmc-trap.json |
| عدّ القطع الأثرية المُنجزة | افتح data/downloads في مدير الملفات، أو استخدم عدّ الملفات عبر القشرة على ذلك الدليل (تُسمّى الملفات حسب SHA256) |
| تأكيد تحميل صفحة honeypot | افتح https://yourdomain.com/ في متصفح أو استخدم curl -sI كما في خطوة التحقق |
| المتغير | الغرض | الافتراضي / ملاحظة |
|---|
TRUST_X_FORWARDED_FOR | استخدام أول قفزة من X-Forwarded-For كـsrc_ip | يُنصح بـ**1** مع Caddy |
DECEPTION_STATUS | 200 يُرجع نص HTML؛ 302 يُرجع إعادة توجيه | 200 |
DECEPTION_REDIRECT_URL | المسار الهدف عندما تكون الحالة 302 | / |
MAX_DOWNLOAD_MB | حد الحاصد لكل عنوان URL | 16 |
TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID | تنبيهات اختيارية | فارغ يعطّل التنبيهات |
FMC_SERVER_HEADER | ترويسة استجابة Server | nginx |
VT_API_KEY | محجوز | اختياري |
| العَرَض | الحل |
|---|
Permission denied عند الكتابة تحت data/ | شغّل sudo chown -R 10001:10001 data/logs data/downloads |
Bind for 0.0.0.0:80 failed: port is already allocated | خدمة أو حاوية أخرى مرتبطة بالمنفذ 80. أوقف تلك الخدمة أو حرّر 80؛ يمكن لعملية واحدة فقط الاستماع على 80 لكل مضيف. |
| أخطاء Let’s Encrypt أو ACME في سجلات Caddy | تأكد من أن DNS يحل إلى هذا الخادم وأن 80 و443 قابلان للوصول من الإنترنت. يهيئ Compose DNS 1.1.1.1 و8.8.8.8 لـCaddy عندما يفشل محلل المضيف داخل Docker. |
curl إلى HTTPS يُرجع إخراجاً فارغاً أو يفشل في المحاولة الأولى | انتظر حتى تظهر عبارة تم الحصول على الشهادة بنجاح في docker compose logs caddy. |
عنوان IP الخاص بالعميل في السجلات هو 172.x.x.x | اضبط TRUST_X_FORWARDED_FOR=1 عند استخدام Caddy، ثم أعد إنشاء الحاويات: docker compose up -d --force-recreate. |