Недавно на проекте по пентесту было обнаружено уязвимое коробочное решение Directus v9.23.3.
Directus — это open‑source платформа для управления данными, которая превращает любую SQL‑базу в headless CMS, предоставляя автоматическую REST и GraphQL API и удобный веб-интерфейс для управления контентом.
С таким ПО я столкнулся впервые, поэтому принялся ресёрчить все возможные там API-эндпоинты, файловую структуру и искать уже известные уязвимости (CVE).
Первым делом встала задача определить версию Directus. Немного покопавшись в интернете, обнаружился эндпоинт, раскрывающий версию ПО в одной из констант JS-файла по пути "/admin/assets/...js":
const jN="9.23.3"
Это позволило отсортировать все CVE под данную версию.
Уязвимостей было обнаружено полно, но в рамках этого поста хочу акцентировать внимание на ключевой, которую обнаружил сам, — загрузка любых файлов в админскую Библиотеку файлов без аутентификации + раскрытие списка файлов на эндпоинте /files. Получить доступ к любому файлу можно, зная его ID. После загрузки файлу автоматически присваивается идентификатор, и он становится доступен по публичному URL вида /assets/<ID>.
▎ Риски:
➡️Загрузка вредоносного ПО. Злоумышленник может поместить исполняемые файлы или скрипты, что при их запуске приведет к компрометации системы;
➡️Фишинговые атаки от имени компании с помощью публичных ссылок /assets/<ID>;
➡️Доступны все файлы в "Библиотеке файлов" без аутентификации: невозможность конфиденциально хранить документы и прочую чувствительную информацию для компании;
➡️А также другие риски в имеющихся уязвимостях, речи о которых в данном посте нет.
▎ Рекомендации по устранению уязвимостей:
✅Ограничить публичный доступ к конечной точки загрузки файлов — требовать аутентификацию и авторизацию для загрузок;
✅Валидировать содержимое файлы по проверке сигнатуры (MIME, magic bytes);
✅Ограничить типы и расширения файлов. Явно запрещать исполняемые форматы (например, .exe, .bat, .sh, .php и т.п.) и другие нежелательные форматы. Разрешать строго только необходимых типов по белому списку;
✅Закрыть доступ к конечной точке /files для неавторизованных пользователей;
✅Обновить версию Directus — решит множество проблем разом.
▎ Для пентестеров, обнаруживших Directus в проде:
➡️1) Первым делом определите версию ПО;
➡️2) С имеющейся версией пробуйте эксплуатировать ряд CVEшек. Ссылки на списки оставил в конце поста;
➡️3) Обязательно проверьте наличие GraphQL со включённой интроспекцией. Мне также попались alias flood, мутация без аутентификации и т.д.
Часть уязвимостей в списках CVE эксплуатируется только при наличии сессии — это отличный кейс для серого ящика. На этом проекте я как раз работал по методикам чёрного и серого ящика.
UPD. Оказывается, это не уязвимость в самой коробке, а просто мисконфиг на проекте, допускающий загрузку файлов без аутентификации.
🔗 Ссылка на список CVE Directus в Snyk
🔗 Ссылка на список CVE Directus в GitHub
🔗 Ссылка на список CVE Directus в GitLab
#кейс #материал
