↓ Перейти к основному содержимому
  1. Блог/

Как захватить k8s-кластер через мисконфиги

·2 минут·

Продолжаем публиковать кейсы наших экспертов, которые стали призёрами на конкурсе Pentest Award 2026. Сегодня будет история от Сергея Кабанова, получившего 3-е место в номинации “Kill Chain”. Цепочка из пяти сервисов, два независимых пути к cluster-admin — при этом внутри использовалась только одна старая CVE, а остальное сделано через мисконфиги. Поздравляем Сергея!

Суть кейса:

Архитектура некоторых сервисов может быть построена небезопасно по умолчанию: целевые приложения содержат в себе различные мисконфигурации и опасные функции, которые позволяют простым пользователям повысить свои привилегии, а иногда и захватить весь сервис.

В нашем случае, всё началось с эксплуатации CVE-2024-50340 на внешнем периметре, что позволило перевести Symfony-приложение в debug-режим и получить переменные окружения. Среди них нашлись учетные данные администратора сервиса Pimcore, а доступ к функционалу одного из его кастомных модулей в дальнейшем позволил добиться исполнения кода на сервере.

После компрометации хоста во внутренней инфраструктуре был обнаружен Harbor. В одном из доступных Helm-чартов оказался захардкоженный пароль от MongoDB ClearML, а уже в самой базе — access keys пользователей.

Дальше выяснилось, что возможностей обычного пользователя ClearML уже достаточно для серьёзного развития атаки. Через механизм запуска экспериментов удалось добиться исполнения кода, запустить привилегированный контейнер и в итоге выйти на ноду кластера.

На захваченном хосте нашёлся GitLab-токен с правами Maintainer в приватных проектах. С этого момента дальнейшая атака разделилась на два независимых вектора. Но в исследовании обоих векторов была задействована Grafana, которая была использована в качестве SSRF-прокси и тем самым помогла обойти network policy.

Исследование первого вектора строилось через приватный GitLab Runner и внутренние сервисы Kubernetes. Так с помощью Grafana удалось добраться до Longhorn, подменить его engine image и в конечном итоге получить права cluster-admin через ArgoCD.

Во втором случае удалось вмешаться уже в CI/CD-процесс: модифицировать генерируемый deploy pipeline, выполнить свой код внутри deploy job и получить kubeconfig продового namespace. Последним препятствием стал Kyverno Admission Controller, который удалось обойти благодаря сочетанию CVE-2020-8554 (не была пропатчена) и настроенного в кластере fail-open режима. В результате второй вектор также закончился получением прав администратора Kubernetes-кластера.

Таким образом, используя в основном мисконфигурации и небезопасную архитектуру приложений, удалось пробить внешний периметр и захватить продовый k8s кластер.

Подробное описание кейса читайте в нашем гитхабе.

Related