![]() |
https://forum.antichat.xyz/attachmen...5246d88f1a.png
На каждом втором red team-проекте с контейнерной инфраструктурой я вижу одну и ту же картину: команда разработки развернула Kubernetes, настроила CI/CD, накатила Helm-чарты - и считает, что контейнеры сами по себе всё изолируют. Мол, контейнер же! Почти виртуалка! Нет. Контейнер - это группа процессов, отгороженных от хоста набором Linux-примитивов: namespaces, cgroups и capabilities. Никакого отдельного ядра. Стоит одному из этих заборчиков дать трещину - атакующий вываливается на хост, а оттуда до cluster-admin остаётся несколько команд. https://forum.antichat.xyz/attachmen...6526663800.png Дальше - полная цепочка атаки при пентесте контейнеров Docker и Kubernetes: от разведки и container breakout до эскалации привилегий в k8s и захвата кластера. Каждый шаг - из реальной практики, с командами, CVE и ссылками на MITRE ATT&CK. Разведка контейнерной инфраструктуры снаружи и изнутри Любой пентест контейнеров начинается с определения поверхности атаки. Контейнерная инфраструктура выставляет наружу характерный набор портов и сервисов - опытный глаз распознаёт их мгновенно. Внешнее обнаружение Docker и Kubernetes При внешнем сканировании ищем конкретные порты: 2375/tcp (Docker API без TLS), 2376/tcp (Docker API с TLS), 5000/tcp (Docker Registry), 6443/tcp (Kubernetes API Server), 8080/tcp (K8s API без аутентификации - на self-hosted кластерах бывает), 10250/tcp (kubelet API), 10255/tcp (kubelet read-only), 2379/tcp (etcd). Проверка тривиальна: Код:
curl -s http://:2375/versionКод:
curl -k https://:6443/api/v1В Shodan и Censys контейнерные сервисы обнаруживаются запросами вида Код:
product:"Kubernetes" port:6443Код:
docker port:2375 200 OKКод:
http.title:"Kubernetes Dashboard"С точки зрения MITRE ATT&CK это этап Discovery - техника Container and Resource Discovery (T1613). Определяем топологию контейнерной среды перед тем, как планировать дальнейшие шаги. Ориентирование внутри скомпрометированного контейнера Если начальная точка - скомпрометированный контейнер (через уязвимое веб-приложение, RCE, утёкшие credentials), первым делом определяем контекст. Нужно понять: мы в Docker-контейнере или в Kubernetes-поде, какие привилегии и capabilities доступны, какие volumes смонтированы. Проверка идёт по простой цепочке. Файлы в Код:
/var/run/secrets/kubernetes.io/serviceaccount/Код:
tokenКод:
ca.crtКод:
namespaceКод:
cat /proc/1/cgroupКод:
dockerКод:
kubepodsКод:
capsh --printКод:
/proc/1/statusКод:
CAP_SYS_ADMINBash: Код:
# Быстрая ориентировка внутри контейнераКод:
ls -la /var/run/docker.sockКод:
mountContainer breakout - техники побега из Docker Docker escape - ключевой этап в цепочке атаки. По классификации MITRE ATT&CK это Escape to Host (T1611, Privilege Escalation). Условия для побега делятся на три категории: уязвимости runtime, привилегированные контейнеры и мисконфигурации. Эксплуатация Docker socket Смонтированный Код:
/var/run/docker.sockЕсли внутри контейнера есть клиент Код:
dockerКод:
docker -H unix:///var/run/docker.sock run --rm -it --privileged --pid=host -v /:/host alpine chroot /host /bin/shКод:
curlBash: Код:
# Создание привилегированного контейнера через Docker APIКод:
/hostНюанс из практики: иногда между контейнером и Docker socket стоит прокси-фильтр (например, docker-socket-proxy от Tecnativa), который блокирует опасные вызовы API. Тогда стоит попробовать read-only эндпоинты - Код:
/infoКод:
/versionКод:
/containers/jsonПривилегированные контейнеры и Linux capabilities Контейнер с флагом Код:
--privilegedКод:
privileged: trueКод:
/devПобег через cgroups v1 release_agent - классика. Суть: создаём cgroup, указываем Код:
release_agentКод:
CAP_SYS_ADMINНо даже без полного Код:
--privilegedКод:
CAP_SYS_ADMINКод:
CAP_SYS_PTRACEКод:
CAP_SYS_ADMINКод:
nsenterКод:
CAP_DAC_READ_SEARCHКод:
open_by_handle_atПо данным Red Hat (2024 Kubernetes security report), более двух третей организаций замедлили внедрение контейнеров из-за опасений безопасности, а почти половина понесли финансовые потери от инцидентов с контейнерами. Цифры говорят сами за себя. Уязвимости container runtime: хронология и практика Уязвимости runtime - самый критичный вектор, потому что позволяют побег даже из правильно настроенного контейнера. Тут уже не мисконфиг - тут баг в самом фундаменте. CVE-2019-5736 (runc, CVSS 8.6) - классика container escape. Уязвимость в runc до версии 1.0-rc6 (Docker до 18.09.2) позволяла перезаписать бинарник runc на хосте и получить root. Вектор: через подконтрольный образ или через Код:
docker execCVE-2024-21626 (runc, CVSS 8.6) - более свежая. В runc 1.1.11 и ранее из-за утечки внутреннего файлового дескриптора (CWE-403, CWE-668) новый процесс через Код:
runc execCVE-2024-0132 (NVIDIA Container Toolkit, CVSS 9.0 CRITICAL) - TOCTOU-уязвимость (CWE-367) в версии 1.16.1 и ранее. По данным Wiz Research, специально сформированный образ мог получить доступ к ФС хоста. Эксплойт монтировал корневую ФС хоста внутрь контейнера, а дальше через Код:
docker.sockCVE-2025-9074 (Docker Desktop, CVSS 9.3 CRITICAL) - 2025 год. Контейнеры могли обращаться к Docker Engine API через внутреннюю подсеть Docker (по умолчанию Код:
192.168.65.7:2375CVE-2025-31133 (runc, CVSS 7.3) - свежая, runc до 1.2.7. При маскировке путей через Код:
/dev/nullКод:
/dev/nullЯдерные уязвимости - отдельная категория. CVE-2022-0847 (Dirty Pipe, CVSS 7.8, CWE-665) позволяла перезаписывать данные в read-only файлах. Сама по себе это privilege escalation, но в контексте контейнеров она комбинируется: если внутри контейнера доступен бинарник runc, атакующий перезаписывает его вредоносной версией - и при следующем вызове получает выполнение на хосте. CVE-2022-0492 (CVSS 7.8, CWE-287/CWE-862) - уязвимость в Код:
cgroup_release_agent_writeKubernetes pentest - от пода к кластеру Docker escape даёт root на одной ноде. Атаки на Kubernetes открывают путь к управлению всем кластером. Kubernetes добавляет собственный слой абстракции - и собственный зоопарк векторов атак. Атаки на kubelet API и незащищённый etcd Kubelet API (порт 10250) - агент на каждой ноде, управляющий подами. По умолчанию требует аутентификацию, но на self-hosted кластерах нередко встречается Код:
--anonymous-auth=trueКод:
/run///Проверка: Код:
curl -k https://:10250/podsКод:
curl -k -XPOST -H "Content-Type: application/x-www-form-urlencoded" https://:10250/run/// -d 'cmd=id'Код:
/run/Код:
/exec/Код:
kubeletctlEtcd (порт 2379) - распределённая key-value база, где Kubernetes хранит всё состояние кластера: конфигурации, секреты, токены service accounts. По умолчанию etcd требует TLS-аутентификацию клиентскими сертификатами, но эту настройку иногда отключают. Если etcd доступен без аутентификации, одна команда Код:
etcdctl get / --prefix --keys-onlyКод:
etcdctl get /registry/secrets//RBAC misconfiguration и эскалация привилегий в k8s Role-Based Access Control - основной механизм авторизации в Kubernetes. На практике мисконфигурации RBAC - главный вектор эскалации привилегий в k8s. Проблема стара как мир: для быстрого решения проблем администраторы выдают избыточные права service accounts. «Потом поправим». Не поправят. Первым делом после получения доступа к поду проверяем возможности нашего service account: Код:
kubectl auth can-i --listКод:
create podsКод:
create deploymentsКод:
get secretsНаиболее опасные комбинации RBAC-прав, которые я эксплуатировал на реальных проектах: ПравоЧто даёт атакующемуТехника MITRE ATT&CK Код:
create podsКод:
create daemonsetsКод:
get secretsКод:
create clusterrolebindingsКод:
patch podsКод:
create serviceaccounts/tokenСамый быстрый путь к cluster-admin: если SA имеет право Код:
create clusterrolebindingsКод:
kubectl create clusterrolebinding pwned --clusterrole=cluster-admin --serviceaccount=:Если прав на создание clusterrolebindings нет, но есть Код:
create podsКод:
hostPID: trueКод:
hostNetwork: trueКод:
hostPathКод:
/Код:
/hostКод:
nsenter -t 1 -m -u -i -n -p -- bashLateral movement через Kubernetes-примитивы После первоначальной эскалации Kubernetes сам становится инструментом для lateral movement. Забудьте про SSH-туннели - атакующий использует нативные механизмы оркестратора, и это красиво (с точки зрения атакующего, конечно). Service account tokens в Kubernetes до версии 1.24 по умолчанию монтировались в каждый под как долгоживущие секреты. Даже в более новых версиях с bound tokens часто остаются legacy-конфигурации. Каждый скомпрометированный под - потенциальный источник нового токена с другими правами. Через Код:
kubectl get serviceaccounts -AConfigMaps и Secrets часто содержат credentials к внешним системам: базам данных, облачным API, CI/CD. Команда Код:
kubectl get secrets -A -o jsonDaemonSets - объект Kubernetes, который гарантирует запуск пода на каждой ноде кластера. Для атакующего это механизм массового развёртывания: один манифест - и ваш код работает на всех нодах одновременно. На практике используется как для закрепления (persistence), так и для криптомайнинга - Compute Hijacking (T1496.001). Инструменты для пентеста контейнеров Docker и Kubernetes Полноценный пентест контейнерной инфраструктуры требует специализированного инструментария. Вот что я использую и в каком порядке: CDK (Container Penetration Toolkit) - основной инструмент для работы изнутри скомпрометированного контейнера. Один статический бинарник, никаких зависимостей. Команда Код:
./cdk evaluateКод:
./cdk runkube-hunter от Aqua Security - сканер уязвимостей в Kubernetes. Три режима: удалённо (по IP), изнутри пода и active hunting (пытается эксплуатировать найденное). На проектах запускаю его из скомпрометированного пода в active-режиме - автоматически находит открытые kubelet, незащищённый etcd и мисконфигурации API-сервера. Trivy - для анализа образов на известные CVE. Если есть доступ к приватному Docker Registry (порт 5000), скачиваю образы и прогоняю через Trivy: часто нахожу уязвимые версии runtime-компонентов или забытые секреты в слоях образа. Peirates - постэксплуатация в Kubernetes. Автоматизирует сбор secrets с нод, перебор service accounts, проверку RBAC-прав. Незаменим, когда нужно быстро оценить масштаб компрометации в большом кластере. kubesploit (CyberArk) - пост-эксплуатационный фреймворк, что-то вроде Metasploit для контейнерных сред. Модули для container escape, lateral movement и persistence в Kubernetes. Для аудита конфигурации (когда нужно показать заказчику масштаб проблем): kube-bench (проверка CIS Kubernetes Benchmark) и kubescape (линтер YAML-манифестов на безопасность). Безопасность Kubernetes и Docker - что реально останавливает пентестера За годы работы я составил свой список защитных мер, которые действительно осложняют жизнь атакующему - не «галочки в чеклисте», а реальные препятствия. Pod Security Standards / Pod Security Admission (замена устаревших PodSecurityPolicies) в режиме enforce с профилем Код:
restrictedNetwork Policies - по умолчанию в Kubernetes все поды общаются друг с другом. Грамотные Network Policies с deny-all default и точечными разрешениями резко ограничивают lateral movement. Без них атакующий из одного пода через внутреннюю сеть кластера добирается до etcd, kubelet и API-сервера. Минимальный securityContext для каждого контейнера - Код:
runAsNonRoot: trueКод:
allowPrivilegeEscalation: falseКод:
readOnlyRootFilesystem: trueКод:
capabilities: drop: ALLYAML: Код:
# securityContext, который реально останавливает container breakoutgVisor и Kata Containers - hardened runtimes с дополнительным слоем изоляции. gVisor перехватывает системные вызовы контейнера через собственное ядро (Sentry), Kata запускает каждый контейнер в лёгкой виртуальной машине. Container escape через ядерные уязвимости вроде Dirty Pipe становится бесполезным - атакующий попадает в ядро gVisor/Kata VM, а не хоста. Ощущение, как будто ломишь стену, а за ней ещё одна стена. Своевременный патчинг runtime - банально, но критически важно. Между публикацией CVE-2024-21626 и массовым обновлением runc на продуктивных кластерах прошли месяцы. Всё это время среды были уязвимы. Мониторинг версий через Trivy и автоматизация обновлений - необходимость, а не рекомендация. И наконец - не монтируйте Docker socket в контейнеры. Если CI/CD требует сборки образов - используйте Kaniko (сборка без Docker daemon) или rootless Docker-in-Docker. Каждый смонтированный docker.sock на пентесте превращается в container breakout за 30 секунд. Тридцать. Секунд. Чеклист для пентеста контейнерной инфраструктуры Пентест контейнеров Docker и Kubernetes - последовательное движение по цепочке, где каждый этап опирается на предыдущий:
Код:
create podsПроверьте свои кластеры: Код:
kubectl auth can-i --list --as=system:serviceaccount:default:defaultКод:
get |
| Время: 22:04 |