المجتمع DFIR

شرح Impacket بالعربي: وش الفرق بين المكتبة وسكربتاتها، وكيف تختار الأداة المناسبة؟

تبحث عن تثبيت Impacket، ثم تلقى شرحًا يشغل GetADUsers.py وشرحًا ثانيًا يبدأ بأمر مختلف تمامًا. تكتب impacket في الطرفية وما يظهر لك شيء يشبه الصور. هنا المشكلة غالبًا في تصور الاسم: Impacket مشروع يضم مكتبة للتعامل مع بروتوكولات الشبكة وأمثلة برامج تستخدمها، وليس برنامجًا واحدًا بواجهة تجمع كل الوظائف. فهم هالفرق يوفر عليك وقت التثبيت، ويساعدك تختار وظيفة مناسبة بدل تشغيل سكربت مشهور ما يجاوب عن سؤالك.

المكتبة تحت، والبرنامج اللي تستخدمه فوق

المكتبة توفر مكونات برمجية يستخدمها المطور للتعامل مع بروتوكولات مثل SMB وMSRPC وأجزاء من LDAP وغيرها. أما سكربت المثال فيبني على تلك المكونات لينفذ وظيفة محددة، ويعرض خيارات ومخرجات تناسبها. المستخدم في الطرفية يتعامل عادة مع السكربت، بينما الكود داخل السكربت يستدعي المكتبة.

تخيل أنك تريد قراءة بعض بيانات مستخدمي دومين تدريبي. هذا سؤال مختلف عن فتح جلسة عميل SMB على خادم ملفات. الاثنين قد يستخدمان المشروع نفسه، لكنهما لا يستخدمان البروتوكول والخيارات والنتيجة نفسها. معرفة أن Impacket مثبت لا تثبت أن السكربت الذي تحتاجه موجود بالاسم الذي تتوقعه، ولا أن بيئة Python تستدعي الإصدار المقصود.

وفائدة الفهم لمختبر الاختراق أنه يقدر يفصل بين ثلاث طبقات عند حدوث خطأ: استدعاء البرنامج محليًا، وتنفيذ وظيفة السكربت، ورد الخدمة على الشبكة. إذا فشل الاستيراد في Python قبل الاتصال، ما عندك بعد دليل على حالة الدومين. وإذا وصل السكربت إلى الخدمة ورفضت العملية، فهذا سؤال متعلق بالهوية أو التفويض أو السياسة، لا مجرد حزمة ناقصة.

المشروع يحتوي برامج بوظائف وآثار متفاوتة. بعضها مناسب لقراءة محدودة في اللاب، وبعضها يتعامل مع تنفيذ بعيد أو بيانات شديدة الحساسية. لذلك لا تقل إن «استخدام Impacket» خطوة واحدة لها أثر واحد. اذكر اسم البرنامج والعملية والنطاق كلما وصفت تجربة أو نتيجة.

المصدر والإصدار أهم من رقم في صورة قديمة

المستودع الرسمي الحالي للمشروع تحت fortra/impacket، وصيانته لدى Core Security التابعة لـ Fortra. ابدأ من هذا المصدر لمعرفة الإصدارات والتعليمات، ثم اختر إصدارًا واضحًا للتجربة. مو كل نسخة تظهر في شرح قديم هي التي ستثبتها اليوم، ولا كل خيار في فرع التطوير موجود في الإصدار المستقر عندك.

التوثيق الرسمي يفرق بين الإصدار المستقر وفرع التطوير. هذا فرق عملي؛ إذا حملت ملف مثال جديدًا وشغلته فوق مكتبة أقدم، قد يستورد وظيفة ما كانت موجودة بعد. عندها تظهر مشكلة توافق تبدو كأنها خطأ في الهدف، مع أن السكربت والمكتبة عندك من زمنين مختلفين.

في دفتر اللاب سجل مصدر التثبيت والإصدار وطريقة استدعاء البرنامج. وإذا كنت تستخدم ملفًا من المستودع، سجل المرجع الذي أخذته منه، مثل إصدار أو commit معلوم. الرابط إلى master وحده يتغير مع الوقت، لذلك ما يعطي شخصًا آخر نفس الحالة بالضرورة بعد أشهر.

لا تحتاج آخر نسخة تطوير لكل تجربة. ابدأ بإصدار مناسب ومستقر، ثم انتقل لإصدار آخر لسبب واضح: إصلاح موثق أو خاصية تحتاجها وتفهم أثرها. التحديث المتكرر وسط لاب طويل يمكن يصعب عليك إعادة التجربة، خصوصًا إذا تغيرت الاعتماديات أو تنسيق النتائج. عند المقارنة، احتفظ ببيئة منفصلة بدل جعل كل ملاحظاتك مرتبطة بحالة تثبيت تتبدل يوميًا.

التثبيت: افصل تطبيق Python عن بيئة النظام

دليل المشروع يوصي باستخدام pipx لتثبيت التطبيق على مستوى استخدام الطرفية. الفكرة أن pipx يجهز بيئة افتراضية للتطبيق ويتيح أوامره، بدل خلط اعتمادياته بكل مكتبات Python في النظام. إذا كان pipx مجهزًا عندك، يعرض المستودع هذا المثال للتثبيت من الحزمة المستقرة:

python3 -m pipx install impacket

هذا أمر تثبيت محلي، وليس أمر فحص للشبكة. استخدمه فقط بالطريقة التي تناسب جهاز اللاب وسياسة أدواتك، وراجع التعليمات الرسمية لنظامك إذا pipx غير جاهز. لا تعالج فشل التثبيت بإجبار الكتابة في بيئة النظام أو حذف حزم لا تعرف علاقتها ببرامج أخرى.

بعد التثبيت اقرأ قائمة التطبيقات التي أتاحها pipx، وتحقق من الأسماء الفعلية. بعض طرق التوزيع توفر أسماء بأشكال تختلف عن أسماء ملفات examples في المستودع. لذلك البرنامج الذي تعرفه باسم GetADUsers.py قد يظهر تحت تسمية يضيفها موزع الحزمة. الاسم الذي تناديه في الطرفية لازم يكون الاسم المثبت عندك، وليس بالضرورة النص الموجود في عنوان شرح.

وإذا اخترت مدير حزم التوزيعة، تابع تحديث تلك النسخة بالطريقة نفسها واعرف مكانها. وجود نسختين مو خطأ تلقائيًا، لكن عدم معرفة أيهما تعمل به خطأ في تنظيم التجربة. لا تحدث نسخة pipx ثم تحكم على مخرجات برنامج تستدعيه الطرفية من مسار تابع لحزمة أخرى.

بيئة افتراضية تحمي تنظيم الاعتماديات، لكنها ما تجعل كل وظيفة في التطبيق بلا أثر. تثبيت الأداة شيء، والتصريح بتشغيل برنامجها على خدمة معينة شيء آخر.

ابدأ بمساعدة السكربت، بدون هدف وبدون أسرار

إذا عندك نسخة رسمية مجهزة من أمثلة المشروع، يمكن قراءة مساعدة ملف محلي مثل:

python3 GetADUsers.py -h

أو:

python3 smbclient.py -h

هذي أمثلة على تشغيل ملفات موجودة في مجلد الأمثلة المعتمد عندك. مو أوامر تنزل الملفات، ولا يفترض أنها موجودة في أي مجلد تفتح فيه الطرفية. إن كانت طريقة التثبيت وفرت أوامر جاهزة، استخدم أسماءها الفعلية بدل تغيير المجلدات عشوائيًا للبحث عن الملف.

المساعدة تكشف لك السؤال الذي صُمم البرنامج له، وشكل الهدف، وخيارات الاتصال والمصادقة. اقرأ وصف target بعناية. طريقة كتابة الدومين والحساب والوجهة قد تختلف بين سكربتين من المشروع نفسه. نسخ صيغة هدف من برنامج إلى آخر بدون مراجعة يمكن يقدم هوية ناقصة أو يوجه الاتصال إلى جهة مختلفة.

لا تضع كلمة مرور في تجربة المساعدة. ما تحتاجها لمعرفة الخيارات، ولا تحتاج تفتح اتصالًا لتكتشف اسم معامل. وحتى حين تنتقل إلى لاب فعلي، راجع كيف يتعامل السكربت المحدد مع إدخال السر؛ لا تعمم أن جميع البرامج تطلب كلمة المرور تفاعليًا بالطريقة نفسها.

إذا المساعدة نفسها تفشل بسبب import error، توقف عند البيئة المحلية. أصلح توافق السكربت مع المكتبة ثم راجع المساعدة مرة ثانية. ما فيه داعي ترسل طلبات للشبكة قبل أن يصبح البرنامج قادرًا على البدء بشكل صحيح.

مثال GetADUsers: الاسم يوحي بجميع المستخدمين، لكن راجع الفلتر

GetADUsers.py مثال لقراءة بيانات مستخدمي الدومين باستخدام LDAP. المعلومة المهمة هنا أن اسم البرنامج وحده ما يحدد تغطية القراءة. في الكود الرسمي الذي راجعناه، السلوك الافتراضي يستخدم شروطًا تشمل وجود عنوان بريد وعدم تعطيل الحساب، بينما خيار -all يغير شروط القراءة ليشمل نطاقًا أوسع من الحسابات.

وش يعني هذا في اللاب؟ إذا حساباتك الوهمية ما لها قيمة mail، قد يكون الدليل مليان مستخدمين ومع ذلك ما تظهر لك القائمة التي توقعتها. النتيجة ما تثبت أن الدومين بلا مستخدمين، ولا أن المصادقة فشلت. قبل أي تغيير، اقرأ المساعدة وسلوك إصدارك، واسأل هل الحسابات التجريبية تطابق الفلتر الافتراضي.

وخيار يوسع النتائج مو علاجًا تلقائيًا في مهمة عمل. تأكد أن نطاق الجمع يسمح بتلك القراءة، وأنها تجاوب عن السؤال. لو المطلوب حساب واحد، راجع خيار التحديد الموجود في نسختك بدل جمع الجميع. وإذا الأداة لا تتيح الحدود التي تحتاجها، اختَر استعلامًا آخر يسمح بضبط مكان البحث، مثل قراءة LDAP محدودة تحت OU تدريبية.

هذا مثال ممتاز على فائدة النظر إلى الكود بدون الحاجة لتكون مطورًا خبيرًا. تقدر تبدأ عند جزء بناء searchFilter وقائمة attributes، وتشوف أن الأداة تسأل الدليل عن خصائص محددة. بعده تفصل بين «ما أرجعه الاستعلام» و«ما يوجد في البيئة». هذا الفرق سيظهر مع أدوات كثيرة غير Impacket.

مثال smbclient.py: لا تخلطه مع برنامج Samba

يوجد في أمثلة Impacket برنامج smbclient.py، وفي أنظمة كثيرة يوجد كذلك برنامج smbclient من مشروع Samba. تشابه الاسم ما يعني أنهما البرنامج نفسه. يختلف شكل المساعدة وطريقة كتابة الهدف والخيارات، وقد تختلف أوامر الجلسة وطرق التعامل مع الأخطاء.

إذا قرأت شرح Samba وفيه -L، لا تنقل الخيار إلى مثال Impacket وتتوقع الوظيفة نفسها. راجع المساعدة للبرنامج الذي تعمل به. كذلك لا تربط رقم إصدار Samba برقم إصدار مكتبة Impacket؛ كل مشروع له مسار تطوير وتوزيع مستقل.

في مثال Impacket، البرنامج يجهز اتصال SMB ثم واجهة عميل مصغرة. وجود هذه الواجهة ما يعني أنك داخل shell نظام التشغيل على الخادم. أوامر عميل الملفات مرتبطة بوظائف SMB المتاحة له، ولا ينبغي وصفها كأنها تنفيذ أوامر نظام بعيد لمجرد ظهور prompt جديد.

الواجهة قد تدعم عمليات ذات أثر مختلف، منها قراءة ورفع أو تغيير محتوى بحسب الوظيفة والصلاحيات. لذلك افتح المساعدة وتحدد ما تنوي استخدامه قبل تنفيذ أي أمر داخل الجلسة. إذا سؤال اللاب جرد أسماء فقط، لا تستخدم عملية كتابة أو تنزيل جماعي. وإذا تحتاج إثبات قراءة، استخدم ملفًا وهميًا واحدًا متفقًا عليه، وفرق في التقرير بين رؤية الاسم وقراءة المحتوى.

اختيار العميل المناسب يعتمد على السؤال وبيئتك والتوثيق الذي تحتاجه، مو على أن اسمًا معينًا أكثر شهرة في شروحات الاختراق.

كيف تقرأ ملف مثال بدون ما تضيع في كل الأسطر؟

ابدأ بوصف الملف في أعلاه، ثم تعريف خيارات الطرفية، ثم الدالة التي تنفذ العملية الرئيسية. هذا الترتيب يعطيك خريطة: وظيفة البرنامج، وما الذي يقبله من المستخدم، وما الذي يرسله للخدمة. بعدها اقرأ بناء الفلتر أو استدعاء العملية المتعلقة بسؤالك، بدل محاولة فهم المكتبة كاملة في جلسة واحدة.

في برنامج قراءة دليل، ابحث عن نقطة بداية الاستعلام والخصائص المطلوبة وطريقة التعامل مع الأخطاء. في عميل ملفات، راجع كيف يبدأ الاتصال وما الذي يحدث بعد قبول الحساب. وإذا أردت معرفة هل عملية معينة تكتب ملفًا على الهدف، تتبع الاستدعاء المحدد داخل الجلسة، ولا تعتمد على اسم البرنامج أو وصف عام من تدوينة.

التعليقات تساعدك تبدأ، لكن الكود الذي يعمل قد يكون أدق من تعليق قديم. مثلًا اسم خيار مذكور في تعليق قد يختلف عن المعامل الذي يعرفه parser فعليًا. عند التعارض، تحقق من نسخة البرنامج ومساعدتها ومسار التنفيذ بدل جمع التعليقين في تفسير واحد.

مو مطلوب في البداية تعديل الكود. قراءة سلوك محدود كافية لتحسين استخدامك. إذا عدلت سكربتًا للتعلم، افصل نسختك عن الأصل واحفظ التغيير، ولا تعرض مخرجاته كأنها خرج رسمي بلا توضيح. تغيير الفلتر أو تنسيق عمود قد يغير الاستنتاج الذي يبنيه قارئ التقرير، حتى لو كان التعديل بضع أسطر فقط.

الأخطاء: المشكلة المحلية ما تقول شيء عن صلاحية الحساب

ModuleNotFoundError أو ImportError قبل إنشاء اتصال يشيران إلى جانب محلي يحتاج مراجعة البيئة والمكتبة والاعتماديات. لا تغير كلمة مرور الحساب أو إعداد الدومين بسبب هالرسالة. شوف أي Python استُخدم، ومن أي بيئة جاءت الحزمة، وهل السكربت يطابقها.

أما خطأ حل اسم أو عدم وصول إلى الخدمة، فراجع الوجهة والشبكة والخدمة. وبعدها تأتي مرحلة الهوية والمصادقة والتفويض. هذي المراحل قد تظهر في سجل واحد، لكن ترتيبها مهم: إذا لم يبدأ الاتصال، ما عندك دليل أن الحساب قُبل أو رُفض.

إذا حدثت مشكلة بعد قبول الهوية، اقرأ العملية التي طلبها البرنامج. حساب صحيح لا يضمن صلاحية كل وظيفة داخل السكربت. وكذلك ظهور حساب في الدليل لا يثبت أنه يستطيع تسجيل الدخول إلى الخادم المقصود. من الأفضل تسجيل المرحلة التي نجحت والعملية التي فشلت بدل وصف كل شيء بأنه مشكلة «Impacket».

احتفظ بنص الخطأ والإصدار والبرنامج والخيارات بدون أسرار. لا تنشر سطر اتصال يحتوي كلمة مرور أو مادة مصادقة أخرى. وإذا احتجت debug، راجع محتواه قبل مشاركته؛ كثرة التفاصيل تسهل التشخيص لكنها قد تكشف معلومات عن البيئة أو هويات الحسابات. ملاحظة مرتبة ببيانات وهمية غالبًا تكفي لشرح المشكلة في مجتمع عام.

نتيجة منظمة لا تعني أن معناها محسوم

يمكن يعرض البرنامج جدولًا مرتبًا فيه LastLogon أو PasswordLastSet. التنسيق جميل، لكن تفسير التاريخ يرجع إلى الخاصية التي قرأها وإلى كيفية تحويلها وعرضها. وجود عمود باسم عام ما يوضح وحده هل القيمة من خادم واحد أو تغطي جميع خوادم الدومين.

إذا مصدر القيمة lastLogon، راجع طبيعته قبل قول إن الحساب لم يُستخدم في أي مكان. وفي الكود قد يظهر نص مثل never لقيمة صفرية؛ هذا تمثيل تختاره الأداة، وليس حكمًا مطلقًا بأن الحساب لم يسجل دخولًا طوال عمره. كذلك التوقيت المعروض يحتاج مراجعة، خصوصًا إذا قارنت خرج جهاز لينكس بلقطة من ويندوز في منطقة زمنية مختلفة.

المبدأ ينطبق على غير التواريخ. نتيجة أسماء المستخدمين محدودة بالفلتر والصلاحيات والخصائص، ونتيجة ملفات المشاركة محدودة بالمسار والحساب والعملية. لا تحول نجاح عرض جدول إلى إعلان اكتمال الجرد بدون مراجعة تغطيته والأخطاء التي حدثت أثناء القراءة.

في التدريب جهز توقعًا معلومًا: عدد صغير من الحسابات، واحد له بريد وآخر بلا بريد، وحساب داخل OU معينة. بعده قارن النتيجة بسلوك البرنامج الموثق. إذا ظهر الفرق، تعلمت شيئًا عن السؤال الذي يرسله البرنامج، وهذا أهم من ملء شاشة الطرفية بمخرجات لا تعرف مصدرها.

للتعمق في معنى آخر دخول، راجع مقال lastLogon وlastLogonTimestamp الموجود في المجتمع، خصوصًا قبل أي قرار تعطيل حساب.

خطة تعلم Impacket بدون حفظ قائمة طويلة

اختر برنامجًا واحدًا مرتبطًا بسؤال تعرفه. اقرأ مساعدته ووظيفته، ثم جهز لابًا صغيرًا ببيانات وهمية وحدود واضحة. اكتب ما تتوقعه قبل التشغيل، وتحقق من الناتج بعدها. إذا استطعت تفسير ما ظهر وما لم يظهر، انتقل إلى برنامج آخر يخدم سؤالًا مختلفًا.

في أول تجربة يكفي التفريق بين قراءة دليل وعميل ملفات، وبين فشل التثبيت وفشل الاتصال ورفض العملية. بعد ذلك توسع في البروتوكولات حسب حاجتك. ما تحتاج تعلم كل أمثلة المشروع قبل دراسة شهادة، ولا يصح قياس مستواك بعدد أسماء السكربتات التي تحفظها.

لأمثلة تضبط فيها سؤال القراءة بنفسك، هذا شرح ldapsearch في المجتمع:
https://courses.cyberpts.com/community/70/shrh-ldapsearch-ma-active-directory-abhth-mn-lynks-wafhm-lysh-alntyjh-naqsh-aw-f
ولفهم رفض ملفات المشاركة:
https://courses.cyberpts.com/community/72/smb-access-denied-alhsab-shyh-lkn-lysh-almjld-almshtrk-yrfdk

المراجع الأصلية:
مستودع Impacket وتعليمات التثبيت:
https://github.com/fortra/impacket
ملف GetADUsers.py في أمثلة المشروع:
https://github.com/fortra/impacket/blob/master/examples/GetADUsers.py
ملف smbclient.py:
https://github.com/fortra/impacket/blob/master/examples/smbclient.py
وثائق pipx:
https://pipx.pypa.io/stable/

روابط master تشير إلى كود قد يتغير، فراجع المرجع المطابق لنسختك عند المقارنة. إذا لقيت خيارًا جديدًا في المصدر، لا تفترض أنه عندك قبل مراجعة المساعدة المحلية.

أهم شيء تطلع به هنا أن Impacket يوفر أساسًا تستخدمه برامج متعددة. لما تسمي البرنامج ووظيفته وإصداره والعملية التي نفذتها، يكون تعلمك أوضح وتوثيقك أدق. بعدها يصبح اختيار الأداة خطوة منطقية في فهم اللاب، بدل محاولة تشغيل أي اسم مر عليك في شرح.