EKS
有关更多信息,请查看
AWS - EKS Enum从AWS控制台枚举集群
如果您拥有**eks:AccessKubernetesApi
**权限,您可以通过AWS EKS控制台查看Kubernetes对象(了解更多)。
连接到AWS Kubernetes集群
# Generate kubeconfig
aws eks update-kubeconfig --name aws-eks-dev
如果你可以使用 aws eks get-token --name <cluster_name>
命令获取一个令牌,但是没有权限获取集群信息(describeCluster),你可以 准备自己的 ~/.kube/config
。然而,即使有了令牌,你仍然需要 连接到的url端点(如果你成功从一个pod中获取了JWT令牌,请阅读这里)和 集群的名称。
在我的情况下,我没有在CloudWatch日志中找到这些信息,但我在 LaunchTemplates 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 集群的创建者始终可以进入组中的 kubernetes 集群部分的 system:masters
(k8s 管理员)。在撰写本文时,没有直接的方法可以找到创建集群的人(您可以检查 CloudTrail)。并且没有办法去移除这个特权。
授予更多 AWS IAM 用户或角色对 K8s 的访问权限的方法是使用 aws-auth
configmap。
因此,任何具有对 aws-auth
config map 的写入访问权限的人都将能够** compromise 整个集群**。
有关如何在相同或不同帐户中向 IAM 角色和用户授予额外权限以及如何滥用此功能,请查看此页面。
还可以查看这篇很棒的文章 以了解 IAM 身份验证 -> Kubernetes 的工作原理。
从 Kubernetes 到 AWS
可以允许为 kubernetes 服务帐户启用 OpenID 身份验证,以便它们可以在 AWS 中扮演角色。了解此页面中的工作方式。
从 JWT 令牌获取 Api 服务器端点
解码 JWT 令牌,我们可以获得集群 ID 和区域。
知道 EKS URL 的标准格式是
https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com
未找到任何解释“两个字符”和“数字”标准的文档。但通过自己的测试,我发现以下常见组合:
无论如何,由于只有3个字符,我们可以使用下面的脚本来生成列表。
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
绕过 CloudTrail
如果攻击者获得了拥有对 EKS 的权限的 AWS 凭据。如果攻击者配置自己的 kubeconfig
(而不调用 update-kubeconfig
)如前所述,get-token
不会在 CloudTrail 中生成日志,因为它不与 AWS API 交互(它只是在本地创建令牌)。
因此,当攻击者与 EKS 集群通信时,CloudTrail 不会记录任何与被盗用户访问有关的内容。
请注意,EKS 集群可能已启用日志记录,将记录此访问(尽管默认情况下已禁用)。
EKS 勒索?
默认情况下,创建集群的用户或角色始终具有对集群的管理员特权。这是 AWS 对 Kubernetes 集群唯一的“安全”访问。
因此,如果攻击者使用 fargate 窃取了集群并删除了所有其他管理员并删除了创建集群的 AWS 用户/角色,则攻击者可能已经勒索了集群。
请注意,如果集群使用 EC2 VM,可能可以从节点获取管理员特权并恢复集群。
实际上,如果集群使用 Fargate,您可以从 EC2 节点获取管理员特权或将所有内容移动到 EC2 到集群中,并通过访问节点中的令牌来恢复它。