
honeyprompt v0.1.8
إطار خداع يعتمد على LLM أولاً: "الحاوية الوهمية التي ترد عليك!™"
honeyprompt

تقديم honeyprompt، إطار عمل خداع يعتمد على LLM أولاً، صُنع بواسطة/لمطوري الويب. مشروع شغف شخصي لـ @alectrocute.
يدعم جميع مزودي LLM الرئيسيين في السحابة والمحليين. SSH وHTTP وTLS وTCP وtelnet وغيرها. يأتي كحاوية صغيرة (وكثنائي ثابت واحد) ويحتفظ بكل المقابض في ملف واحد honeyprompt.yaml.
لا حاجة لتجميع الإضافات، ولا تشغيل قاعدة بيانات، سهل التوسع ويمكن نشره على أجهزة منخفضة المواصفات.
مثيل تجريبي
يتوفر مثيل تجريبي على 172.233.151.216، مع لوحة الويب غير الموثقة هنا:
http://172.233.151.216:9090. وهو مثيل عام لـ honeyprompt يعمل على VPS رخيص من Linode، مع openrouter/free كمزود/نموذج LLM الوحيد.
بداية سريعة
لأسهل إعداد في عام 2026، نوصي باستخدام Docker وOpenRouter/openrouter/free كمزود LLM. جميع مزودي LLM الرئيسيين في السحابة والمحليين مدعومون. ثلاثة ملفات وأمر واحد ينشر النشر الافتراضي الكامل: سبعة أدوات خداع مدعومة بـ LLM، تخزين دائم للأحداث، ولوحة المشغل.
1. احصل على التكوين الافتراضي وملف compose وقالب env:
# إذا لم يكن لديك Docker:
# curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
mkdir honeypot && cd honeypot
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/honeyprompt.yaml
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/compose.yaml
wget -O .env https://raw.githubusercontent.com/alectrocute/honeyprompt/main/.env.example
(أو استنسخ المستودع وانتقل إليه cd — نفس الملفات الثلاثة.)
2. املأ ملف .env. قيمتان مطلوبتان:
OPENROUTER_API_KEY=sk-or-... # استخدم مفتاحاً مخصصاً مع حد إنفاق
HONEYPROMPT_PANEL_PASSWORD=changeme # كلمة مرور المصادقة الأساسية للوحة
3. ابدأه:
docker compose up -d
4. اختبره:
ssh -p 2222 root@localhost # كلمة المرور: root — ثم اكتب أي شيء
curl http://localhost:2375/v1.54/containers/json # واجهة Docker API "المكشوفة"
5. شاهد ما يحدث في اللوحة للقراءة فقط على http://127.0.0.1:9090 (سجل الدخول باسم admin مع كلمة مرور اللوحة الخاصة بك). كل اتصال وبيانات اعتماد وأمر يتدفق مباشرة. إذا كنت منشوراً على مضيف بعيد، ستحتاج إلى كشف منفذ :9090 في compose.yaml. هذا غير موصى به لنشرات الإنتاج.
استخدم إصداراً مرقماً بدلاً من
latestلنشرات الإنتاج — عيّنHONEYPROMPT_IMAGEفي.env.
الملف honeyprompt.yaml الذي قمت بتنزيله للتو هو ملف توضيحي مشروح بالكامل. يشمل ملفات تعريف لـ:
- خادم ويب شركة عام — المنفذ 80، أوسع شبكة؛
/يقدم صفحة nginx الترحيبية القياسية فوراً، والمسارات الأعمق تمر إلى LLM لصفحات إنترانت كاملة HTML/CSS ونماذج تسجيل الدخول ولوحات الإدارة المصممة لإبقاء المهاجم ينقر. - بوابات MCP / العامل — اكتشاف HTTP قابل للبث، بيانات OAuth، استدعاءات أدوات JSON-RPC، وأدوات إنتاج مغرية.
- واجهة Docker Engine API 29.5 — سطح المنفذ 2375 غير الموثق المستخدم من قبل ديدان السحابة الحقيقية.
- واجهة Kubernetes API v1.36 — اكتشاف مساحات الأسماء وأعباء العمل والأسرار وConfigMaps وRBAC.
- بنية تحتية لبناء AI على Ubuntu 26.04 — SSH وأعباء عمل GPU وDocker وkubeconfigs وحالة CI وبيانات اعتماد المزود.
- Redis 8.8 — استفسارات RESP الشائعة المستخدمة لسرقة بيانات الاعتماد والثبات والحركة الجانبية.
- الحافة الصناعية / OT — سطح إدارة Telnet قديم عمداً، لأن الدفاع الحديث لا يزال بحاجة لرصد الهجمات على البنية التحتية القديمة.
التشغيل بدون LLM
[!مهم] حتى إذا كنت تستخدم LLM، حدد المسارات الأكثر استخداماً وأضف قواعد ثابتة لها. سيوفر لك هذا كمية هائلة من رموز LLM ويسرع الاستجابات للطلبات التي لا تستحق تكلفة استدعاء LLM. أمثلة عشوائية:
whoami، فحوصات الصحة، أيقونة المفضلة، استفسارات الإصدار، إلخ.
هذا الحد الأدنى من honeyprompt.yaml يزيّف صندوق SSH بقاعدتين ثابتتين وبدون LLM:
panel:
enabled: true
address: "0.0.0.0:8080"
events:
buffer: 2000
file: /data/events.jsonl # نشاط المهاجم الدائم
services:
- protocol: ssh
address: "0.0.0.0:2222"
description: "وحدة بناء Ubuntu 26.04 LTS"
serverName: "gpu-runner-07"
passwordRegex: "^(root|admin|123456)$" # كلمات المرور التي "تعمل"
commands:
- regex: "^whoami$"
handler: "root"
- regex: "^(.+)$"
handler: "bash: command not found"
docker run --rm \
-p 2222:2222 -p 8080:8080 \
-v "$(pwd)/honeyprompt.yaml:/etc/honeyprompt/honeyprompt.yaml:ro" \
-v honeyprompt-data:/data \
alectrocute/honeyprompt:latest
النشر
لنشر دائم، استخدم compose.yaml المرفق. يغطي دليل النشر إصدارات Docker Hub وأسرار GitHub المطلوبة وإعداد المنفذ والجدار الناري والوصول للوحة عبر SSH والترقيات والاستعادة وتخزين الأحداث والعزل.
لماذا الخداع القائم على LLM أولاً، باختصار
كل ما على وعاء العسل (honeypot) فعله هو شيء واحد جيد: البقاء مقنعاً لفترة كافية حتى يستمر المهاجم في الكتابة. كل أمر ينفذه هو استخبارات — الأدوات التي يلجأ إليها، بيانات الاعتماد التي يعيد استخدامها، الثغرات (CVEs) التي يفترض أنك لم تقم بتصحيحها. وعاء العسل الثابت يخرج عن الشخصية بمجرد تشغيل أمر لم يتوقعه المؤلف. honeyprompt يسلم تلك اللحظة إلى LLM، بحيث تجيب الصدفة على dmesg | tail أو cat /etc/shadow بالطريقة التي يجيب بها النظام الحقيقي، وتستمر الجلسة.
شاهد عرض Adel Karimi الرائع في DEF CON 32 حول Galah، (أول؟) وعاء عسل LLM، الذي ألهم هذا المشروع: https://www.youtube.com/watch?v=XGsm4Qcc_Ag
ما يتم تسجيله: تياران منفصلان
هذا هو الجزء الذي يستحق الفهم مسبقاً، لأن الاثنين منفصلان عمداً:
- أحداث الخداع: كل تفاعل للمهاجم: الاتصالات، محاولات المصادقة، كل أمر أو طلب، الاستجابة التي أرسلها honeyprompt، أي مزود ونموذج أجاب، والمدة التي استغرقها. هذه هي استخبارات التهديدات الخاصة بك. تُحفظ في مخزن مؤقت في الذاكرة للوحة الحية ويمكنك حفظها كلها على القرص.
- سجلات التشغيل: بدء التشغيل، المنافذ التي ربطها، فشل المزود، الإغلاق، الأخطاء الداخلية. هذا ما تقرأه عندما يسيء وقت التشغيل التصرف. لا علاقة له بنشاط المهاجم.
تقوم بتكوينهما بشكل منفصل:
# العسل: نشاط المهاجم.
events:
buffer: 2000 # الأحداث الأخيرة محفوظة في الذاكرة للوحة
file: /data/events.jsonl # حفظ كل حدث كـ JSON Lines
# تشخيصات وقت التشغيل الخاصة به.
logging:
level: info # debug | info | warn | error
format: text # كيف يظهر على وحدة التحكم: text (مقروء للبشر) أو json
file: /data/honeyprompt.log # اختياري؛ على القرص يكون دائماً JSON
events.jsonl هو كائن JSON واحد مكتفي بذاته لكل سطر — جاهز لـ tail -f أو الإرسال إلى SIEM أو إعادة التشغيل باستخدام jq. أوامر Docker أعلاه تقوم بتركيب الـ volume المسمى honeyprompt-data في /data، لذا تبقى الأحداث حتى بعد استبدال الحاوية. يتم إلحاق كلا الملفين ويتم مسحهما عند الإغلاق النظيف.
format يؤثر فقط على كيفية عرض سجلات التشغيل على وحدة التحكم؛ ملف سجل التشغيل، عند تفعيله، يكون دائماً JSON منظم ليسهل تحليله.
لوحة الويب

لوحة تحكم اختيارية للقراءة فقط تبث أحداث الخداع فور حدوثها، وتصنفها حسب البروتوكول، وتصدر كل شيء بصيغة JSON بنقرة واحدة:
panel:
enabled: true
address: "0.0.0.0:8080"
auth: # مصادقة أساسية اختيارية
username: admin
password: "${HONEYPROMPT_PANEL_PASSWORD}"
لوحة التحكم هي HTML وCSS وجافا سكريبت عادية (src/panel/assets) مضمنة في الثنائي. اترك auth غير معرّف لتعطيل المصادقة.
المزودون
كل مزود هو وحدة خاصة به مع مهلة زمنية وإعادة محاولات وحدود معدل ورؤوس خاصة به. المفاتيح تأتي من البيئة. خارج الصندوق:
| المزود | النوع | ملاحظات |
|---|---|---|
| Ollama | ollama | نماذج محلية؛ الافتراضي localhost:11434 |
| llama.cpp | llamacpp | نقطة نهاية OpenAI المحلية server |
| OpenAI | openai | OPENAI_API_KEY |
| Azure OpenAI | azure | يحتاج azure.deployment + azure.apiVersion |
| OpenRouter | openrouter | OPENROUTER_API_KEY |
| Anthropic | anthropic | ANTHROPIC_API_KEY |
| Google Gemini | google | GEMINI_API_KEY |
| أي شيء على شكل OpenAI | openai-compatible | وجه baseUrl إلى بوابتك |
موازنة الحمل والتحويل الاحتياطي
قم بتكوين المزودين، اختر pool.strategy (round-robin، weighted، random، أو failover)، ويوزع honeyprompt الحركة بينهم. إذا انتهت مهلة المزود المختار أو أعاد خطأً قابلاً لإعادة المحاولة، ينتقل honeyprompt تلقائياً إلى التالي — الخلفية الميتة لا توقف وعاء العسل أبداً. الأخطاء غير القابلة لإعادة المحاولة (مثل مفتاح API خاطئ) توقف التسلسل لتعرف بدلاً من استنزاف الحصة بصمت.
تستخدم الخدمات التجمع العالمي ما لم تسمي مجموعة فرعية خاصة بها من المزودين:
llm:
enabled: true
providers: [local-ollama] # اسم واحد: إجبار هذه الخدمة على هذا المزود
اسرد عدة أسماء للحفاظ على موازنة الحمل والتحويل الاحتياطي، ولكن فقط ضمن تلك المجموعة الفرعية:
llm:
enabled: true
providers: [openai-primary, openrouter-backup]
التجمعات المسماة
عندما يجب أن تشارك عدة خدمات نفس مجموعة المزودين — أو مجموعة فرعية تحتاج استراتيجيتها الخاصة بدلاً من الاستراتيجية العامة — قم بتعريف تجمع مسمى. التجمع له اسم واستراتيجية وقائمة مزودين مرتبة، وتشير إليه الخدمة بالاسم في أي مكان تسمي فيه مزوداً:
pools:
- name: cheap-first
strategy: failover # جرب النموذج المحلي أولاً، ثم انتقل إلى API المدفوع
order: [local-ollama, openrouter]
- name: spread
strategy: round-robin
order: [openrouter, openai]
services:
- protocol: ssh
# ...
llm:
enabled: true
providers: [cheap-first] # اسم تجمع، بدلاً من مزود
- protocol: http
# ...
llm:
enabled: true
providers: [spread]
يجب أن يكون اسم التجمع هو الإدخال الوحيد في providers — لا يُسمح بخلط تجمع مع مزودين فرديين في قائمة واحدة، لأنه سيكون غامضاً أي استراتيجية تفوز. تعيش أسماء التجمعات في نفس مساحة الأسماء مثل أسماء المزودين ولا يمكن أن تتعارض معها.
توسيع الاستجابات بالخطافات
عندما لا تكون "مطابقة regex" أو "اسأل النموذج" كافية، تتيح لك الخطافات دمج TypeScript الخاص بك في مسار الطلب والاستجابة. يمكن للخطاف إعادة كتابة الطلب قبل أن يصل إلى النموذج، أو إعادة كتابة الرد قبل أن يصل إلى المهاجم.
import { registerHook } from "./src/engine/hooks.ts";
registerHook({
name: "fake-latency-notice",
transformResponse(response, ctx) {
if (ctx.protocol === "ssh" && /rm -rf/.test(ctx.input)) {
return "rm: cannot remove '/': Operation not permitted\n";
}
return response;
},
});
أشر إليه بالاسم من قائمة hooks: لأي خدمة. يتم شحن خطاف مدمج redact-secrets مفعلاً في مثال التكوين حتى لا يتمكن النموذج من إعادة صدى بيانات اعتماد حقيقية.
المقاييس
يتم تقديم مقاييس Prometheus في /metrics على اللوحة (غير موثقة، بحيث تعمل أدوات الجمع تلقائياً):
honeyprompt_events_total{protocol="ssh"} 412
honeyprompt_llm_requests_total{provider="openai",protocol="ssh"} 118
honeyprompt_auth_attempts_total{protocol="ssh"} 87
honeyprompt_engine_errors_total{protocol="http"} 0
البناء من المصدر
هل تريد المساهمة أو تريد ثنائياً أصلياً؟ ستحتاج إلى Deno 2.x — الاعتماد الوحيد.
deno task check # فحص الأنواع
deno task lint
deno task fmt
deno task test # اختبارات الوحدة + التكامل
deno task start -- --config honeyprompt.yaml # تشغيل محلي
deno task dev -- --config honeyprompt.yaml # تشغيل مع مراقبة الملفات
deno task compile # -> ./dist/honeyprompt (ثنائي مكتفي بذاته)
deno compile يضع وقت التشغيل وأصول اللوحة وكل شيء في ملف قابل للتنفيذ واحد بدون أي تبعيات. يتم إرفاق الثنائيات المعدة مسبقاً لأنظمة Linux وmacOS وWindows بكل إصدار موسوم.
تقوم CI بتشغيل التنسيق والفحص والتحقق من الأنواع والاختبارات والتحقق من صحة التكوين و compile عبر المنصات وبناء Docker مع كل دفعة. وضع علامة vX.Y.Z يقطع ثنائيات الإصدار وينشر الصورة متعددة البنى المرفقة مع منشأ وشهادة SBOM إلى alectrocute/honeyprompt.
واجهة سطر الأوامر
honeyprompt run [--config <path>] بدء كل خدمة مكونة (الافتراضي)
honeyprompt validate [--config <path>] تحليل والتحقق من صحة التكوين ثم الخروج — ممتاز لـ CI
honeyprompt version
honeyprompt help
--config الافتراضي هو ./honeyprompt.yaml، أو $HONEYPROMPT_CONFIG إذا تم تعيينه (الحاوية تضبطه على /etc/honeyprompt/honeyprompt.yaml).
كلمة تحذير للمستخدمين والمساهمين
هذه أداة لجذب ودراسة المهاجمين على بنية تحتية تملكها أو مصرح لك باختبارها. كشف خدمات الخداع لا يزال يعني كشف خدمات؛ قم بتشغيلها على مضيفات معزولة، حافظ على تحديثها، ولا توجهها نحو أي شيء لا يمكنك تحمل استكشافه. الخداع ليس بديلاً عن تأمين الشيء الحقيقي.
إذا كنت ترغب في المساهمة في هذا المشروع واستخدام وكيل AI أو الاعتماد بشكل كبير على الكود المُنشأ، فهذا جيد تماماً — ولكن سيتم اختبارك شخصياً في كل سطر من الكود الذي تقدمه، وإذا لم تظهر فهماً فورياً خالٍ من AI، فسيتم رفض مساهمتك بالكامل وإلغاؤها.
الترخيص
MIT.