
LLM-प्रथम धोखा ढांचा: "वह हनीपॉट जो बात करता है!™"

परिचय honeyprompt, एक LLM-प्रथम धोखा ढाँचा जो वेब डेवलपर्स द्वारा/के लिए बनाया गया है। @alectrocute का व्यक्तिगत जुनून प्रोजेक्ट।
सभी प्रमुख क्लाउड और स्थानीय LLM प्रदाताओं का समर्थन करता है। SSH, HTTP, TLS, TCP, telnet और अधिक। यह एक छोटे कंटेनर (और एक एकल स्थैतिक बाइनरी) के रूप में आता है और सभी नॉब एक honeyprompt.yaml में रखता है।
कोई प्लगइन संकलित करने की आवश्यकता नहीं, कोई डेटाबेस चलाने की आवश्यकता नहीं, आसानी से विस्तार योग्य और कम-अंत हार्डवेयर पर तैनात किया जा सकता है।
एक डेमो इंस्टेंस 172.233.151.216 पर उपलब्ध है, जिसमें बिना प्रमाणीकरण वाला वेब पैनल यहाँ है: http://172.233.151.216:9090। यह एक सस्ते Linode VPS पर चल रहा honeyprompt का एक सार्वजनिक इंस्टेंस है, जिसमें एकमात्र LLM प्रदाता/मॉडल के रूप में openrouter/free है।
2026 में सबसे आसान सेटअप के लिए, हम Docker और OpenRouter/openrouter/free को LLM प्रदाता के रूप में अनुशंसित करते हैं। सभी प्रमुख क्लाउड और स्थानीय LLM प्रदाता समर्थित हैं। तीन फ़ाइलें और एक कमांड पूर्ण डिफ़ॉल्ट तैनाती स्थापित करते हैं: सात LLM-समर्थित डिकॉय, टिकाऊ घटना संग्रहण और ऑपरेटर पैनल।
1. डिफ़ॉल्ट कॉन्फ़िग, कंपोज़ फ़ाइल और env टेम्पलेट प्राप्त करें:
# if you don't have 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-... # use a dedicated key with a spend limit
HONEYPROMPT_PANEL_PASSWORD=changeme # basic-auth password for the panel
3. इसे शुरू करें:
docker compose up -d
4. इसे परीक्षण करें:
ssh -p 2222 root@localhost # password: root — then type anything
curl http://localhost:2375/v1.54/containers/json # "exposed" Docker API
5. इसे होते हुए देखें रीड-ओनली पैनल पर http://127.0.0.1:9090 (अपने पैनल पासवर्ड के साथ admin के रूप में साइन इन करें)। हर कनेक्शन, क्रेडेंशियल और कमांड लाइव स्ट्रीम होता है। यदि आप किसी रिमोट होस्ट पर तैनात हैं, तो आपको compose.yaml में :9090 पोर्ट को एक्सपोज़ करना होगा। यह उत्पादन तैनाती के लिए अनुशंसित नहीं है।
उत्पादन तैनाती के लिए
latestके बजाय एक क्रमांकित रिलीज़ को पिन करें —.envमेंHONEYPROMPT_IMAGEसेट करें।
आपके द्वारा अभी डाउनलोड किया गया honeyprompt.yaml पूरी तरह से व्याख्यायित शोकेस है। इसमें प्रोफाइल शामिल हैं:
/ तुरंत स्टॉक nginx वेलकम पेज परोसता है, और गहरे पथ LLM के पास जाते हैं पूर्ण HTML/CSS इंट्रानेट पेज, लॉगिन फॉर्म और एडमिन पैनल के लिए जो हमलावर को क्लिक करते रहने के लिए बनाए गए हैं।[!महत्वपूर्ण] भले ही आप LLM का उपयोग कर रहे हों, सबसे अधिक उपयोग किए जाने वाले पथ निर्धारित करें और उनके लिए स्थिर नियम जोड़ें। इससे आपको LLM टोकन की भारी मात्रा बचेगी और उन अनुरोधों के प्रति प्रतिक्रिया तेज होगी जो LLM कॉल की लागत के लायक नहीं हैं। यादृच्छिक उदाहरण:
whoami, स्वास्थ्य जांच, favicon, संस्करण प्रोब आदि।
यह न्यूनतम honeyprompt.yaml दो स्थिर नियमों और बिना LLM के एक SSH बॉक्स का नकली बनाता है:
panel:
enabled: true
address: "0.0.0.0:8080"
events:
buffer: 2000
file: /data/events.jsonl # durable attacker activity
services:
- protocol: ssh
address: "0.0.0.0:2222"
description: "Ubuntu 26.04 LTS build runner"
serverName: "gpu-runner-07"
passwordRegex: "^(root|admin|123456)$" # which passwords "work"
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 पर पैनल पहुंच, अपग्रेड, रोलबैक, घटना संग्रहण और अलगाव को कवर करता है।
एक हनीपॉट को केवल एक काम अच्छी तरह से करना होता है: इतना विश्वसनीय बने रहना कि हमलावर टाइप करता रहे। वे जो भी कमांड चलाते हैं वह खुफिया जानकारी है — वे उपकरण जिन तक वे पहुँचते हैं, वे क्रेडेंशियल जिनका वे पुन: उपयोग करते हैं, वे CVE जिन्हें वे मानते हैं कि आपने पैच नहीं किया है। स्थिर हनीपॉट उस समय चरित्र तोड़ देते हैं जब कोई ऐसा कमांड चलाता है जिसकी लेखक ने उम्मीद नहीं की थी। honeyprompt उस पल को LLM को सौंप देता है, ताकि शेल dmesg | tail या cat /etc/shadow का उत्तर उसी तरह दे जैसे एक वास्तविक शेल देता, और सत्र जारी रहता है।
Adel Karimi के उत्कृष्ट DEF CON 32 प्रस्तुति को देखें Galah पर, (पहला?) LLM हनीपॉट, जिसने इस प्रोजेक्ट को प्रेरित किया: https://www.youtube.com/watch?v=XGsm4Qcc_Ag
यह वह हिस्सा है जिसे पहले से समझना उचित है, क्योंकि दोनों को जानबूझकर अलग रखा गया है:
आप उन्हें अलग-अलग कॉन्फ़िगर करते हैं:
# The honey: attacker activity.
events:
buffer: 2000 # recent events kept in memory for the panel
file: /data/events.jsonl # persist every event as JSON Lines
# The runtime's own diagnostics.
logging:
level: info # debug | info | warn | error
format: text # how it looks on the console: text (human) or json
file: /data/honeyprompt.log # optional; on disk it's always JSON
events.jsonl प्रति पंक्ति एक स्व-निहित JSON ऑब्जेक्ट है — tail -f करने, SIEM को भेजने, या jq के साथ पुनः चलाने के लिए तैयार। ऊपर दिए गए Docker कमांड नामित वॉल्यूम honeyprompt-data को /data पर माउंट करते हैं, जिससे कंटेनर प्रतिस्थापन पर घटनाएँ बची रहती हैं। दोनों फ़ाइलों को जोड़ा जाता है और साफ शटडाउन पर फ्लश किया जाता है।
format केवल प्रभावित करता है कि परिचालन लॉग कंसोल पर कैसे प्रस्तुत किए जाते हैं; परिचालन लॉग फ़ाइल, जब सक्षम होती है, हमेशा संरचित JSON होती है ताकि इसे पार्स करना आसान हो।

एक वैकल्पिक, रीड-ओनली डैशबोर्ड घटित होते ही धोखा घटनाओं को स्ट्रीम करता है, उन्हें प्रोटोकॉल के अनुसार तोड़ता है, और एक क्लिक से सब कुछ JSON में निर्यात करता है:
panel:
enabled: true
address: "0.0.0.0:8080"
auth: # optional basic auth
username: admin
password: "${HONEYPROMPT_PANEL_PASSWORD}"
डैशबोर्ड सादा HTML, CSS और JavaScript (src/panel/assets) है जो बाइनरी में एम्बेडेड है। प्रमाणीकरण अक्षम करने के लिए auth अपरिभाषित छोड़ दें।
प्रत्येक प्रदाता अपने स्वयं के टाइमआउट, पुनर्प्रयास, दर सीमा और हेडर के साथ अपना स्वयं का मॉड्यूल है। कुंजियाँ वातावरण से आती हैं। बॉक्स से बाहर:
प्रदाताओं को कॉन्फ़िगर करें, एक pool.strategy (round-robin, weighted, random, या failover) चुनें, और honeyprompt उनके बीच ट्रैफ़िक फैलाता है। यदि चुना गया प्रदाता टाइमआउट करता है या एक रीट्राइबल त्रुटि लौटाता है, honeyprompt पारदर्शी रूप से अगले पर गिर जाता है — एक मृत बैकएंड कभी भी हनीपॉट को ऑफ़लाइन नहीं ले जाता। गैर-रीट्राइबल त्रुटियाँ (जैसे खराब API कुंजी) कैस्केड को रोकती हैं ताकि आपको पता चले, चुपचाप कोटा खत्म करने के बजाय।
सेवाएँ वैश्विक पूल का उपयोग करती हैं जब तक कि वे अपना स्वयं का प्रदाता सबसेट नाम न दें:
llm:
enabled: true
providers: [local-ollama] # one name: force this service to this provider
लोड बैलेंसिंग और फेलओवर बनाए रखने के लिए कई नाम सूचीबद्ध करें, लेकिन केवल उस सबसेट के भीतर:
llm:
enabled: true
providers: [openai-primary, openrouter-backup]
जब कई सेवाओं को एक ही प्रदाता समूह साझा करना चाहिए — या किसी उपसमूह को वैश्विक के बजाय अपनी स्वयं की रणनीति की आवश्यकता है — तो एक नामित पूल परिभाषित करें। एक पूल का एक नाम, एक रणनीति और एक क्रमबद्ध प्रदाता सूची होती है, और एक सेवा इसे नाम से संदर्भित करती है जहाँ भी वह किसी प्रदाता का नाम लेगी:
pools:
- name: cheap-first
strategy: failover # try the local model first, fall back to the paid API
order: [local-ollama, openrouter]
- name: spread
strategy: round-robin
order: [openrouter, openai]
services:
- protocol: ssh
# ...
llm:
enabled: true
providers: [cheap-first] # a pool name, in place of a provider
- 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 # type-check
deno task lint
deno task fmt
deno task test # unit + integration tests
deno task start -- --config honeyprompt.yaml # run locally
deno task dev -- --config honeyprompt.yaml # run with file watching
deno task compile # -> ./dist/honeyprompt (self-contained binary)
deno compile रनटाइम, पैनल एसेट्स और सब कुछ एक निष्पादन योग्य में बेक करता है जिसमें कोई निर्भरता नहीं है। Linux, macOS और Windows के लिए प्रीबिल्ट बाइनरी हर टैग किए गए रिलीज़ से जुड़ी होती हैं।
CI प्रत्येक पुश पर फ़ॉर्मेटिंग, लिंट, टाइप-चेक, टेस्ट, कॉन्फ़िग सत्यापन, एक क्रॉस-प्लेटफ़ॉर्म compile और एक Docker बिल्ड चलाता है। vX.Y.Z टैग करने से रिलीज़ बाइनरी कट जाती है और प्रोवेनेंस- और SBOM-प्रमाणित मल्टी-आर्क इमेज को alectrocute/honeyprompt पर प्रकाशित करता है।
honeyprompt run [--config <path>] start every configured service (default)
honeyprompt validate [--config <path>] parse and validate config, then exit — great for CI
honeyprompt version
honeyprompt help
--config डिफ़ॉल्ट ./honeyprompt.yaml है, या $HONEYPROMPT_CONFIG यदि सेट हो (कंटेनर इसे /etc/honeyprompt/honeyprompt.yaml पर सेट करता है)।
यह उन बुनियादी ढांचे पर हमलावरों को लुभाने और अध्ययन करने का एक उपकरण है जिसके आप मालिक हैं या जिसका परीक्षण करने के लिए अधिकृत हैं। डिकॉय सेवाओं को उजागर करने का अर्थ अभी भी सेवाओं को उजागर करना है; इसे अलग-थलग होस्ट पर चलाएँ, इसे पैच रखें, और इसे किसी ऐसी चीज़ पर इंगित न करें जिसे आप जाँचे जाने का जोखिम नहीं उठा सकते। धोखा वास्तविक चीज़ को सुरक्षित करने का विकल्प नहीं है।
यदि आप इस प्रोजेक्ट में योगदान देना चाहते हैं और AI एजेंट का उपयोग करते हैं या जनरेटिव कोड पर भारी झुकाव रखते हैं, तो यह पूरी तरह से ठीक है—लेकिन आपसे व्यक्तिगत रूप से आपके द्वारा प्रस्तुत कोड की हर एक पंक्ति पर प्रश्न पूछे जाएँगे और यदि आप तत्काल, AI-मुक्त समझ प्रदर्शित नहीं करते हैं, तो आपका पूरा योगदान अस्वीकार और त्याग दिया जाएगा।
| प्रदाता | प्रकार | नोट्स |
|---|
| Ollama | ollama | स्थानीय मॉडल; डिफ़ॉल्ट localhost:11434 |
| llama.cpp | llamacpp | स्थानीय server OpenAI एंडपॉइंट |
| 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 |
| Anything OpenAI-shaped | openai-compatible | अपने गेटवे पर baseUrl इंगित करें |