
Sagemcom F@ST 3890 केबल मॉडेम के लिए एक्सप्लॉइट जो Cable Haunt भेद्यता को लागू करके WebSocket-आधारित बफर ओवरफ्लो और ROP श्रृंखला के माध्यम से दूरस्थ कोड निष्पादन प्राप्त करता है।
यह एक्सप्लॉइट स्थानीय नेटवर्क पहुंच से Sagemcom F@ST 3890 (50.10.19*) केबल मोडेम पर शेल प्राप्त करने के लिए Cable Haunt भेद्यता का उपयोग करता है। फर्मवेयर संस्करण 50.10.21 या नया Cable Haunt के विरुद्ध सुरक्षित होना चाहिए। यह Proof of concept विशेष रूप से केवल स्थानीय रूप से काम करने के लिए डिज़ाइन किया गया है ताकि दुर्भावनापूर्ण उद्देश्यों की संभावना सीमित हो। Technicolor TC7230 के लिए एक बाहरी कनेक्शन पर रिवर्स शेल बनाने वाला एक अन्य POC यहाँ उपलब्ध है।
ज्ञात भेद्य मोडेम की सूची https://cablehaunt.com/#faq-am-i-affected पर पाई जा सकती है।
The exploit.py एक वेबसाइट परोसता है, जिसे देखने पर केबल मोडेम को एक दुर्भावनापूर्ण WebSocket अनुरोध भेजता है।
यह अनुरोध केबल मोडेम के Spectrum Analyzer में रिटर्न एड्रेस और संबंधित रजिस्टरों को ओवरफ्लो करता है, और पोर्ट 1337 पर TCP कनेक्शन सुनना शुरू करने के लिए ROP-चेन का उपयोग करता है।
ROP-चेन static/exploitSagemcom.js में निर्मित और टिप्पणी की गई है।
फिर exploit.py सर्वर इस TCP कनेक्शन के माध्यम से exploit.raw फ़ाइल भेजता है, जिसे बाद में मोडेम द्वारा निष्पादित किया जाएगा।
exploit.raw फ़ाइल reverseshell.c है जिसे MIPS आर्किटेक्चर के लिए संकलित किया गया है (नीचे देखें कैसे)।
Reverseshell.c इस मोडेम के लिए स्पष्ट रूप से लिखा गया एक शेल है। शेल केबल मोडेम पर eCos शेल में चलाए जाने वाले कमांडों को सुनता है और STDOUT को TCP कनेक्शन पर रीडायरेक्ट करता है।
आप इस एक्सप्लॉइट को समझाने वाला वीडियो यहाँ पा सकते हैं: https://www.youtube.com/watch?v=5FM9mS5ck3Y
नोट: Windows 10 वर्तमान में समर्थित नहीं है, आपको Linux आधारित OS का उपयोग करना होगा
python3 के लिए pwntools और flask स्थापित करें और python exploit.py चलाएँ।
अब मोडेम को एक्सप्लॉइट करने के लिए अपने ब्राउज़र में http://127.0.0.1:8080 पर जाएँ।
Firefox इसके लिए काम नहीं करेगा, क्योंकि उपयोग किया गया WebSocket संस्करण संगत नहीं है।
अब आपके टर्मिनल में python स्क्रिप्ट चलाने पर एक इंटरैक्टिव शेल प्रकट होना चाहिए। यदि आप शेल से बाहर निकलते हैं, तो नया शेल शुरू करने के लिए मोडेम को रीबूट करना आवश्यक है।
यदि आप अपना खुद का पेलोड संकलित करना चाहते हैं, तो आप aeolus से टूलचेन प्राप्त कर सकते हैं और निम्न कमांड चला सकते हैं:
/<toolchain Path>/gnutools/mipsisa32-elf/bin/mipsisa32-elf-gcc -O3 -c ./reverseshell.c -o ./reverseshell.o && /<toolchain Path>/toolchains/gnutools/mipsisa32-elf/bin/mipsisa32-elf-objcopy -O binary reverseshell.o exploit.raw
आप इस तकनीक का उपयोग करके Cable Haunt के प्रति भेद्य किसी भी मोडेम को एक्सप्लॉइट कर सकते हैं। अपनी खुद की ROP-चेन लिखने का प्रयास करने से पहले हम तकनीकी रिपोर्ट पढ़ने की सलाह देते हैं। ज्ञात भेद्य केबल मोडेम की सूची के लिए Cable Haunt पर जाएँ।
सबसे पहले, आपको उस केबल मोडेम के लिए फर्मवेयर की आवश्यकता होगी जिसे आप एक्सप्लॉइट करने जा रहे हैं। फिर, शेल के लिए socket(), bind(), accept(), listen(), recv() और connect() जैसे एक्सप्लॉइट के निर्माण हेतु प्रासंगिक फ़ंक्शन के पते खोजने के लिए फर्मवेयर का रिवर्स इंजीनियरिंग करें। फिर निम्न कमांड का उपयोग करके gadgets खोजने के लिए Ropper का उपयोग किया जा सकता है:
python Ropper.py --type all --all --badbytes 00c0c1f5f6f7f8f9fafbfcfdfeff2c -r -a MIPSBE -I 0x80004000 --console -f <firmware path>
सभी gadgets तक नहीं पहुँचा जा सकता, क्योंकि gadgets केवल पते होते हैं जो कच्चे बाइट्स के रूप में भेजे जाते हैं और सभी बाइट्स को टेक्स्ट फ्रेम वाले WebSocket अनुरोध के रूप में नहीं भेजा जा सकता।
उदाहरण के लिए, पता 0x8080a864 सीधे WebSocket टेक्स्ट फ्रेम में डाला नहीं जा सकता, क्योंकि यह एक मान्य UTF-8 वर्ण नहीं है। हालाँकि, पता 0xf28080a864 डाला जा सकता है, क्योंकि 0xf2 का अर्थ है 0x8080a864 को अंतिम बाइट्स के रूप में रखते हुए नया UTF-8 प्रतीक शुरू करना।
utf-8 विनिर्देश के कारण निम्नलिखित बाइट्स किसी भी उपयोग किए गए पते में मौजूद नहीं हो सकते: 0x00, 0xc0,0xc1,0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x2c। अन्य प्रतिबंध भी मौजूद हैं जिन्हें जल्द ही हमारी रिपोर्ट में और समझाया जाएगा।
अभी के लिए, आप यह परीक्षण करने के लिए utf8TestScript.py पढ़ और उपयोग कर सकते हैं कि कोई पता पहुँच योग्य है या नहीं।
आप नए केबल मोडेम के लिए अपना खुद का पेलोड संकलित करने के लिए ऊपर वर्णित प्रक्रिया का उपयोग कर सकते हैं, लेकिन याद रखें कि पेलोड को वापस नहीं लौटना चाहिए! यदि यह लौटता है, तो प्रक्रिया स्मैश किए गए स्टैक पर रिटर्न एड्रेस खोजेगी और क्रैश हो जाएगी।
अधिकांश मोडेम के लिए, आपको फर्मवेयर निकालने के लिए eCos शेल तक पहुँचने का एक तरीका चाहिए या इसे सीधे फ्लैश चिप से निकालना होगा। ये फर्मवेयर आमतौर पर ProgramStore नामक प्रारूप में पैक किए जाते हैं। यदि सीरियल कंसोल काम नहीं कर रहा है, तो यह चलाने का प्रयास करें: (शायद केवल तभी काम करे जब कोएक्स केबल डिस्कनेक्ट हो या प्रोविज़न न किया गया हो)
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 0
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
फिर शेल सुलभ हो जाना चाहिए, और bcm2-utils इस शेल का उपयोग करके इसे निकालना आसान बना सकता है। निकाले गए फर्मवेयर का रिवर्स करते समय लोड/बेस एड्रेस (जहाँ तक हमने देखा है) हमेशा 0x80004000 होता है।