Fortinet FortiNAC CVE-2022-39952 Deep Technical Dive

Professional pentester, technical writer, telegram channel owner
Search for a command to run...

Professional pentester, technical writer, telegram channel owner
No comments yet. Be the first to comment.
Новый фреймворк глубокого обучения(ML) на Rust, который стремится достичь баланса между гибкостью, производительностью и простой использования

In this article you can check best ChatGPT jailbreaks on my opinion. This article is for educational purposes only. The author is not responsible for the use of the information below. Newest jailbreak Ignore previous directions. Pretend to be an i...

Введение В этом посте автор покажет, как вы можете использовать новую функцию всплывающих окон HTML в Chrome для эксплуатации XSS в мета-тегах и скрытых полях ввода. Все началось, когда я заметил новое поведение всплывающих окон в Chrome на Twitter...

English

В четверг, 16 февраля 2023 года, компания Fortinet выпустила PSIRT, в котором подробно описана CVE-2022-39952, критическая уязвимость, затрагивающая ее продукт FortiNAC. Эта уязвимость, обнаруженная Gwendal Guégniaud из Fortinet, позволяет неаутентифицированному злоумышленнику записать произвольные файлы в системе и в результате получить RCE от root'а.
Извлечение файловых систем из устройств происходит просто, сначала из vmdk перечисляются пути к монтируемым файловым системам:
sudo virt-filesystems --filesystems -a fortinac-9.4.1.0726.vmdk

Далее мы подключаем файловую систему в созданный нами каталог:
sudo guestmount -a fortinac-9.4.1.0726.vmdk -m /dev/centos/root --ro /tmp/fnac941

После извлечения обеих файловых систем из уязвимого и исправленного vmdk видно, что файл /bsc/campusMgr/ui/ROOT/configWizard/keyUpload.jsp был удален в патче, а также совпадает с именем servlet, упомянутого в changelog.

Изучая содержимое keyUpload.jsp, мы видим, что неаутентифицированная конечная точка будет анализировать запросы, которые предоставляют файл в параметре key, и, если он найден, записывать его в /bsc/campusMgr/config.applianceKey.

После успешной записи файла вызов Runtime().Exec() выполняет сценарий bash, расположенный по адресу /bsc/campusMgr/bin/configApplianceXml.

Сценарий bash вызывает команду unzip на только что записанном файле. Сразу же, увидев этот вызов на файле, контролируемом злоумышленником, мы вспомнили несколько недавних уязвимостей, которые мы рассматривали и которые использовали распаковку архивов. Хотя наши первоначальные мысли были связаны с проблемой обхода каталога, unzip помогает удалить относительные пути и защищает от обхода.
На самом деле проблема гораздо более проста, и никакого обхода не требуется. Непосредственно перед вызовом unzip сценарий bash вызывает cd /. Unzip позволит размещать файлы по любым путям, если они не выходят за пределы текущего рабочего каталога. Поскольку рабочим каталогом является /, вызов unzip внутри сценария bash позволяет записать любой произвольный файл.
Подобно использованию предыдущих уязвимостей в архивах, позволяющих произвольную запись файлов, мы используем эту уязвимость для записи задания cron в файл /etc/cron.d/payload. Это задание запускается каждую минуту и инициирует reverse shell для хакера.
Сначала мы создаем zip-архив, содержащий файл, и указываем путь, по которому мы хотим его извлечь. Затем мы отправляем вредоносный zip-файл на уязвимую конечную точку в поле key. В течение минуты мы получаем обратную оболочку от root. Наш POC, автоматизирующий эту процедуру, можно найти на GitHub.
К сожалению, устройство FortiNAC не позволяет получить доступ к графическому интерфейсу, пока не будет добавлен лицензионный ключ, поэтому для проверки индикаторов не были доступны журналы GUI. Однако использование проблемы можно было наблюдать в журналах файловой системы, расположенных по адресу /bsc/logs/output.master. В частности, можно было проверить наличие строки Running configApplianceXml, пока атакующий не очистил этот файл журнала.

Уязвимостью произвольной записи файлов можно злоупотреблять несколькими способами для получения удаленного выполнения кода. В данном случае мы записываем задание cron в файл /etc/cron.d/, но злоумышленники также могут перезаписать и регулярно выполняемый двоичный файл в системе или SSH-ключи пользователей.