
k8scout v0.1.2
Разместите один бинарный файл в скомпрометированном поде Kubernetes и мгновенно получите карту всех реалистичных путей атаки до кластерного администратора, ухода из узла (node escape), кражи секретов и захвата облачного IAM.
k8scout
Бета — Одно-бинарный движок для поиска путей атак в Kubernetes, предназначенный для санкционированных оценок безопасности.
Закиньте его в скомпрометированный под, запустите и получите карту всех реалистичных путей эскалации — от вашей текущей точки входа до кластерного администратора, доступа к узлам, кражи секретов и облачных IAM-ролей.
Идея
У вас есть RCE в поде Kubernetes. Что дальше?
k8scout отвечает на этот вопрос. Он автоматически выясняет, что может делать сервисный аккаунт скомпрометированного пода, строит граф RBAC и находит многошаговые пути атак от вашей точки входа до ценных целей.
Он работает в трёх режимах:
- Атакующий режим (по умолчанию) — запускается изнутри скомпрометированного пода. Определяет вашу личность, разрешения и все достижимые пути эскалации из текущего положения.
- Режим рецензента (
--reviewer-mode) — запускается с read-only SA для аудита всей поверхности атак кластера для всех учётных записей. - Режим разведки (
--recon) — быстрый, малозаметный сбор информации о вашей личности, эффективных разрешениях и ресурсах, к которым у вас есть доступ. Без графа и поиска путей. Добавьте--bruteforce-ns, чтобы обнаружить пространства имён, которые вы не можете перечислить во всём кластере.
Демо
Что он находит
k8scout строит взвешенный граф разрешений и использует поиск путей Дейкстры для обнаружения реалистичных многошаговых цепочек атак:
- От пода до кластерного администратора — через привязки RBAC, мутацию рабочих нагрузок или создание CRB
- Побег из контейнера на узел — через привилегированные контейнеры, hostPID, hostNetwork, опасные capabilities или монтирования hostPath
- Латеральное перемещение — exec в другие поды, кража их SA-токенов, переход по их разрешениям
- Кража секретов и учётных данных — смонтированные SA-токены, секреты, configmap'ы с утёкшими учётными данными, осиротевшие токены
- Эскалация облачных IAM — IRSA (AWS), GKE Workload Identity, Azure Workload Identity, злоупотребление аудиториями projected token
- Цепочки подмены — захват SA через права impersonation
- Мутация рабочих нагрузок — изменение deployment для смены его SA, затем наследование разрешений этого SA
- Внедрение вебхуков — контроль над мутирующим вебхуком для внедрения в будущие рабочие нагрузки
- Злоупотребление GitOps-операторами — эскалация привилегий через ArgoCD, Flux, External Secrets и Vault operator
- Обнаружение ошибок конфигурации — висящие привязки, wildcard verbs, автоматически смонтированные токены, секреты в открытом виде в переменных окружения
Каждая находка включает идентификаторы техник MITRE ATT&CK, оценку риска и пошаговый путь атаки с указанием реальных узлов графа. Всего 50 правил обнаружения.
Быстрый старт
Из скомпрометированного пода (основной сценарий)
# Копируем бинарник внутрь пода
kubectl cp k8scout-linux-amd64 <ns>/<pod>:/tmp/k8scout
# Запускаем
kubectl exec -it <ns>/<pod> -- chmod +x /tmp/k8scout
kubectl exec -it <ns>/<pod> -- /tmp/k8scout --out /tmp/result.json
# Забираем результаты
kubectl cp <ns>/<pod>:/tmp/result.json ./result.json
# Этот же сценарий работает в revshell!
Бинарник автоматически определяет, что запущен внутри кластера, идентифицирует под и SA, и начинает поиск путей от вашей точки входа.
Предназначение: Тестирование на проникновение, операции красных команд, внутренние аудиты безопасности и проверки ужесточения кластера. Всегда получайте соответствующее разрешение перед запуском против любого кластера.
С вашей локальной машины
# Использует ~/.kube/config или $KUBECONFIG
k8scout --all-namespaces --out result.json
# Анализ одного пространства имён
k8scout --namespace production --out result.json
Режим разведки (быстрая проверка разрешений и ресурсов)
# Кто я, что я могу делать, к каким ресурсам имею доступ?
k8scout --recon
# Обнаружение пространств имён, которые нельзя перечислить во всём кластере (встроенный словарь)
k8scout --recon --bruteforce-ns
# Собственный словарь пространств имён (одно имя на строку)
k8scout --recon --bruteforce-ns --ns-wordlist ./namespaces.txt
Разведка пропускает построение графа, логический вывод и AI — это самый быстрый способ ответить на вопрос «что на самом деле есть у этого токена?». Она сообщает текущую личность, её эффективные разрешения (SelfSubjectRulesReview) и поресурсную матрицу возможностей (SelfSubjectAccessReview). Флаг --bruteforce-ns подтверждает существование пространства имён, читая известные объекты, которые есть в каждом namespace (сам namespace, его default ServiceAccount или ConfigMap kube-root-ca.crt) — полезно, когда личность не может перечислять пространства имён, но всё же может иметь доступ к конкретным.
Режим рецензента (полный аудит кластера)
# Разворачиваем read-only RBAC и задачу
kubectl apply -f deploy/rbac.yaml
kubectl apply -f deploy/job.yaml
# Или запускаем напрямую с правами рецензента
k8scout --reviewer-mode --all-namespaces --out result.json
С AI-повествованием
export OPENAI_API_KEY="sk-..."
k8scout --all-namespaces --out result.json
Установка
Предварительно собранные бинарники
Скачайте со страницы Релизы. Все бинарники статически слинкованы и не имеют зависимостей.
| Исполняемый файл | Платформа |
|---|---|
k8scout-linux-amd64 | Linux x86-64 |
k8scout-linux-arm64 | Linux ARM64 |
k8scout-darwin-amd64 | macOS Intel |
k8scout-darwin-arm64 | macOS Apple Silicon |
Сборка из исходников
Требуется Go 1.22+.
git clone https://github.com/hac01/k8scout
cd k8scout
make build # родной бинарник
make build-linux # статический Linux amd64
make build-all # все четыре целевые платформы
Как это работает
k8scout (запущен внутри скомпрометированного пода)
|
├── 1. Определение точки входа
│ Имя пода (HOSTNAME), SA (TokenReview), Узел (downward API)
│
├── 2. Обнаружение разрешений
│ SSRR по каждому namespace + ~30 параллельных SSAR-проверок
│ (всегда разрешено, RBAC не требуется)
│
├── 3. Перечисление объектов кластера (плавная деградация при отказе)
│ Namespaces, RBAC, Workloads, Pods, Secrets, Nodes, Webhooks, CRDs
│
├── 4. Построение графа атак
│ Узлы: поды, SA, роли, привязки, секреты, рабочие нагрузки, узлы, облачные учётные записи
│ Рёбра: runs_as, mounts, authenticates_as, can_exec, can_patch,
│ can_impersonate, runs_on, assumes_cloud_role, granted_by, ...
│
├── 5. Поиск путей атак (Дейкстра от точки входа до ценных целей)
│ Взвешены по усилиям атакующего — сначала самые дешёвые (реалистичные) пути
│ Цели: кластерный админ, узлы, SA-токены, облачные IAM, привилегированные workloads
│
├── 6. Выполнение правил логического вывода (50 правил с MITRE ATT&CK)
│
├── 7. Опционально: AI-повествование о рисках (GPT-4o)
│
└── 8. Вывод: текстовое резюме + JSON-отчёт
Даже с минимальным SA, который не может перечислять поды или объекты RBAC, инструмент синтезирует граф точки входа на основе только данных об учётной записи и обнаруживает, что доступно через разрешения SSRR/SSAR.
Визуализация графа атак
Загрузите JSON-отчёт в web/graph.html в любом браузере (перетаскивание, сервер не нужен).
- Вкладка «Пути атак» — отсортированы по оценке риска, каждый показывает полную цепочку переходов от точки входа до цели
- Мульти-цепочковый вид — одновременная визуализация перекрывающихся путей атак на одном графе
- Силовой граф — все узлы и рёбра с цветовой кодировкой по категориям и кольцами оценки риска
- Режим фокусировки — затемняет структурный шум, выделяя узлы, релевантные для атаки
- Переключатель RBAC — скрывает RBAC-узлы, но автоматически показывает их, если они являются частью активного пути атаки
- Мини-карта — навигация по большим графам без потери контекста
- Детали узла — клик по любому узлу для просмотра метаданных, связей и связанных находок
- Экспорт — скачивание самодостаточного HTML-отчёта pentest
CLI-справка
k8scout [flags]
Flags:
--out string Путь к выходному JSON-файлу (по умолчанию "k8scout-result.json")
--namespace string Анализировать одно пространство имён
--all-namespaces Анализировать все доступные пространства имён (по умолчанию true)
--format string Формат вывода: text | json (по умолчанию "text")
--timeout int Тайм-аут запроса в секундах (по умолчанию 60)
--log-level string debug | info | warn | error (по умолчанию "info")
--kubeconfig string Путь к kubeconfig (автоопределение, если не задан)
--reviewer-mode Полный аудит RBAC кластера для всех учётных записей
--recon Быстрая разведка: личность, разрешения (SSRR), доступные ресурсы (SSAR)
--bruteforce-ns Подбор имён пространств имён для поиска тех, которые нельзя перечислить (с --recon)
--ns-wordlist string Собственный словарь пространств имён для --bruteforce-ns (по умолчанию встроенный список)
--stealth Пропустить SSRR/SSAR для уменьшения следа в журнале аудита
--skip-ssar Пропустить только SSAR-проверки
--openai-key string Ключ API OpenAI (или переменная окружения OPENAI_API_KEY)
--openai-model string Модель OpenAI (по умолчанию "gpt-4o")
--skip-ai Пропустить генерацию AI-повествования
Требования RBAC
При запуске из скомпрометированного пода: Специальные права RBAC не нужны. SSRR и SSAR всегда разрешены. Инструмент плавно деградирует, если SA не может перечислять объекты кластера — он всё равно обнаруживает разрешения и генерирует находки на основе доступных данных.
Для полного перечисления (рекомендуется для SA k8scout): доступ только на чтение, определён в deploy/rbac.yaml:
namespaces,nodes: get, listserviceaccounts,secrets(только метаданные),configmaps: get, listpods,deployments,daemonsets,statefulsets,jobs,cronjobs: get, listroles,rolebindings,clusterroles,clusterrolebindings: get, listmutatingwebhookconfigurations,validatingwebhookconfigurations: get, list
Значения секретов никогда не читаются, если личность не подтвердила право на GET через SSAR.
Обратная связь по бете
k8scout находится в активной разработке. Если вы столкнулись с ошибкой, ложным срабатыванием или пробелом в обнаружении в вашем кластере, пожалуйста, создайте issue. Ложные срабатывания и пропущенные пути особенно полезны — по возможности приложите анонимизированный JSON находки.
Лицензия
MIT