
मैंने IPMI का अन्वेषण करने के लिए कुछ सॉफ्टवेयर लिखे; यहाँ कुछ परिणाम दिए गए हैं। मैंने सोचा कि मैं सामान्य पहचान, डेटा प्राप्त करना, और ऑडिट वाला चक्र करूँगा। इनमें से प्रत्येक अपने आप में काफी दिलचस्प समस्या निकली, कम से कम मेरे लिए तो।
http://fish2.com/ipmi से पेपर और अन्य चीज़ें
यहाँ एक छोटा Perl प्रोग्राम है जो किसी दूरस्थ BMC पर खाते का अनुमान लगाने, उसका हैश निकालने, और फिर उसके (HMAC हैश्ड) पासवर्ड को क्रैक करने का प्रयास करता है। मैंने इस पर जिज्ञासुओं के लिए थोड़ा लिखा है। भारी टिप्पणियों के साथ, यह कुछ उपयोगिता प्रदान कर सकता है।
IPMI विनिर्देश कहता है कि आप बिना किसी प्रमाणीकरण के दूरस्थ सिस्टम का साइफर प्राप्त कर सकते हैं, लेकिन मुझे ऐसे किसी टूल के बारे में पता नहीं है जो वास्तव में ऐसा करता हो (वे सभी प्रमाणीकरण की माँग करते हैं, हालाँकि निश्चित रूप से आप चाहें तो कच्चे हेक्स बाइट्स दर्ज कर सकते थे!) इसलिए मैंने यह छोटा प्रोग्राम लिखा; यह अधिकतर ipmitool के आउटपुट का अनुसरण करने की कोशिश करता है; ऐसा करने में मुझे विश्वास है कि मुझे उस उपयोगिता में एक बग मिला (अंतिम पंक्ति में कभी-कभी सिस्टम कुछ कचरा उत्सर्जित करते हैं जो गलत व्याख्या किया गया प्रतीत होता है), लेकिन कौन जानता है, मेरे पास परीक्षण के लिए पर्याप्त सिस्टम नहीं हैं। वैसे भी... ipmi-get-ciphers.py।
यदि और कुछ नहीं, तो Cipher0 सिस्टम की पहचान के लिए उपयोगी है (ध्यान दें - यह केवल उन साइफरों को इंगित करता है जो समर्थित हैं - इसका मतलब यह नहीं है कि वे वास्तव में चालू हैं), लेकिन बाहर दिलचस्प चीज़ें मौजूद हैं।
यहाँ दो प्रोग्राम हैं, एक सरल Python रिमोट प्रोबर है (मैं आपको बता दूँ, मैं Perl से नफरत करने लगा हूँ) और दूसरा जो FreeIPMI की उपयोगिताओं का उपयोग करके प्रमाणित कॉन्फ़िगरेशन डेटा प्राप्त करता है।
एक छोटा python प्रोग्राम (50% से अधिक इनलाइन टिप्पणियाँ, 2.5k gzip'd) जो BMC को एक एकल पैकेट भेजता है और प्रतिक्रिया पर विचार करता है। कोई पूछ सकता है, केवल एक एकल पैकेट से क्या किया जा सकता है? शुरुआत के लिए, IPMI के लिए 10+ विभिन्न सुरक्षा परीक्षण। खैर, शुरुआत और अंत दोनों के लिए, यह केवल एक पैकेट है :) काम करने के लिए python, एक BMC और UDP पोर्ट 623 तक खुला मार्ग आवश्यक है। उपयोग केवल "ipmi-get-auth.py target" है।
ipmi-get-auth.py /
एक बहुत छोटा विवरण
इसे चरम तक ले जाते हुए... खैर, यहाँ उपरोक्त का एक प्रकार का मेगा संस्करण है जो इसे सभी चैनलों, सभी विशेषाधिकारों, सभी... के लिए करता है, खैर, आप समझ गए होंगे। जुनूनी लोगों के लिए (टिप्पणियाँ या इसके बारे में मेरी लिखी पोस्ट पढ़ें कि यह जो करता है वह क्यों करता है!)
mega_chan.py /
मेगा मेगा मेगा ... chan chan chan...
और यहाँ एक सरल प्रोग्राम है जो किसी सिस्टम को Get Device ID पैकेट (IPMI v 2 विनिर्देश का p250 देखें) भेजता है। सिद्धांत रूप में, यह बिना प्रमाणीकरण के काम करना चाहिए। मेरे एक छोटे सर्वेक्षण में लगभग 90% सिस्टम ने इसका जवाब दिया (हालाँकि सभी ने मान्य जानकारी के साथ नहीं!) आप कभी-कभी विक्रेता और अन्य जानकारी प्राप्त कर सकते हैं, जैसे मॉडल नंबर और ऐसी ही चीज़ें, लेकिन अधिक दिलचस्प बात वास्तव में एक अद्वितीय ID प्राप्त करना है, जो परंपरागत रूप से नेट के माध्यम से प्राप्त करना कठिन चीज़ है।
get-ipmi-guid.py /
डिवाइस 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" स्ट्रिंग्स अच्छे संकेतक हैं कि कोई सिस्टम
HP की Integrated Lights Out सेवा, या iLO चला रहा हो सकता है।
</p> <p>
<strong>नोट:</strong> वर्तमान में मैं ब्रॉडकास्ट
पिंग विधि का उपयोग नहीं करता (अपने सबनेट को तेज़ी से पार करने का बहुत त्वरित तरीका);
मेरे पास इसकी प्रभावशीलता पर कोई डेटा नहीं है; जबकि काम करने पर यह बहुत तेज़ है,
मुझे नहीं लगा कि यह मनमाने स्कैन के नियंत्रण और विश्वसनीयता की अनुमति देता है।
मेरे तीन में से दो सिस्टम (Dell और HP) ने RMCP पिंग का जवाब दिया।
किसी ने भी idiscover (ipmiutil discover) द्वारा ब्रॉडकास्ट पिंग का जवाब नहीं दिया।
हालाँकि, सभी ने नीचे दिए गए मेरे Python ऑडिट टूल का जवाब दिया।
</p> <p>
दुर्भाग्य से (बिल्कुल!) संचार और नेटवर्क की बाधा सामने आती है -
nmap कई अलग-अलग कारण देता है कि कोई पोर्ट खुला है या नहीं
(open, closed, filtered, आदि।) एक और तालिका में भारों का एक सेट है
जो एक खुले पोर्ट को 'open|filtered' (जैसा कि Nmap कह सकता है) हिट से अधिक अंक देता है।
nmap की व्याख्या करना और भार देना थोड़ा निराशाजनक है,
लेकिन c'est la vie।
</p> <p>
सभी भारों को लें, सभी अंकों को जोड़ें और आपके पास IPMI
निश्चितता स्तर है। मैंने तदर्थ परीक्षण में पाया है कि 15 अंक या
अधिक मजबूत संकेतक हैं कि सिस्टम IPMI चला रहा है।
</p> <p>
वर्तमान में मेरे पास विभिन्न सीमाएँ हैं (नहीं, संभवतः,
शायद, हाँ।) परीक्षणों में - अपने अलावा किसी अन्य सर्वर तक ज्ञात पहुँच के बिना -
यह उचित रूप से अच्छा काम करता प्रतीत होता है। अर्थात्,
जो चीज़ें मुझे संदिग्ध लगती हैं और मेरा उपरोक्त बुनियादी विचार
मॉडल वास्तव में कुछ सर्वरों को शीर्ष पर लाता है और
यादृच्छिक होस्ट्स को अकेला छोड़ देता है। हालाँकि, झूठी सकारात्मकताओं
(false positives) की कुछ वास्तविक समस्याएँ हैं - कई फ़ायरवॉल nmap को यह संकेत देते प्रतीत होते हैं कि
किसी भी पोर्ट पर कुछ है (मैंने एक या दो दुर्लभ पोर्ट डालने के बारे में सोचा है
(यदि आप कुछ ऐसा सुनते हैं जैसे पोर्ट 1 और 31313, उदाहरण के लिए,
आप शायद *वास्तव में* इसे नहीं सुन रहे हैं!))
</p> <p>
लेकिन इसका मतलब यह नहीं है कि यह विषय पर अंतिम शब्द है। IPMI बैनर पर कुछ अच्छा डेटा प्राप्त करना
काफी सरल होना चाहिए, मेरा अनुमान है कि यह बड़ी मात्रा में
सिस्टम को तेज़ी से स्कैन करने का अब तक का सबसे अच्छा तरीका होगा।
उपरोक्त को लागू करने के लिए यहाँ Perl के चार टुकड़े हैं; एक स्कैन करता है, एक व्याख्या करता है, और अन्य दो भार देने के लिए उपयोग किए जाते हैं। यह एक शोध उपकरण या अवधारणा का प्रमाण है, उत्पादन स्कैनर नहीं, लेकिन यह कुछ उचित आउटपुट उत्पन्न करता है।
आवश्यक: Nmap संस्करण 6.
| ipmi_scan.pl - बुनियादी IPMI स्कैनर, Nmap और, यदि उपलब्ध हो, ipmitool का उपयोग करता है |
| ipmi_scan मैन पेज - उपरोक्त के लिए मैन पेज |
| post_ipmi_scan.pl - उपरोक्त के आउटपुट को पार्स करता है, कुछ भारित परिणाम निकालता है |
| j_vendor.pl - कुछ बुनियादी विक्रेता डेटा... कौन कौन से पोर्ट का उपयोग करते हैं? |
| j_weights.pl - उपरोक्त के लिए कुछ बुनियादी विक्रेता भार |
उपयोग काफी सरल है, यदि थोड़ा विचित्र है। इसे root के रूप में चलाया जाना चाहिए। बहुत सारे आउटपुट के लिए Verbose (-v)।
स्कैन लक्ष्य नामों के अनुरूप परिणाम फ़ाइलों की एक जोड़ी बनाएगा (स्लैश को अंडरस्कोर में बदल दिया जाता है।) बस उन पर पोस्ट-प्रोसेसर चलाएँ; उन्हें रिवर्स संख्यात्मक क्रम में डालने से वे अधिक दिलचस्प क्रम में आ जाते हैं। 10 से अधिक कुछ भी मैं संदिग्ध कहूँगा, जबकि 20 से अधिक निश्चित रूप से IPMI चला रहा होने की बात है।# standard run: ./ipmi_scan.pl -A -v -O yes 192.168.0.0/24 # fast ./ipmi_scan.pl -tcp -v 192.168.0.0/24 # kitchen sink ./ipmi_scan.pl -A -v -O high 192.168.0.0/24
इस मामले में मैंने आउटपुट को न्यूनतम करने के लिए terse फ़्लैग (-t) का उपयोग किया।
./post_ipmi_scan.pl -t 192.168.0.0_24|sort -rn 96.3 192.168.0.69 16.25 192.168.0.46 10.8 192.168.0.23 7.33 192.168.0.202 5.4 192.168.0.189 5.4 192.168.0.179 1.7 192.168.0.9 1.23 192.168.0.1 1.1 192.168.0.8 0.9 192.168.0.251 0.63 192.168.0.55 0.43 silent/192.168.0.250 0.2 pi.fish2.com/192.168.0.14 0.2 fierce.fish2.com/192.168.0.6 0.2 192.168.0.88 0.01 192.168.0.16
उपरोक्त परिणामों में शीर्ष 3 सिस्टम वास्तव में IPMI चला रहे हैं, लेकिन केवल HP ने Nmap को बताया कि UDP पोर्ट 623 खुला था - मेरे Dell और Supermicro ने अधिक अस्पष्ट "open|filtered" प्रतिक्रिया लौटाई, जो काफी सामान्य रूप से एक झूठा अलार्म होता है, ब्लाह। शायद इसे सहन करना और स्कैनर के समानांतर IPMI पिंग करना बेहतर है (या इसे सही तरीके से करने के लिए एक NSE लिखना।)
यहाँ कुछ छोटे python प्रोग्राम हैं जो - FreeIPMI टूल्स का उपयोग करके - (a) सर्वर के बुनियादी IPMI/BMC कॉन्फ़िगरेशन को खींचते हैं और (b) परिणामों पर एक छोटी सी सुरक्षा जाँच करते हैं।
क्योंकि मैं... खैर, वास्तव में कोई अच्छा कारण नहीं है। एक python3 में है और दूसरा python2 में है। मुझे लगता है कि मैं आपकी तत्परता का परीक्षण कर रहा हूँ। प्रोग्राम काफी भारी टिप्पणियों वाले हैं, विशेष रूप से ipmifreely.py, इसलिए क्या हो रहा है इसके अधिक विवरण के लिए उसे देखें। simplejson और ConfigParser की आवश्यकता है, शायद कुछ और की भी।
आपके पास FreeIPMI स्थापित होना ही चाहिए, जो इस लेखन के समय, Mac और Windows की सर्वर से एक बढ़िया JSON फ़ाइल खींचने की संभावनाओं को समाप्त कर देता है। और आपके पास वास्तव में, वास्तव में एक हालिया संस्करण होना चाहिए। यह मत कहना कि मैंने आपको चेतावनी नहीं दी थी। लेकिन जीवन चलता रहता है।
डेटा अधिग्रहण एक python प्रोग्राम (I-check.py) के माध्यम से किया जाता है जिसे डेटा प्राप्त करने के लिए मान्य क्रेडेंशियल्स की आवश्यकता होती है। यह परिणामों को JSON में परिवर्तित करता है, जिसे बदले में ऑडिट टूल (ipmifreely.py) द्वारा जाँचा जा सकता है। "IPMI-policy.ini" में एक नमूना नीति है, जहाँ मैंने परीक्षण के लिए कुछ मान रखे हैं।
| I-check.py - IPMI कॉन्फ़िगरेशन डेटा खींचता है |
| ipmifreely.py - उपरोक्त के आउटपुट को पार्स करता है, कुछ परिणाम निकालता है |
| IPMI-policy.ini - IPMI नीति फ़ाइल |
नमूना उपयोग:
# this grabs the configuration stuff; here I'm using it on an HP iLO 3 server # the output is redirected to a file $ ./ipmifreely.py -v -u admin -p admin 192.168.0.46 > hp.json # This takes the JSON file and looks for issues $ ./I-check.py drac.json ./I-check.py hp.json Host: 192.168.0.46 [bmc-config] Serial_Channel Non_Volatile_Enable_Pef_Alerting = No [bmc-config] Serial_Channel Volatile_Enable_Pef_Alerting = No [bmc-config] Serial_Channel Volatile_Enable_Per_Message_Auth = No [bmc-config] Serial_Channel Non_Volatile_Enable_Per_Message_Auth = No [bmc-config] Lan_Conf_Security_Keys K_G = 0x0000000000000000000000000000000000000000 [bmc-config] SOL_Conf Force_SOL_Payload_Authentication = No [bmc-config] SOL_Conf Force_SOL_Payload_Encryption = No [bmc-config] Lan_Conf_Auth Callback_Enable_Auth_Type_None = Yes [bmc-config] Lan_Conf_Auth Operator_Enable_Auth_Type_None = Yes [bmc-config] Lan_Conf_Auth OEM_Enable_Auth_Type_None = Yes [bmc-config] Lan_Conf_Auth Admin_Enable_Auth_Type_None = Yes [bmc-config] Lan_Conf_Auth User_Enable_Auth_Type_None = Yes [bmc-config] Rmcpplus_Conf_Privilege Maximum_Privilege_Cipher_Suite_Id_1 = OEM_Proprietary [bmc-config] Rmcpplus_Conf_Privilege Maximum_Privilege_Cipher_Suite_Id_0 = OEM_Proprietary [bmc-config] Rmcpplus_Conf_Privilege Maximum_Privilege_Cipher_Suite_Id_2 = OEM_Proprietary [pef-config] Community_String Community_String = public [pef-config] PEF_Conf Enable_PEF_Event_Messages = No
आप कुछ IPMI सुरक्षा सर्वोत्तम अभ्यास देख सकते हैं कि क्या जाँचना चाहिए — सुरक्षा की दृष्टि से जिन्हें मैं अच्छे कार्य मानता हूँ — इसके बारे में अधिक जानकारी के लिए।