
منصة التقاط الأعلام (Capture-the-Flag) المحلية بالذكاء الاصطناعي مع دروس موجّهة حول حقن الأوامر (prompt injection)، وإساءة استخدام استدعاء الأدوات (tool-call abuse)، والاستخبارات مفتوحة المصدر (OSINT) ضد ستة شخصيات محادثة (chatbot personas) محاكاة.
AI Capture-the-Flag محلي مع دروس موجّهة للتقنيين الجدد في حقن الأوامر (prompt injection). يمكن للاعبين أيضًا استكشاف ست شخصيات ذكاء اصطناعي (إحداها مخفية) تحمي 20 علمًا عبر حقن الأوامر، وإساءة استخدام استدعاء الأدوات، والتلاعب بمنطق الأعمال، والبصمة في سلسلة التوريد، والاستطلاع على الويب، وOSINT.
يغطي المسار الموجّه الحقن المباشر، وتفويض الأدوات، والحقن عبر مقالة معرفية قابلة للتحرير. ويوفّر تلميحات، ومحاولات محفوظة، وأدلة الأدوات، وتغذية راجعة عند الإكمال، ومقارنات أدوات محمية. تحتفظ مختبرات التدريب الأصلية بالتسجيل اليدوي للأحداث. يعمل استدلال النموذج محليًا عبر Ollama؛ وبعد البناء وتنزيل النموذج، لا تحتاج المنصة الأساسية إلى اتصال بالإنترنت.
Email Joe in Product Sales يضيف صندوق وارد محاكيًا وسطح مكتب بنمط Windows. اكتب بريدًا إلكترونيًا سيقرأه مساعد Joe، ثم شاهد ملخّص النموذج الفعلي والإجراءات المسجّلة. تغطي ثلاثة أهداف: موجز مبيعات مضلّل، والكشف عن ملف داخلي خيالي، وخصم غير مصرّح به. لا حاجة إلى خادم بريد، أو Windows، أو Wine، أو نموذج إضافي.
ai-ctf/
├── README.md ← you are here
├── LICENSE ← MIT
├── platform/ ← everything that runs in Docker
│ ├── flags.toml ← central config: edit this to customize flag values
│ ├── docker-compose.yml ← three services: web, ollama, decoy
│ ├── Dockerfile ← the web app image
│ ├── app/ ← FastAPI source (config, personas, tools, chat)
│ ├── data/init.sql ← SQLite schema + fake-employee seed data
│ ├── decoy/ ← tiny nginx with two flag pages
│ └── scripts/
│ ├── apply_flags.py ← stamps flags.toml values into static files
│ ├── render_secret.py ← runs at container startup
│ └── dump_chats.py ← exports the chat log as HTML (event-day tool)
├── external_artifacts/ ← what you push to GitHub / Gist / DNS
│ ├── README.md ← setup checklist
│ ├── anvil_chatkit/ ← the fake supply-chain package
│ ├── gist_content.md ← paste this into a public Gist
│ └── dns_records.txt ← TXT record to add to your domain
└── docs/ ← run-the-event paperwork
├── ANSWER_KEY.md ← guided solutions + original 20-flag answers
├── CHEAT_SHEET.md ← working solutions + tiered hints (GM only)
├── OPERATIONS.md ← updates, backups, and troubleshooting
├── SETUP_RUNBOOK.md ← week-of, step-by-step
└── EVENT_DAY_NOTES.md ← briefing script + troubleshooting
استخدم البدء السريع أدناه للمسار الموجّه. يغطي دليل التشغيل التحديثات، والنسخ الاحتياطي، والاستعادة، وفحوصات ما قبل الحدث. يصف مفتاح الإجابات، وورقة الغش، ودليل الإعداد، وملاحظات الحدث تنسيق CTF الأصلي الاختياري.
apply_flags.py و
dump_chats.py — التطبيق نفسه يعمل داخل Docker).exiftool (مطلوب فقط إذا غيّرت علم EXIF وأردت أن يعيد
apply_flags.py ختم الشعار).pip install وسحب نموذج Ollama).
بعد ذلك تعمل الحزمة المحلية الأساسية دون اتصال. سلسلة OSINT الخارجية الاختيارية تحتاج إلى اتصال بالإنترنت.git clone https://github.com/mubix/ai-ctf.git
cd ai-ctf/platform
# 1. Session secret
echo "SESSION_SECRET=$(python3 -c 'import secrets; print(secrets.token_hex(32))')" > .env
# 2. (Optional) Customize flag values — see "Customizing the flags" below.
# Default values work fine for a smoke test.
# 3. Build and start
docker compose build
docker compose up -d ollama
docker compose exec ollama ollama pull qwen2.5:7b-instruct-q4_K_M
docker compose up -d
# 4. Open the platform
open http://localhost:18080/ # or your-machine-ip:18080 on another laptop
سجّل اسم مستخدم؛ تولّد المنصة كلمة مرور من 12 حرفًا وتعرضها مرة واحدة. احفظها لاحقًا. يتم تسجيل دخولك تلقائيًا ويمكنك اختيار Start learning. يمكن للاعبين العائدين تسجيل الدخول لاستئناف تقدمهم المحفوظ.
اسم مشروع Compose هو ai-ctf وله شبكته وحجم النموذج الخاص به.
واجهة الويب فقط هي التي تنشر منفذًا على المضيف: 18080 افتراضيًا. اضبط CTF_WEB_PORT
في platform/.env لاختيار منفذ آخر. لا ينشر Ollama ولا الـ decoy أي منافذ
على المضيف؛ يتصل التطبيق بحاوية Ollama الخاصة به. لا يوجد تمرير GPU مُهيّأ.
لا تزال وحدة المعالجة المركزية والذاكرة مشتركتين مع أحمال العمل الأخرى على المضيف.
عند ترقية حزمة أُنشئت تحت اسم مشروع Compose مختلف، احتفظ بذلك
الاسم عبر docker compose -p YOUR_EXISTING_PROJECT ... لإعادة استخدام حاوياته
وحجم النموذج. تغيير أسماء المشاريع ينشئ حزمة منفصلة.
يستخدم درس Customer Service الموجّه رمز تدقيق جديدًا لكل محاولة بدلًا من رمز الحدث الثابت. يتعرّف على الإفصاحات النصية العادية ويميّز بين عرض المثال المحلول والحل دون استخدامه. تحافظ المحاولات الجديدة على المحادثات السابقة والتقدم المكتسب. ملفه التعريفي للمبتدئين يثق عمدًا بدور مشغّل دعم مُدّعى؛ ويبقى بوت Customer Service الأصلي للتدريب منفصلًا. تحتفظ المحاولات الموجّهة الحالية بملفها التعريفي السابق حتى يبدأ اللاعب من جديد.
يستخدم درسان موجّهان آخران تجهيزات خيالية معزولة: الوصول إلى أدوات HR، ثم مقالة معرفية قابلة للتحرير يمكنها إعادة توجيه رد محاكى. ينفّذان طلبات إجراءات نموذج مُتحقَّق من مخططها مقابل أدوات التجهيز تلك، ويسجّلان استدعاءات الأدوات، ويتحققان من نتائجها. يمكن للاعبين إعادة تشغيل نفس الوسائط عبر فحص الأذونات وفحص ضابط الاستخدام المشروع. تقارن هذه المقارنة حدود الأداة، وليس تشغيل نموذج ثانٍ. لا يُرسَل أي بريد إلكتروني ولا تُوصَل أي خدمة HR حقيقية. تبقى الشخصيات الأصلية مختبرات تدريب ذاتية التوجيه بإجاباتها الأصلية وتقييمها اليدوي.
يتوفر سيناريو البريد الإلكتروني من All lessons → Email Joe. يستخدم مستكشف الملفات
مسارات مألوفة مثل C:\Users\Joe\Documents\Sales؛ وهي تشير إلى
تجهيزات في الذاكرة ولا تصل أبدًا إلى نظام ملفات المضيف. يحصل كل بريد إلكتروني على ملفات خيالية جديدة،
وصندوق صادر، وسجل مبيعات. تُوسَم أحداث القصة بشكل منفصل عن نشاط النموذج
والأدوات المرصود. تتطلب أهداف الكشف عن الملفات وتغيير السجلات إجراءات منفّذة،
وليس مجرد ادعاء في الملخّص. فعّل Enforce Joe's tool permissions لإعادة تشغيل أي من
هدفي الأدوات مع فحوصات التطبيق، ثم أرسل مثالًا نظيفًا لفحص الاستخدام الطبيعي.
تُحفظ المحاولات، والتلميحات، واستخدام المثال المحلول، والتقدم.
بالنسبة لتثبيت قائم، تتطلب تغييرات التطبيق/القوالب إعادة بناء صورة الويب؛ إعادة التشغيل وحدها لا تنسخ الكود المحدّث:
cd platform
docker compose up -d --build web
تُنشأ جداول الدروس عند بدء التشغيل دون حذف الحسابات أو سجل المحادثات الحالي. اتبع دليل التشغيل لعمل نسخة احتياطية من تثبيت قائم قبل التحديث وتحقق من قدرة اللاعبين على استئناف دروسهم بعد ذلك.
تحتوي المنصة ذاتيًا على 16 من أصل 20 علمًا. تتطلب الأعلام الأربعة المتبقية (#14–17)
بنية تحتية خارجية تدفعها بنفسك — راجع
external_artifacts/README.md. تخطَّ هذه الخطوة إذا كنت تريد فقط
النصف الموجود داخل المنصة.
توجد جميع قيم الأعلام العشرين في ملف واحد: platform/flags.toml. حرّر القيم
هناك لإعطاء حدثك طابعه الخاص (رموز flag{adjective_noun} مختلفة،
وكود قسيمة مختلف، وراتب CEO مختلف، إلخ).
بعد التحرير:
cd platform
python3 scripts/apply_flags.py # stamps values into static files
docker compose up -d --build web decoy # copies updated assets into the images
يحدّث apply_flags.py الملفات التي لا يحمّلها Python أثناء التشغيل:
data/init.sql (راتب CEO، العلم #4)decoy/html/private/index.html و decoy/html/internal-tools/index.htmlapp/static/logo.jpg (العلم #20 — يحتاج exiftool في PATH)external_artifacts/ (README الخاص بـ chatkit، ومحتوى gist، وسجل DNS،
ورسالة commit الخاصة بـ setup-history.sh)بعد تغيير أي قيم أعلام، حدّث أيضًا docs/ANSWER_KEY.md لتتطابق
ورقة التحقق لديك.
إعادة البناء لا تحدّث صفوف الموظفين الموجودة بالفعل في قاعدة بيانات SQLite: تستخدم البذرة
INSERT OR IGNORE. لا يزال تغيير راتب CEO في حدث قائم يتطلب ترحيلًا موجّهًا
للتجهيزات. لا تحذف قاعدة بيانات اللاعبين لتطبيق ذلك التغيير.
إذا أردت إضافة أعلام أو إزالتها بالكامل (تغيير الشخصيات الموجودة، وإسقاط
السلسلة الخارجية، وإضافة أداة جديدة)، فحرّر platform/app/personas/__init__.py
و platform/app/tools.py مباشرة. لا توجد لغة DSL — الشخصيات هي
اللعبة نفسها.
platform/app/personas/__init__.py) — عبارات
حواجز أقل، وأسطر "NEVER" أقل، وأمثلة رفض صريحة أقل.
يرتفع معدل نجاح اللاعبين من المحاولة الأولى.OLLAMA_MODEL في docker-compose.yml، واسحب ذلك النموذج،
وشغّل docker compose up -d web لتطبيق الإعداد. حجم النموذج وحده لا
يحدد الصعوبة. أعد فحص المهام العادية، والأمثلة المحلولة، واستدعاءات الأدوات الأصلية،
واستجابات الإجراءات المهيكلة باستخدام فحوصات ما قبل الحدث.file:// من خلال LLM.كتالوج الهجمات الأصلي وأمثلة المطالبات التاريخية موجودة في docs/CHEAT_SHEET.md.
docs/SETUP_RUNBOOK.md هو قائمة التحقق الخاصة بأسبوع الحدث (البناء → التجهيزات الخارجية →
التشغيل التجريبي → يوم الحدث). يحتوي docs/EVENT_DAY_NOTES.md على سكربت إحاطة اللاعبين،
وكتالوج التلميحات المتدرّجة، وجدول استكشاف الأخطاء وإصلاحها.
لتحليل يوم الحدث — "من حلّ ماذا فعليًا؟" — شغّل
platform/scripts/dump_chats.py مقابل قاعدة بيانات SQLite المرتبطة، لإنتاج
تقرير HTML مكتفٍ ذاتيًا مع شرائح كشف الأعلام لكل رسالة. هذه مطابقات
جزئية للنص، وليست دليلًا على أن مساعدًا أفصح عن سر أو نفّذ أداة. تحتفظ الدروس الموجّهة
بسجلات إكمالها المتحقَّق منها الخاصة.
يتم تجاهل تصدير ctf_log.html الافتراضي، وبيانات التشغيل، وملفات البيئة المحلية، وأرشيفات
الإصدارات بواسطة Git. احتفظ بالتصديرات ذات الأسماء المخصصة ونسخ النشر الاحتياطية خارج
مجلد الاستنساخ أو في دليل platform/data/ المتجاهَل. يجب أن تبقى سجلات اللاعبين، وبيانات الاعتماد،
وتصديرات المحادثات خاصة.
MIT. راجع LICENSE.
أنشأه Rob Fuller (mubix) لتدريب عملي في أمن الذكاء الاصطناعي. الكود مولّد بالذكاء الاصطناعي إلى حد كبير؛ وقرارات التصميم والمحتوى مملوكة لإنسان.