AWS - EKS Post Exploitation

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

EKS

有关更多信息,请查看

AWS - EKS Enum

从 AWS 控制台枚举集群

如果你拥有权限 eks:AccessKubernetesApi,你可以通过 AWS EKS 控制台 查看 Kubernetes 对象Learn more)。

连接到 AWS Kubernetes 集群

  • 简单方法:
# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
  • 不是那么简单的方法:

如果你能使用 aws eks get-token --name <cluster_name> 获取 token,但没有权限获取集群信息(describeCluster),你可以 准备你自己的 ~/.kube/config。但是,即使拥有 token,你仍然需要要连接的 url endpoint(如果你是从 pod 获取 JWT token,请阅读 here)以及 集群名称

在我的情况中,我没有在 CloudWatch 日志中找到这些信息,但我在 LaunchTemaplates userData 中找到了,并且在 EC2 machines 的 userData 中也找到了。你可以很容易地在 userData 中看到这些信息,例如在下面的例子中(集群名称是 cluster-name):

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::cluster/ contexts: - context: cluster: arn:aws:eks:us-east-1::cluster/ user: arn:aws:eks:us-east-1::cluster/ name: arn:aws:eks:us-east-1::cluster/ current-context: arn:aws:eks:us-east-1::cluster/ kind: Config preferences: {} users: - name: arn:aws:eks:us-east-1::cluster/ user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - --region - us-west-2 - --profile - - eks - get-token - --cluster-name - command: aws env: null interactiveMode: IfAvailable provideClusterInfo: false ```

从 AWS 到 Kubernetes

EKS cluster创建者 始终 能够进入 kubernetes 集群中属于 system:masters 组的部分(k8s admin)。在撰写本文时,没有直接方法 可以找出 谁创建了 该集群(你可以查看 CloudTrail)。并且 没有办法 移除特权

授予 更多 AWS IAM 用户或角色 对 K8s 的访问 的方式是使用 configmap aws-auth

Warning

因此,任何对 config map aws-auth 拥有 写权限 的人都能够 攻陷整个集群

有关如何在 相同或不同账户 中向 IAM roles & users 授予额外权限,以及如何滥用此方法进行 privesc 的更多信息,请查看此页面

另请查看这篇精彩的文章,了解 IAM -> Kubernetes 的认证是如何工作的。

从 Kubernetes 到 AWS

可以为 kubernetes service account 启用 OpenID authentication,以允许它们 assume roles 到 AWS。了解其工作流程,请参见this work in this page

从 JWT Token 获取 Api Server Endpoint

解码 JWT token 后我们可以得到 cluster id 和 region。 image 知道 EKS URL 的标准格式是

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

没找到任何文档来解释 ‘two chars’ 和 ‘number’ 的判定标准。但根据我做的一些测试,我看到重复出现以下这些:

  • gr7
  • yl4

无论如何,这只是 3 个字符,我们可以对其进行 bruteforce。使用下面的脚本生成列表:

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

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 入侵集群移除了所有其他管理员并 d删除了创建该 Cluster 的 AWS 用户/角色攻击者可能已经 勒索了集

Tip

注意,如果集群使用的是 EC2 VMs,则可能通过 Node 获取管理员权限并恢复集群。

实际上,如果集群使用 Fargate,你可以获取 EC2 节点或将所有内容迁移到 EC2(到集群)并通过访问节点中的令牌来恢复它。

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks