
DECeption with Evaluative Integrated Validation Engine (DECEIVE): Let an LLM do all the hard honeypot work!
DECEIVE, DECeption with Evaluative Integrated Validation Engine, एक उच्च-अंतःक्रियात्मक (high-interaction), कम-प्रयास वाली हनीपॉट प्रणाली है। अधिकांश उच्च-अंतःक्रियात्मक हनीपॉट के विपरीत, DECEIVE हमलावरों को किसी वास्तविक सिस्टम तक पहुँच प्रदान नहीं करता। AI वास्तव में एक कॉन्फ़िगर करने योग्य सिस्टम प्रॉम्प्ट के आधार पर एक यथार्थवादी हनीपॉट सिस्टम का अनुकरण करने का सारा काम करता है, जो बताता है कि आप किस प्रकार के सिस्टम का अनुकरण करना चाहते हैं। कई अन्य उच्च-अंतःक्रियात्मक हनीपॉट के विपरीत, जिन्हें यथार्थवादी उपयोगकर्ताओं, डेटा और अनुप्रयोगों से भरने के लिए काफी प्रयास की आवश्यकता होती है, DECEIVE का AI बैकएंड आपके लिए यह सब स्वचालित रूप से कर देगा।
DECEIVE का यह संस्करण SSH प्रोटोकॉल के माध्यम से एक Linux सर्वर का अनुकरण करता है। यह सभी उपयोगकर्ता इनपुट, LLM बैकएंड द्वारा लौटाए गए आउटपुट, साथ ही प्रत्येक सत्र समाप्त होने के बाद उसका सारांश लॉग करेगा। यह आपको यह भी बताएगा कि उसे लगता है कि उपयोगकर्ता का सत्र सौम्य (benign), संदिग्ध (suspicious), या पूरी तरह से दुर्भावनापूर्ण (malicious) था।
⛔️⛔️ DECEIVE एक proof-of-concept परियोजना है। यह production गुणवत्ता का नहीं है। इसे आज़माएँ, इससे सीखें, लेकिन इसे production वातावरण में तैनात करने में सावधानी बरतें। ⛔️⛔️
DECEIVE मुख्य रूप से MacOS 15 (Sequoia) पर विकसित किया गया है, लेकिन यह किसी भी UNIX-जैसी प्रणाली पर काम करना चाहिए जो Python3 चला सकती है। इसमें MacOS के अन्य संस्करण, Linux, और यहाँ तक कि Windows (Windows Subsystem for Linux के माध्यम से) भी शामिल हैं।
आप निम्न कमांड का उपयोग करके नवीनतम संस्करण प्राप्त कर सकते हैं:
git clone https://github.com/splunk/DECEIVE
शेष निर्देश मानते हैं कि क्लोनिंग पूरी होने के बाद आपने अपनी वर्तमान निर्देशिका को रेपो में बदल लिया है।
DECEIVE Python निर्भरता और वर्चुअल वातावरण प्रबंधन के लिए uv का उपयोग करता है। यदि आपके पास पहले से uv स्थापित नहीं है, तो इसे Astral के स्टैंडअलोन इंस्टॉलर के साथ स्थापित करें:
curl -LsSf https://astral.sh/uv/install.sh | sh
इसके बाद, रेपोज़िटरी रूट से प्रोजेक्ट वातावरण को सिंक करें:
uv sync
pyproject.toml और uv.lock फ़ाइलें निर्भरताओं के लिए स्रोत हैं। यह परियोजना जानबूझकर requirements.txt फ़ॉलबैक को बनाए नहीं रखती।
SSH सर्वर को सुरक्षा संचार के लिए एक TLS कुंजी-युग्म की आवश्यकता होती है। रेपो की शीर्ष निर्देशिका से, निम्न कमांड का उपयोग करके एक SSH कुंजी-युग्म उत्पन्न करें:
ssh-keygen -t rsa -b 4096 -f SSH/ssh_host_key
SSH/config.ini.TEMPLATE फ़ाइल को SSH/config.ini में कॉपी करें:
SSH/config.ini फ़ाइल खोलें और सेटिंग्स की समीक्षा करें। आवश्यकतानुसार मान अपडेट करें, विशेष ध्यान [llm] अनुभाग के मानों पर दें, जहाँ आप उस LLM बैकएंड को कॉन्फ़िगर करेंगे जिसका आप उपयोग करना चाहते हैं, और [user_accounts] अनुभाग पर, जहाँ आप उन उपयोगकर्ता नामों और पासवर्डों को कॉन्फ़िगर कर सकते हैं जिन्हें हनीपॉट समर्थन करना चाहिए।
SSH/prompt.txt फ़ाइल को संपादित करके उस सिस्टम के प्रकार का संक्षिप्त विवरण शामिल करें जिसे आप उसे होने का दिखावा करने के लिए कहना चाहते हैं। यहाँ आपको बहुत विस्तृत होने की आवश्यकता नहीं है, हालाँकि आप जितने अधिक विवरण प्रदान करेंगे, अनुकरण उतना ही बेहतर होगा। आप इसे उच्च-स्तरीय रख सकते हैं, जैसे:
You are a video game developer's system. Include realistic video game source and asset files.
यदि आप चाहें, तो आप जो भी अतिरिक्त विवरण सहायक समझते हैं, जोड़ सकते हैं। उदाहरण के लिए:
You are the Internet-facing mail server for bigschool.edu, a state-sponsored university in Virginia. Valid user accounts are "a20093887", "a20093887-admin", and "mxadmin". Home directories are in "/home/$USERNAME". Everyone's default shell is /bin/zsh, except mxadmin's, which is bash. Mail spools for all campus users (be sure to include email accounts that are not valid for logon to this server) are in /var/spool/mail. Be sure to simulate some juicy emails there, but make them realistic. Some should be personal, but some should be just about the business of administering the school, dealing with students, applying for financial aid, etc. Make the spool permissions relaxed, simulating a misconfiguration that would allow anyone on the system to read the files.
DECEIVE हनीपॉट सर्वर शुरू करने के लिए, पहले सुनिश्चित करें कि आपने अपने चुने हुए LLM बैकएंड के लिए आवश्यक सभी पर्यावरण चर सेट कर लिए हैं। उदाहरण के लिए, यदि आप किसी भी OpenAI मॉडल का उपयोग कर रहे हैं, तो आपको OPENAI_API_KEY चर को इस प्रकार सेट करना होगा:
export OPENAI_API_KEY="<your secret API key>"
इसके बाद, रेपोज़िटरी रूट से SSH हनीपॉट चलाएँ:
uv run python SSH/ssh_server.py
आप SSH निर्देशिका में बदलकर भी चला सकते हैं:
uv run python ssh_server.py
सर्वर शुरू हो जाएगा और कॉन्फ़िगर किए गए पोर्ट पर आने वाले SSH कनेक्शनों के लिए सुनता रहेगा। यह कोई आउटपुट उत्पन्न नहीं करेगा, लेकिन अग्रभूमि (foreground) में निष्पादित होता रहेगा।
सर्वर चालू होने के बाद (इसमें कुछ सेकंड लग सकते हैं), कॉन्फ़िगर किए गए पोर्ट पर इसे एक्सेस करें। यदि आप Linux या UNIX-जैसी प्रणाली पर हैं, तो निम्न कमांड आज़माएँ (अपने कॉन्फ़िग के अनुसार "localhost" और "8022" को बदलें):
ssh guest@localhost -p 8022
uv sync चलाने के बाद, रेपोज़िटरी रूट से सभी परीक्षण चलाएँ:
uv run pytest
केवल SSH एकीकरण परीक्षण चलाने के लिए:
uv run pytest tests/test_ssh_integration.py
एकीकरण परीक्षण वास्तविक SSH सर्वर को एक स्थानीय यादृच्छिक पोर्ट पर शुरू करते हैं, एक SSH क्लाइंट के साथ जुड़ते हैं, और एक नियतात्मक (deterministic) नकली LLM बैकएंड का उपयोग करते हैं ताकि अभिकथन (assertions) लाइव मॉडल आउटपुट पर निर्भर न हों।
लॉग उस फ़ाइल में लिखे जाएँगे जो log_file कॉन्फ़िगरेशन विकल्प में निर्दिष्ट है। सापेक्ष log_file पथ लोड की गई कॉन्फ़िगरेशन फ़ाइल वाली निर्देशिका से हल किए जाते हैं, इसलिए डिफ़ॉल्ट टेम्पलेट मान SSH/ssh_log.log पर लिखता है।
DECEIVE लॉग JSON लाइन्स प्रारूप में हैं, जिसमें प्रत्येक पंक्ति एक पूर्ण JSON दस्तावेज़ है।
निम्नलिखित एक साधारण SSH सत्र का पूर्ण उदाहरण है, जिसमें उपयोगकर्ता ने दो सरल कमांड (pwd और exit) निष्पादित किए:
{"timestamp": "2025-01-10T20:37:55.018+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "SSH connection received", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 59, "funcName": "connection_made", "created": 1736541475.0183098, "msecs": 18.0, "relativeCreated": 13872.790813446045, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": null}
{"timestamp": "2025-01-10T20:37:55.177+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "Authentication success", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 75, "funcName": "begin_auth", "created": 1736541475.1775439, "msecs": 177.0, "relativeCreated": 14032.02486038208, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "username": "guest", "password": ""}
{"timestamp": "2025-01-10T20:37:57.456+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "LLM response", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 174, "funcName": "handle_client", "created": 1736541477.4568708, "msecs": 456.0, "relativeCreated": 16311.351776123047, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "V2VsY29tZSB0byBHYW1lRGV2IENvcnAncyBEZXZlbG9wbWVudCBFbnZpcm9ubWVudAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBXZWxjb21lLCBndWVzdCEgCiAgIExhc3QgbG9naW46IFR1ZSBPY3QgMjQgMTQ6MzI6MTUgMjAyMyBmcm9tIDE5Mi4xNjguMS4xMAogICBQcm9qZWN0czoKICAgICAtIEZhbnRhc3lRdWVzdAogICAgIC0gU3BhY2VFeHBsb3JlcnMKICAgICAtIFJhY2luZ01hbmlhCiAgIFN5c3RlbSBTdGF0dXM6IEFsbCBzeXN0ZW1zIG9wZXJhdGlvbmFsCiAgIFJlbWVtYmVyIHRvIGNvbW1pdCB5b3VyIGNoYW5nZXMhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmd1ZXN0QGRldi13b3Jrc3RhdGlvbjp+JCA="}
{"timestamp": "2025-01-10T20:37:59.333+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "User input", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 184, "funcName": "handle_client", "created": 1736541479.3334038, "msecs": 333.0, "relativeCreated": 18187.88480758667, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "cHdk"}
{"timestamp": "2025-01-10T20:38:00.189+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "LLM response", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 200, "funcName": "handle_client", "created": 1736541480.189375, "msecs": 189.0, "relativeCreated": 19043.855905532837, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "L2hvbWUvZ3Vlc3QKCmd1ZXN0QGRldi13b3Jrc3RhdGlvbjp+JCA="}
{"timestamp": "2025-01-10T20:38:01.944+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "User input", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 184, "funcName": "handle_client", "created": 1736541481.944072, "msecs": 944.0, "relativeCreated": 20798.552989959717, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "ZXhpdA=="}
{"timestamp": "2025-01-10T20:38:04.132+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "Session summary", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 151, "funcName": "session_summary", "created": 1736541484.1324642, "msecs": 132.0, "relativeCreated": 22986.945152282715, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "The user issued basic commands like `pwd` to check the current working directory and `exit` to terminate the session. This activity is typical of a benign user checking their environment upon logging in and then closing the session. There is no indication of reconnaissance, exploitation, or any post-foothold activity such as privilege escalation or data exfiltration. The actions appear to be standard and routine.\n\nJudgement: BENIGN", "judgement": "BENIGN"}
{"timestamp": "2025-01-10T20:38:04.139+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "SSH connection closed", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 65, "funcName": "connection_lost", "created": 1736541484.139776, "msecs": 139.0, "relativeCreated": 22994.2569732666, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": null}
ध्यान देने योग्य बातें:
task_name फ़ील्ड में एक अद्वितीय मान होता है जो SSH कनेक्शन प्राप्त होने पर आवंटित किया जाता है और उस सत्र के सभी लॉग प्रविष्टियों पर उपयोग किया जाता है।SSH connection receivedAuthentication successUser inputLLM responseSession summarySSH connection closeddetails फ़ील्ड भी होती है
User input संदेशों में details फ़ील्ड में संपूर्ण उपयोगकर्ता इनपुट की base64-एन्कोडेड प्रतिलिपि होती है, साथ ही एक interactive फ़ील्ड (true/false) होता है जो बताता है कि यह एक इंटरैक्टिव या गैर-इंटरैक्टिव कमांड था (अर्थात, क्या उन्होंने टर्मिनल सत्र के साथ लॉगिन किया या SSH कमांड-लाइन पर एक कमांड प्रदान की)।योगदान का स्वागत है! कृपया किसी भी बदलाव या सुधार पर चर्चा करने के लिए पुल रिक्वेस्ट सबमिट करें या issues खोलें।
यह परियोजना MIT License के अंतर्गत लाइसेंस प्राप्त है। विवरण के लिए LICENSE फ़ाइल देखें।
LLM response संदेशों में details फ़ील्ड में संपूर्ण अनुकरणित प्रतिक्रिया की base64-एन्कोडेड प्रतिलिपि होती है।Session summary संदेशों में न केवल कमांडों का सारांश होता है, बल्कि एक अनुमान भी होता है कि उनका उद्देश्य क्या रहा होगा। एक judgement फ़ील्ड भी होगी जिसमें "BENIGN", "SUSPICIOUS", या "MALICIOUS" में से एक होगा।Authentication success संदेशों में, username और password फ़ील्ड में पाए जाते हैं।