Продолжаем публиковать кейсы наших экспертов, которые стали призёрами на конкурсе 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 кластер.
Подробное описание кейса читайте в нашем гитхабе.
Post #221
423

- 👍 7
- 🔥 7
- ❤ 3