
خادم SMB1 لاعتراض تجزئة NTLMv2، مكتوب بلغة C.
خادم SMB1 لاعتراض تجزئات NTLMv2، مكتوب بلغة 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 بالبايتات.
يتم تتبع كل اتصال عميل عبر بنية حالة (client_t في server.h) والتي، بالإضافة إلى حالة آلة الحالة، تحتفظ بـ:
rx_buf) مع طوله، لتخزين البيانات المقروءة من المقبس ولكن لم تتم معالجتها بالكامل بعد؛tx_buf، مع إزاحة tx_off) لتخزين البيانات المراد إرسالها إلى العميل ولكن لم يتم نقلها بالكامل بعد؛netbios_header_recv و netbios_msg_len لتتبع رأس NetBIOS.عند استلام البيانات، يتم التحقق من استلام 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-like).يتم تضمين 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
[*] Version: 1.0
[*] Author: Lcky <luca9vinci at gmail dot com>
[*] Server Info
Port: 9090
Max Clients: 50
[*] Listening on port 9090
[*] Waiting for connections...
[INTERCEPTED] Username: test
[INTERCEPTED] Hostname: KALILINUX-2023-02
[INTERCEPTED] Domain : WORKGROUP
[INTERCEPTED] Hash : test::WORKGROUP:c4ba87a265de9e09:3482d0efa64fc09a94e44faa83d2a936:01010000000000009A3DE84B6235DD01D36FD06DFF4D64BB000000000200080038004E004900490001001E00570049004E002D00310046005800340055004D005000530034005400420004003400570049004E002D00310046005800340055004D00500053003400540042002E0038004E00490049002E004C004F00430041004C000300140038004E00490049002E004C004F00430041004C000500140038004E00490049002E004C004F00430041004C0008003000300000000000000000000000000000000CAFEB574B56CB6139E261228FBFE3075B4FA9393A3B71031AF3280F4D5A27D00A0010000000000000000000000000000000000009001C0063006900660073002F003100320037002E0030002E0030002E00310000000000
^C
[*] Stopping the server...
| الملف | الوصف |
|---|
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 | فك ترميز رمز SPNEGO (التفاوض على آلية المصادقة، استخراج كتلة NTLMSSP) الموجودة في رسائل SMB |
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 | أداة للتعامل مع ترتيب البايتات (تحويلات little/big endian في وقت التشغيل) |
test.c, test2.c | ملفات اختبار/تجربة للمحللات |
docs/ | الرسوم البيانية والمواد الداعمة (مخطط آلة الحالة، الحلقة الرئيسية) |