Введение
В четверг, 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.Демо
POC
GitHub - horizon3ai/CVE-2022-39952: POC for CVE-2022-39952
POC for CVE-2022-39952. Contribute to horizon3ai/CVE-2022-39952 development by creating an account on GitHub.
github.com
Индикатор взлома
К сожалению, устройство FortiNAC не позволяет получить доступ к графическому интерфейсу, пока не будет добавлен лицензионный ключ, поэтому для проверки индикаторов не были доступны журналы GUI. Однако использование проблемы можно было наблюдать в журналах файловой системы, расположенных по адресу/bsc/logs/output.master
. В частности, можно было проверить наличие строки Running configApplianceXml
, пока атакующий не очистил этот файл журнала.Уязвимостью произвольной записи файлов можно злоупотреблять несколькими способами для получения удаленного выполнения кода. В данном случае мы записываем задание cron в файл
/etc/cron.d/
, но злоумышленники также могут перезаписать и регулярно выполняемый двоичный файл в системе или SSH-ключи пользователей.
Последнее редактирование модератором: