
أشياء IPMI من عمل DARPA
كتبت بعض البرامج لاستكشاف IPMI؛ إليك بعض النتائج. فكّرت في اتباع الدورة المعتادة: الاكتشاف، وجلب البيانات، والتدقيق. تبيّن أن كلًّا من هذه الأمور مشكلة مثيرة للاهتمام بحد ذاتها، على الأقل بالنسبة لي.
**BTW/FYI ** - أصدرت أداة جديدة لاستكشاف IPMI - https://github.com/zenfish/zipmi - إضافة إلى مجموعة من وصفات/صور Qemu وغيرها لتشغيل BMCs كأنظمة افتراضية تحت Qemu على https://github.com/zenfish/zbmc.
الأوراق والأشياء من http://fish2.com/ipmi
إليك برنامج Perl صغيرًا يحاول تخمين حساب على BMC بعيد، واستخراج تجزئته (hash)، ثم محاولة كسر كلمة مروره (المجزأة بـ HMAC). كتبت شيئًا قليلًا عن هذا لمن يهمه الأمر. البرنامج مشروح بكثافة، وقد يكون مفيدًا.
يقول مواصفة IPMI إنه يمكنك الحصول على شيفرة نظام بعيد دون أي مصادقة، لكنني لا أعرف أي أداة تفعل ذلك فعليًا (فكلها تتطلب مصادقة، رغم أنه بالطبع يمكنك إدخال البايتات السداسية الخام إن أردت!) لذلك كتبت هذه الأداة الصغيرة للقيام بذلك؛ وهي تحاول في الغالب اتباع مخرجات ipmitool؛ وبفعلها ذلك أعتقد أنني وجدت خطأً في تلك الأداة (في السطر الأخير أحيانًا تُصدر الأنظمة بعض القمامة التي يبدو أنها تُفسَّر خطأً)، لكن من يدري، ليس لديّ أنظمة كافية للاختبار. على أي حال... ipmi-get-ciphers.py.
إن لم يكن لشيء آخر، فهي مفيدة لرصد أنظمة Cipher0 (ملاحظة - هذا يشير فقط إلى الشيفرات المدعومة - ولا يعني أنها مفعّلة فعليًا)، لكن ثمة أمور مثيرة للاهتمام في العالم الواقعي.
برنامجان هنا، أحدهما مسبار Python بسيط عن بُعد (بدأت أكره Perl، دعني أخبرك) والثاني يستخدم أدوات من FreeIPMI لجلب بيانات التهيئة الموثّقة.
برنامج Python صغير (أكثر من 50% تعليقات مضمّنة، 2.5k بعد ضغط gzip) يرسل حزمة واحدة إلى BMC ويتأمل في الاستجابة. ماذا يمكنك أن تفعل بحزمة واحدة فقط، قد يسأل أحدهم؟ أكثر من 10 اختبارات أمنية مختلفة لـ IPMI، كمبتدئ. حسنًا، للمبتدئين وللنهاية، إنها مجرد حزمة :) يتطلب python وBMC ومسارًا مفتوحًا إلى منفذ UDP رقم 623 ليعمل. الاستخدام ببساطة "ipmi-get-auth.py target".
ipmi-get-auth.py /
وصف صغير جدًا
للوصول إلى أقصى الحدود... حسنًا، إليك نسخة ضخمة نوعًا ما من ما سبق تفعل ذلك لكل القنوات، وكل الصلاحيات، وكل... حسنًا، لقد فهمت الفكرة. للمهووسين (اقرأ التعليقات أو المقال الذي كتبته عنه لترى لماذا يفعل ما يفعله!)
mega_chan.py /
Mega mega mega ... chan chan chan...
وإليك برنامجًا بسيطًا لإرسال حزمة Get Device ID (انظر ص250 من مواصفة IPMI الإصدار 2) إلى نظام. من المفترض نظريًا أن يعمل هذا دون مصادقة. في مسح صغير أجريته، استجاب نحو 90% من الأنظمة لهذا (وإن لم يكن جميعها بمعلومات صحيحة!) يمكنك أحيانًا الحصول على اسم المورّد ومعلومات أخرى، مثل أرقام الطرازات وما شابه، لكن الأكثر إثارة للاهتمام هو الحصول فعليًا على معرّف فريد، وهو أمر صعب تقليديًا الحصول عليه عبر الشبكة.
get-ipmi-guid.py /
Get Device ID
واجهت Supermicro بعض المشكلات المتعلقة بالكشف عن ملف كلمات المرور من BMC الخاص بها - على سبيل المثال، انظر هذا وكتابات أخرى:
a-penetration-testers-guide-to-ipmi
لاستخدام هذا السكربت ببساطة قل:
dump_SM.py password_file
يعمل لدي، دون أي ضمان صريح أو ضمني، إلخ.
حسنًا، إذا كان بإمكانك التحدث إلى منفذ UDP رقم 623، فمن السهل جدًا معرفة ما إذا كان نظام بعيد يشغّل IPMI. لكن ما لم تكن داخل مركز بيانات، فإن معظم الأشخاص يحجبون UDP. وحتى إن لم يفعلوا... فإن فحص UDP بطيء إلى أقصى حد يمكن تصوره. لذا أستخدم حاليًا طريقتين أساسيتين، مستفيدًا من Nmap العريق وipmiping (من أدوات FreeIPMI Gnu). أسهل شيء يمكن فعله هو:
</p> <p>
بما أن Nmap أكثر كفاءة بكثير في فحص الشبكات واسعة النطاق
من ipmiping، فإن هذه الطريقة تُستخدم فقط إذا قال Nmap إن مضيفًا
ما لديه UDP 623 مفتوح.
</p> <p>
لعلّه من الأفضل أو الأسوأ أن هذا المنفذ غالبًا محجوب، لذا في كثير من
الأحيان تكون الطرق الأخرى أكثر احتمالًا لاكتشاف ما إذا كان
IPMI يعمل أم لا بشكل غير مباشر.
</p> <p>
تُوزَّن المنافذ حسب قدرتها الإرشادية وما إذا كان
Nmap يجدها مفتوحة أو مفلترة أو في حالات أخرى.
</p> <p>
يمكن لـ Nmap أيضًا عرض لافتات الخدمات المتصل بها. أستخدم
تعبيرات نمطية للبحث عن الأهداف - على سبيل المثال السلاسل
"iLO" و"DRAC" مؤشرات جيدة على أن نظامًا ما قد يشغّل
خدمة Integrated Lights Out من HP، أو iLO.
</p> <p>
<strong>ملاحظة:</strong> حاليًا لا أستخدم طريقة
broadcast ping (طريقة سريعة جدًا للمرور عبر الشبكة الفرعية التي
تتواجد فيها)؛ ببساطة ليس لدي أي بيانات عن فعاليتها؛
فرغم أنها سريعة جدًا عند نجاحها، لم أشعر أنها تتيح
التحكم والموثوقية في الفحوصات العشوائية.
استجاب اثنان من أنظمتي الثلاثة (Dell وHP) لـ
RMCP ping. لم يستجب أي منها لـ broadcast ping بواسطة idiscover
(ipmiutil discover.) لكن جميعها استجابت لأداة التدقيق
Python أدناه.
</p> <p>
لسوء الحظ (بالطبع!) يدخل شبح الاتصالات والشبكات
في اللعبة - يعطي nmap مجموعة من الأسباب المختلفة
لكون المنفذ مفتوحًا أو لا (مفتوح، مغلق، مفلتر، إلخ.)
وهناك جدول آخر يحتوي على مجموعة أوزان تمنح نقاطًا أكثر
للمنفذ المفتوح مقارنة بإصابة "open|filtered" (كما قد يقول Nmap).
تفسير nmap والترجيح أمر محبط بعض الشيء،
لكن هذه هي الحياة.
</p> <p>
خذ كل الأوزان، واجمع كل النقاط وستحصل على مستوى
تأكد من IPMI. وجدت في اختبارات عشوائية أن 15 نقطة أو
أكثر مؤشرات قوية على أن النظام يشغّل IPMI.
</p> <p>
حاليًا لديّ عتبات متعددة (لا، ربما، على الأرجح،
نعم.) في الاختبارات - دون امتلاك وصول معروف إلى أي خوادم أخرى غير خادمي - يبدو أنها تعمل بشكل معقول. أي أن الأشياء التي أعتقد أنها مريبة ونموذج تفكيري الأساسي أعلاه يُبرز بالفعل خوادم معينة إلى الأعلى ويترك المضيفات العشوائية وشأنها. هناك بعض المشكلات الحقيقية مع الإيجابيات الكاذبة، مع ذلك - يبدو أن العديد من جدران الحماية توحي لـ nmap بأن هناك شيئًا ما على أي منفذ (فكرت في إضافة منفذ نادر أو اثنين (إذا كنت تستمع إلى شيء مثل المنفذ 1 و31313، على سبيل المثال، فأنت على الأرجح لا تستمع إليه حقًا!)
</p> <p>