AWS - EKS Постексплуатація

Reading time: 6 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

EKS

Для отримання додаткової інформації перегляньте

AWS - EKS Enum

Перерахунок кластера з консолі AWS

Якщо у вас є дозвіл eks:AccessKubernetesApi, ви можете переглядати об'єкти Kubernetes через консоль AWS EKS (Дізнайтеся більше).

Підключення до AWS Kubernetes Кластера

  • Легкий спосіб:
bash
# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • Не такий простий спосіб:

Якщо ви можете отримати токен за допомогою aws eks get-token --name <cluster_name>, але у вас немає дозволів на отримання інформації про кластер (describeCluster), ви можете підготувати свій власний ~/.kube/config. Однак, маючи токен, вам все ще потрібен url-адреса для підключення (якщо вам вдалося отримати JWT токен з поду, читайте тут) і назва кластера.

У моєму випадку я не знайшов інформацію в журналах CloudWatch, але я знайшов її в LaunchTemaplates userData і в EC2 машинах у userData також. Ви можете легко побачити цю інформацію в userData, наприклад, у наступному прикладі (назва кластера була cluster-name):

bash
API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com

/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false
kube конфігурація
yaml
describe-cache-parametersapiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
contexts:
- context:
cluster: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
user: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
current-context: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- --region
- us-west-2
- --profile
- <profile>
- eks
- get-token
- --cluster-name
- <cluster-name>
command: aws
env: null
interactiveMode: IfAvailable
provideClusterInfo: false

Від AWS до Kubernetes

Творець EKS кластера ЗАВЖДИ зможе отримати доступ до частини кластера kubernetes групи system:masters (k8s адміністратор). На момент написання цього тексту немає прямого способу дізнатися хто створив кластер (можна перевірити CloudTrail). І немає способу видалити цей привілей.

Спосіб надати доступ до K8s для більше AWS IAM користувачів або ролей - це використання configmap aws-auth.

warning

Тому будь-хто з доступом на запис до конфігураційної карти aws-auth зможе компрометувати весь кластер.

Для отримання додаткової інформації про те, як надати додаткові привілеї IAM ролям і користувачам в одному або різних облікових записах і як зловживати цим, щоб перевірити privesc, перегляньте цю сторінку.

Перегляньте також цей чудовий пост, щоб дізнатися, як працює аутентифікація IAM -> Kubernetes.

Від Kubernetes до AWS

Можливо дозволити OpenID аутентифікацію для облікового запису служби kubernetes, щоб дозволити їм приймати ролі в AWS. Дізнайтеся, як це працює на цій сторінці.

ОТРИМАТИ Api Server Endpoint з JWT Токена

Декодувавши JWT токен, ми отримуємо ідентифікатор кластера та також регіон. image Знаючи, що стандартний формат для URL EKS є

bash
https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com

Не знайшов жодної документації, яка б пояснювала критерії для 'двох символів' та 'числа'. Але, проводячи деякі тести, я бачу, що ці символи повторюються:

  • gr7
  • yl4

В будь-якому випадку, це всього лише 3 символи, ми можемо їх перебрати. Використовуйте наведену нижче скрипт для генерації списку.

python
from itertools import product
from string import ascii_lowercase

letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2)
number_combinations = product('0123456789', repeat = 1)

result = [
f'{''.join(comb[0])}{comb[1][0]}'
for comb in product(letter_combinations, number_combinations)
]

with open('out.txt', 'w') as f:
f.write('\n'.join(result))

Тоді з wfuzz

bash
wfuzz -Z -z file,out.txt --hw 0 https://<cluster-id>.FUZZ.<region>.eks.amazonaws.com

warning

Пам'ятайте, щоб замінити & .

Обхід CloudTrail

Якщо зловмисник отримує облікові дані AWS з дозволами на EKS. Якщо зловмисник налаштовує свій власний kubeconfig (без виклику update-kubeconfig) як було пояснено раніше, get-token не генерує журнали в Cloudtrail, оскільки не взаємодіє з AWS API (просто створює токен локально).

Отже, коли зловмисник спілкується з кластером EKS, cloudtrail не зафіксує нічого, що стосується вкраденого користувача та доступу до нього.

Зверніть увагу, що кластер EKS може мати увімкнені журнали, які зафіксують цей доступ (хоча за замовчуванням вони вимкнені).

Вимагач EKS?

За замовчуванням користувач або роль, яка створила кластер, ЗАВЖДИ матиме адміністративні привілеї над кластером. І це єдиний "безпечний" доступ, який AWS матиме до кластеру Kubernetes.

Отже, якщо зловмисник компрометує кластер, використовуючи fargate і видаляє всіх інших адміністраторів та видаляє користувача/роль AWS, яка створила кластер, зловмисник міг би вимагати кластер**.

tip

Зверніть увагу, що якщо кластер використовує EC2 VMs, може бути можливим отримати адміністративні привілеї з Node і відновити кластер.

Насправді, якщо кластер використовує Fargate, ви могли б EC2 вузли або перемістити все до EC2 в кластер і відновити його, отримуючи токени в вузлі.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks