
SMB1 सर्वर NTLMv2 हैश इंटरसेप्शन के लिए, C में लिखा गया।
NTLMv2 हैश को इंटरसेप्ट करने के लिए SMB1 सर्वर, C में लिखा गया।
इस परियोजना का लक्ष्य एक SMB1 सर्वर को एक स्टेट मशीन के रूप में लागू करना है जो क्लाइंट अनुरोधों को सही ढंग से स्वीकार और प्रतिक्रिया देता है ताकि उसे धोखा दिया जा सके, जिससे वह NTLM प्रमाणीकरण पूरा कर सके और इस प्रकार अपना स्वयं का NTLMv2 हैश प्रकट कर सके (hashcat/john के साथ संगत प्रारूप में)।
यह उपकरण आक्रामक सुरक्षा/रेड टीमिंग गतिविधियों और शैक्षिक उद्देश्यों (SMB1/NTLM प्रोटोकॉल का अध्ययन) के लिए है, जिसका उपयोग केवल अधिकृत वातावरण में किया जाना चाहिए जो आपके स्वामित्व में है या स्पष्ट सहमति के साथ।
सर्वर एक वैध SMB1 सर्वर होने का दिखावा करता है और क्लाइंट को 3-चरणीय स्टेट मशीन के माध्यम से मार्गदर्शन करता है:

| स्टेट | संक्रमण |
|---|---|
1. NEGOTIATE | यदि SMB NEGOTIATE आता है, सर्वर की प्रतिक्रिया के बाद स्टेट 2. CHALLENGE में चला जाता है |
2. CHALLENGE | यदि NTLM_NEGOTIATE आता है, सर्वर की प्रतिक्रिया के बाद स्टेट 3. AUTH में चला जाता है |
3. AUTH | यदि NTLM_AUTH आता है, सर्वर की प्रतिक्रिया के बाद स्टेट 1. NEGOTIATE पर वापस आ जाता है |
कार्यान्वयन स्तर पर, बाहरी NetBIOS "लिफाफे" को ध्यान में रखा जाना चाहिए, जिसमें 4 बाइट्स होते हैं, जिनमें से अंतिम 3 SMB पैकेट की लंबाई बाइट्स में दर्शाते हैं।
प्रत्येक क्लाइंट कनेक्शन को एक स्टेट संरचना (server.h में client_t) के माध्यम से ट्रैक किया जाता है, जो स्टेट मशीन की स्थिति के अलावा निम्नलिखित बनाए रखता है:
rx_buf) अपनी लंबाई के साथ, सॉकेट से पढ़े गए लेकिन अभी तक पूरी तरह से संसाधित नहीं किए गए डेटा को बफर करने के लिए;tx_buf, ऑफसेट tx_off के साथ) क्लाइंट को भेजे जाने वाले लेकिन अभी तक पूरी तरह से प्रसारित नहीं किए गए डेटा को बफर करने के लिए;netbios_header_recv और netbios_msg_len फ़ील्ड।डेटा प्राप्त होने पर, यह जांचा जाता है कि कम से कम 4 बाइट्स (NetBIOS हेडर) प्राप्त हुए हैं, SMB संदेश की लंबाई निर्धारित की जाती है, स्टेट फ़ील्ड अपडेट किए जाते हैं, और अंत में संदेश संसाधित किया जाता है, अगले रिसेप्शन के लिए क्लाइंट की स्थिति अपडेट की जाती है।
सर्वर का मुख्य लूप कई कनेक्शनों को एक साथ गैर-अवरोधक तरीके से संभालने के लिए poll() पर आधारित है:

जब NTLM प्रमाणीकरण पूरा हो जाता है, सर्वर स्क्रीन पर ([INTERCEPTED] ...) उपयोगकर्ता नाम, होस्टनाम, डोमेन और कैप्चर किया गया NTLMv2 हैश प्रिंट करता है, प्रारूप में:
username::domain:server_challenge:ntlmv2_response:blob
hashcat (मोड -m 5600) या john जैसे क्रैकिंग टूल के साथ उपयोग के लिए तैयार।
gcc/clang) और POSIX टूलचेन (कोड BSD सॉकेट, poll(), signal() आदि का उपयोग करता है, इसलिए यह Linux/Unix-जैसे वातावरण के लिए है)।एक Makefile शामिल है:
make # मुख्य सर्वर बनाएं -> ./impostor
make debug # डीबग बिल्ड (प्रतीक, -O0, AddressSanitizer/UBSan)
make clean # उत्पन्न ऑब्जेक्ट फ़ाइलें और निष्पादन योग्य हटाएं
make run # सर्वर बनाएं और चलाएं
वैकल्पिक रूप से, एक समकक्ष मैनुअल संकलन कमांड है:
gcc -o impostor server.c smb1_parser.c spnego_decoder.c asn1_parser.c ntlm_parser.c
./impostor [port]
port (वैकल्पिक): TCP पोर्ट जिस पर सर्वर सुनता है। यदि छोड़ा गया है, तो server.h में परिभाषित डिफ़ॉल्ट पोर्ट (SERVER_PORT, 9000) का उपयोग किया जाता है। यह 1 और 65535 के बीच का मान होना चाहिए।स्टार्टअप पर, सर्वर एक बैनर, संस्करण और कॉन्फ़िगरेशन जानकारी (पोर्ट, अधिकतम क्लाइंट संख्या) प्रिंट करता है, फिर कनेक्शन के लिए सुनता रहता है। जब NTLMv2 हैश कैप्चर होता है, तो इंटरसेप्ट किया गया डेटा (उपयोगकर्ता नाम, होस्टनाम, डोमेन, हैश) स्क्रीन पर प्रिंट होता है। सर्वर को Ctrl+C (SIGINT) के साथ रोका जा सकता है, जिसे intHandler द्वारा संभाला जाता है।
___ ___ _ ___
|_ _|_ __ ___ _ __ / _ \ ___| |_ / _ \ _ __
| || '_ ` _ \| '_ \| | | / __| __| | | | '__|
| || | | | | | |_) | |_| \__ \ |_| |_| | |
|___|_| |_| |_| .__/ \___/|___/\__|\___/|_|
|_| (v.1.0) by Lcky
[*] संस्करण: 1.0
[*] लेखक: Lcky <luca9vinci at gmail dot com>
[*] सर्वर जानकारी
पोर्ट: 9090
अधिकतम क्लाइंट: 50
[*] पोर्ट 9090 पर सुन रहा है
[*] कनेक्शन की प्रतीक्षा कर रहा है...
[INTERCEPTED] उपयोगकर्ता नाम: test
[INTERCEPTED] होस्टनाम: KALILINUX-2023-02
[INTERCEPTED] डोमेन : WORKGROUP
[INTERCEPTED] हैश : test::WORKGROUP:c4ba87a265de9e09:3482d0efa64fc09a94e44faa83d2a936:01010000000000009A3DE84B6235DD01D36FD06DFF4D64BB000000000200080038004E004900490001001E00570049004E002D00310046005800340055004D005000530034005400420004003400570049004E002D00310046005800340055004D00500053003400540042002E0038004E00490049002E004C004F00430041004C000300140038004E00490049002E004C004F00430041004C000500140038004E00490049002E004C004F00430041004C0008003000300000000000000000000000000000000CAFEB574B56CB6139E261228FBFE3075B4FA9393A3B71031AF3280F4D5A27D00A0010000000000000000000000000000000000009001C0063006900660073002F003100320037002E0030002E0030002E00310000000000
^C
[*] सर्वर रोका जा रहा है...
| फ़ाइल | विवरण |
|---|
server.c / server.h | प्रवेश बिंदु, TCP लिसनर सेटअप, क्लाइंट स्टेट मशीन, poll() पर आधारित मुख्य लूप, RX/TX बफरिंग, इंटरसेप्ट किए गए हैश की प्रिंटिंग |
smb1_parser.c / smb1_parser.h | SMB1 पैकेटों का पार्सिंग/निर्माण (हेडर, NEGOTIATE, SESSION_SETUP कमांड, फ्लैग/flags2, आदि) |
spnego_decoder.c / spnego_decoder.h | SMB संदेशों में निहित SPNEGO टोकन का डिकोडिंग (प्रमाणीकरण तंत्र की बातचीत, NTLMSSP ब्लॉब का निष्कर्षण) |
asn1_parser.c / asn1_parser.h | न्यूनतम ASN.1 DER पार्सर, SPNEGO डिकोडर द्वारा ASN.1 संरचना वृक्ष बनाने के लिए उपयोग किया जाता है |
ntlm_parser.c / ntlm_parser.h | NTLMSSP संदेशों का पार्सिंग (NEGOTIATE, CHALLENGE, AUTHENTICATE) और उपयोगकर्ता नाम, डोमेन, होस्टनाम और NTLMv2 प्रतिक्रिया का निष्कर्षण |
endianness.h | एंडियननेस को संभालने के लिए उपयोगिता (रनटाइम पर लिटिल/बिग एंडियन रूपांतरण) |
test.c, test2.c | पार्सरों के लिए परीक्षण/प्रयोग फ़ाइलें |
docs/ | आरेख और सहायक सामग्री (स्टेट मशीन योजना, मुख्य लूप) |