
Spip नेटवर्क सेंसर जो Go में लिखा गया है
Spip एक हल्का, निम्न-इंटरैक्शन नेटवर्क हनीपॉट सेंसर है। यह किसी भी आने वाले TCP ट्रैफ़िक (सादा और TLS) को सुनता है, स्कैनर और बॉट द्वारा भेजे गए डेटा को कैप्चर करता है, और प्रत्येक कनेक्शन को संरचित JSON (ECS-आकार) के रूप में लॉग करता है ताकि आपके SIEM या डेटा लेक में आसानी से लिया जा सके।
Spip सेंसर HoneyLabs को शक्ति प्रदान करते हैं, जो कैप्चर किए गए डेटा पर निर्मित एक मुफ्त, क्वेरी करने योग्य खतरा खुफिया प्लेटफ़ॉर्म है। Spip द्वारा व्यवहार में एकत्रित किए जाने वाले डेटा को देखने के लिए, वहां लाइव प्रति-IP रिपोर्ट या सेंसर नेटवर्क से उत्पन्न साप्ताहिक खतरा रिपोर्ट ब्राउज़ करें।

पूर्वापेक्षाएँ
iptables होgit clone https://github.com/honeylabshq/Spip-Go.git
cd Spip-Go
go build -o spip-agent ./cmd/spip-agent
sudo ./scripts/initial_setup.sh
यह सहायक एक config.toml लिखता है (यह लॉग में उपयोग किए जाने वाले एक छोटे name के लिए संकेत देता है), स्व-हस्ताक्षरित TLS कुंजियाँ उत्पन्न कर सकता है, वैकल्पिक रूप से Loom (URL, sensor_id, token, आदि) कॉन्फ़िगर करता है, और वैकल्पिक रूप से नीचे दिए गए उदाहरणों में उपयोग किए जाने वाले PREROUTING iptables रीडायरेक्ट को लागू करता है।
config.toml बनाएं या संपादित करें
न्यूनतम config.toml:name = "spip-agent"
ip = "127.0.0.1"
port = 8080
वैकल्पिक कॉन्फ़िगरेशन कुंजियाँ:
cert_path / key_path — दोनों सेट होने पर TLS सक्षम करें; कॉन्फ़िग फ़ाइल के सापेक्ष हो सकता है (सेटअप स्क्रिप्ट सापेक्ष पथ लिखती है ताकि कॉन्फ़िग किसी भी कार्यशील निर्देशिका से काम करे)log_file (स्थानीय) और/या [loom] (दूरस्थ)। नीचे लॉग आउटपुट देखें।read_timeout_seconds / write_timeout_seconds — कनेक्शन टाइमआउटrate_limit_per_second / rate_limit_burst — कनेक्शन दर-सीमाcommunity_id_seed — Community ID v1 फ्लो हैशिंग के लिए वैकल्पिक 16-बिट बीज (डिफ़ॉल्ट के लिए छोड़ें या 0 दें)यदि ये रनटाइम ट्यूनिंग फ़ील्ड छोड़ दिए जाते हैं या 0 पर सेट किए जाते हैं, तो Spip निम्नलिखित डिफ़ॉल्ट लागू करता है:
read_timeout_seconds: 30write_timeout_seconds: 10rate_limit_per_second: 20rate_limit_burst: 50000sudo iptables -t nat -F
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
sudo iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-port 8080
./spip-agent -config config.toml
Spip ECS लॉग को एक ही स्थानीय गंतव्य पर लिखता है और वैकल्पिक रूप से उन्हीं लॉग को Loom सर्वर पर भेज सकता है:
तो: स्थानीय डिफ़ॉल्ट stdout है; फ़ाइल के लिए log_file से ओवरराइड करें। वैकल्पिक रूप से शीर्ष पर Loom जोड़ें। दोनों एक ही ECS प्रारूप का उपयोग करते हैं।
log_file को टिप्पणी/खाली छोड़ें (stdout) या एक पथ पर सेट करें।url, sensor_id, token के साथ [loom] अनुभाग जोड़ें (नीचे Loom देखें)।Spip प्रत्येक कनेक्शन को एकल JSON ऑब्जेक्ट के रूप में उत्सर्जित करता है। आउटपुट को ECS-संगत बनाने के लिए केवल वे फ़ील्ड का उपयोग करके स्वरूपित किया जाता है जो Spip प्रदान कर सकता है (कोई ASN/जियो संवर्धन नहीं)। उत्पादित विशिष्ट फ़ील्ड में शामिल हैं:
@timestamp — ईवेंट के लिए RFC3339 टाइमस्टैम्पevent.id — प्रति-कनेक्शन सत्र पहचानकर्ताobserver.hostname / host.name — कॉन्फ़िग से एजेंट namesource.ip, source.port और destination.ip, destination.portnetwork.transport — जैसे tcphttp.request.body / url.path — जब पेलोड स्पष्ट रूप से HTTP जैसा दिखता हैuser_agent.original — जब उपलब्ध होSpip द्वारा उत्पादित (ECS-आकार) रिकॉर्ड का उदाहरण:
{
"@timestamp": "2025-12-01T19:35:18.123Z",
"event": {
"id": "bd30cdc1-95b0-49aa-b8fe-e77230b6a04f",
"summary": "BitTorrent protocol",
"original_payload_hex": "426974546f7272656e742070726f746f636f6c",
"ingested_by": "spip"
},
"observer": {"hostname": "spip-agent"},
"host": {"name": "spip-agent"},
"source": {"ip": "146.70.1.1", "port": 35882},
"destination": {"ip": "146.190.1.1", "port": 6881},
"network": {"transport": "tcp"}
}
नोट: एजेंट केवल वे फ़ील्ड उत्सर्जित करता है जो वह कनेक्शन पेलोड और मेटाडेटा से प्राप्त कर सकता है। डाउनस्ट्रीम सिस्टम चाहें तो इन रिकॉर्ड को समृद्ध कर सकते हैं (जियो, ASN, आदि)।
Spip प्रत्येक कनेक्शन रिकॉर्ड में निष्क्रिय फिंगरप्रिंटिंग फ़ील्ड जोड़ सकता है (ECS-संगत, पेलोड कैप्चर में कोई बदलाव नहीं):
network.community_id) — 5-टपल (स्रोत/गंतव्य आईपी और पोर्ट, प्रोटोकॉल) का v1 फ्लो हैश। जब ट्रैफ़िक iptables के माध्यम से रीडायरेक्ट किया जाता है, Spip मूल गंतव्य (REDIRECT से पहले) का उपयोग करता है ताकि हैश उसी फ्लो के लिए अन्य टूल (जैसे Zeek, Suricata) द्वारा गणना किए गए हैश से मेल खाए।tls.client.server_name (SNI), tls.client.supported_protocols (ALPN सूची), tls.client.hash.ja4 (JA4 फिंगरप्रिंट)।http.request.hash.ja4h (JA4H)।SSH-2.0- से शुरू होता है और इसमें KEXINIT होता है: ssh.client.hash.hassh (Hassh)।ये सभी योगात्मक हैं; मौजूदा व्यवहार (स्थानीय लॉग, Loom, पेलोड हेक्स, HTTP पार्सिंग) अपरिवर्तित है।
संदर्भ (सत्यापन और श्रेय के लिए):
कम्युनिटी आईडी: Corelight कम्युनिटी आईडी विनिर्देश।
JA4 / JA4H: FoxIO JA4।
Hassh: Salesforce HASSH।
TLS फिंगरप्रिंटिंग github.com/psanford/tlsfingerprint (MIT) का उपयोग करता है।
लॉग आउटपुट का भाग: जब [loom] में enabled = true होता है, तो उसी ECS रिकॉर्ड को बैच किया जाता है और आपके Loom इन्जेस्ट URL पर POST किया जाता है। सक्षम होने पर आवश्यक: url, sensor_id, token। वैकल्पिक: batch_size (डिफ़ॉल्ट 50), flush_interval (जैसे "10s"), insecure_skip_verify (स्व-हस्ताक्षरित Loom प्रमाणपत्रों के लिए)। एक्सपोर्टर एसिंक्रोनस रूप से चलता है और कैप्चर लूप को ब्लॉक नहीं करता है; असफल POST को stderr पर लॉग किया जाता है और बैच को हटा दिया जाता है (फेल-ओपन)।
.
├── cmd/ # मुख्य एप्लिकेशन प्रवेश बिंदु
├── internal/ # कॉन्फ़िग, लॉगिंग, नेटवर्क, TLS, फिंगरप्रिंटिंग, एक्सपोर्टर (जैसे Loom)
├── pkg/ # Linux सॉकेट सहायक (syscall के माध्यम से SO_ORIGINAL_DST)
├── test/ # एंड-टू-एंड परीक्षण सहायक
└── scripts/ # उपयोगिता स्क्रिप्ट (जिनमें `initial_setup.sh` शामिल है)
यूनिट परीक्षण चलाएँ:
go test ./...
एंड-टू-एंड परीक्षण के लिए iptables में हेरफेर करने के लिए विशेषाधिकारों की आवश्यकता होती है। उन्हें स्क्रिप्ट के माध्यम से चलाएँ (रिपॉजिटरी रूट से):
sudo -E ./scripts/run_e2e_tests.sh
स्क्रिप्ट वातावरण और iptables सेट करती है। वैकल्पिक रूप से कंटेनर सहायक का उपयोग करें: ./scripts/run_e2e_in_container.sh। E2E मुख्य व्यवहार को मान्य करता है (पेलोड कैप्चर, स्रोत/गंतव्य, TLS पहचान, Loom बैचिंग, फिंगरप्रिंटिंग)।
Spip कैप्चर किए गए पेलोड से सर्वोत्तम-प्रयास HTTP अनुरोध पहचान करता है। जब पेलोड स्पष्ट रूप से HTTP अनुरोध (मान्य अनुरोध लाइन और बुनियादी हेडर या ALPN) जैसा दिखता है, तो एजेंट http.*, url.path, और user_agent.original फ़ील्ड उत्सर्जित करता है। जब ऐसा नहीं होता है, Spip पेलोड को event.summary में संग्रहीत करने का सहारा लेता है और हमेशा कच्चे पेलोड हेक्स को event.original_payload_hex में संरक्षित करता है।
चूंकि Spip अपने प्रतिक्रियाओं में स्रोत IP को प्रतिबिंबित करता है और किसी भी आने वाले TCP ट्रैफ़िक को स्वीकार करता है, यह नियंत्रित/निगरानी वातावरण में हनीपॉट-शैली सेंसर या एज कलेक्टर के रूप में उपयोग के लिए है, न कि मनमाने उपयोगकर्ता एंडपॉइंट पर।
रिपॉजिटरी रूट से इंटरैक्टिव सहायक चलाएँ (iptables नियम लागू करते समय रूट की आवश्यकता होती है):
sudo ./scripts/initial_setup.sh
स्क्रिप्ट निम्नलिखित के लिए संकेत देती है: एक छोटा name (config.toml में लिखा जाता है, लॉग में observer.hostname / host.name के रूप में उपयोग किया जाता है), सुनने के लिए IP और पोर्ट, वैकल्पिक स्व-हस्ताक्षरित TLS प्रमाणपत्र निर्माण (पथ कॉन्फ़िग के सापेक्ष लिखे जाते हैं ताकि वे किसी भी निर्देशिका से काम करें), वैकल्पिक Loom कॉन्फ़िगरेशन (URL, sensor_id, token, batch_size, flush_interval, TLS सत्यापन), लॉग फ़ाइल पथ, और वैकल्पिक iptables PREROUTING रीडायरेक्ट।
| गंतव्य |
|---|
| कॉन्फ़िग |
|---|
| व्यवहार |
|---|
| स्थानीय | log_file | डिफ़ॉल्ट: छोड़ें या खाली छोड़ें → stdout। एक पथ पर सेट करें → वह फ़ाइल। दो में से एक, हमेशा चालू। |
| Loom | [loom] with enabled = true | वैकल्पिक। उसी ईवेंट को बैच किया जाता है और स्थानीय के अलावा आपके Loom इन्जेस्ट URL पर POST किया जाता है। |
event.summary — गैर-HTTP प्रोब के लिए कच्चा पेलोडevent.original_payload_hex — कच्चा पेलोड हेक्स (हमेशा संरक्षित)network.community_id, tls.client.*, http.request.hash.ja4h, ssh.client.hash.hassh जोड़ता है।