LIMB
Вход Регистрация

тема

От Argo CD к кластер-админу: захватываем Kubernetes

DenD · · 0 ответов · 861 просмотров

Всем привет.
В прошлой статье мы разобрали, как получить доступ к ноде в кластере Kubernetes через доступ к Argo CD. Такой доступ имеет недостатки: он не интерактивен, не дает доступа к остальным нодам, ко всем-всем секретам кластера, да и просто - получить кластер админа при пентесте звучит более интересно. В этой статье я покажу один из способов реализации такой задачи.

Для удобства работы с kubernetes есть утилита kubectl. При нашем доступе на ноду она дает дефолтные минимальные права:

Не удалось прогрузить медиа


Этого, разумеется, мало - нам бы хотелось читать секреты кластера, создавать поды, исполнять код в нодах. Короче говоря, нам бы хотелось всё.
После того, как я примонтировал файловую систему ноды к папке /host, гуляя по её директориям, я нашёл файлик kubeconfig;

Не удалось прогрузить медиа


В файле явно указаны ключ и сертификаты, которые должны использоваться для доступа к серверу. Примечательно, что сервер ...azmk8s.io недоступен изнутри кластера, только извне. Поэтому мы копируем файл kubelet-client-current.pem к себе на машину и создаем у себя файлик kubeconfig.yaml со следующим содержимым:

Bash

apiVersion: v1
clusters:
- cluster:
certificate-authority: ca.crt
server: https://[адрес].azmk8s.io:443
name: default-cluster
contexts:
- context:
cluster: default-cluster
namespace: default
user: default-auth
name: default-context
current-context: default-context
kind: Config
preferences: {}
users:
- name: default-auth
user:
client-certificate: kubelet-client-current.pem
client-key: kubelet-client-current.pem
 
Затем нужно дать понять терминалу, с каким конфигом мы будем работать:

Bash
export KUBECONFIG=kubeconfig.yaml

Теперь нам не нужен VPS-сервер и Argo CD - мы получаем доступ, напрямую обращаясь к Kubernetes API:

Не удалось прогрузить медиа


Права нам тоже добавили, но не от всего сердца - хотелось бы на все ресурсы иметь все глаголы. Но мы получили серьёзный бонус - теперь можем читать секреты.

Не удалось прогрузить медиа


Не густо. Дело в том, что Kubernetes использует разграничение по пространствам имён. Это нужно для того, чтобы пользователи из одного проекта не лазили в другие. Хорошо, что у нас есть доступ ко всем секретам:

Не удалось прогрузить медиа


На выходе я получил большую кучу секретов, основная часть из которых - токены системных учётных записей. К сожалению, в кубере дефолтные служебные учетки не имеют прав кластер админа, поэтому можно, к примеру, искать токены со словами "admin", "claster", "access" в названии, желательно из namespace kube-system. У меня таких не оказалось, зато привлек внимание такой секрет:

Не удалось прогрузить медиа


Получаем этот токен из namespace tigera-operator:

Не удалось прогрузить медиа


Все данные зашифрованы в base64. Декодим значение token и создаем новый файлик kubik.conf - это будет наш конфиг с правами tigera-operator-token:

Bash

apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: https://[адрес].azmk8s.io:443
name: pentest-cluster
contexts:
- context:
cluster: pentest-cluster
user: pentest-user
name: pentest-context
current-context: pentest-context
kind: Config
users:
- name: pentest-user
user:
token: eyJhbGciOiJSUzI1NiIsImtpZC....[раскодированный токен]


Аналогичным образом экспортируем новый конфиг:

Bash

export KUBECONFIG=kubik.yaml

Момент Х настал - смотрим на права:

Не удалось прогрузить медиа


Вот, пожалуйста, и глаголов больше, и ресурсы опять в скриншот не влезли. Все бы хорошо, но хочется видеть напротив pods и nodes глагол exec - это для выполнения кода в них.
Вглядываемся внимательно, замечаем кучу глаголов на ресурс roles.rbac.authorization.k8s.io. Бинго.
Пока я пытался повысить привилегии разными путями, я понял, что файлик kubeconfig.yaml дает нам права к юзеру aks-agentpool-12322582-vmss000004. Можем навесить ему прав:

Bash

kubectl create clusterrolebinding full-admin --clusterrole=cluster-admin --user=system:node:aks-agentpool-12322582-vmss000004

Вернемся к нашему юзеру и проверим его права:

Bash

export KUBECONFIG=kubeconfig.yaml
kubectl auth can-i --list

Не удалось прогрузить медиа


Есть контакт. "." означает все ресурсы, а глаголы [*} - все глаголы. Неожиданно.
Теперь можем подключиться к любому поду, а лучше сразу к ноде:

Не удалось прогрузить медиа


Таким образом мы получили полноценный ssh-доступ кластер админа к Kubernetes API с возможностью делать всё, что пожелается на любых подах и нодах. До хранилища etcd остаются считанные команды. На таргете не было, поэтому без этих самых команд) 
👍55 👏9 🤔6 😢16 💯6

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.