AWS - EKS Post Exploitation

htARTE(HackTricks AWS Red Team Expert) を通じて、ゼロからヒーローまでAWSハッキングを学びましょう

HackTricks をサポートする他の方法:

EKS

詳細については、以下をチェックしてください

pageAWS - 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エンドポイント(ポッドからJWTトークンを取得した場合はこちらを参照)とクラスタの名前が必要です。

私の場合、CloudWatchログに情報が見つからなかったが、LaunchTemplatesのuserDataEC2インスタンスの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 config

```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クラスターの作成者は常に**system:masters(k8s admin)グループのkubernetesクラスター部分にアクセスできます。この時点では、クラスターを作成したユーザーを特定する直接の方法はありません(CloudTrailをチェックできます)。そして、その特権を削除する方法**もありません。

AWS IAMユーザーまたはロールにK8sへのアクセス権限を付与する方法は、aws-authというconfigmapを使用することです。

したがって、aws-authのconfig mapに書き込みアクセス権限がある人は、クラスター全体を侵害できます。

IAMロールやユーザーに追加の権限を付与する方法や、これを悪用して特権昇格をチェックするこのページについての詳細情報をご覧ください。

また、この素晴らしい 投稿でIAM -> Kubernetes認証の仕組みを学んでください。

KubernetesからAWSへ

KubernetesサービスアカウントにOpenID認証を許可することで、彼らがAWSでロールを仮定することが可能です。このページでの動作方法を学んでください。

JWTトークンからApi Serverエンドポイントを取得

https://<cluster-id>.<two-random-chars><number>.<region>.eks.amazonaws.com
見つけられなかったが、自分でテストを行った結果、次のようなものが繰り返し出てきました:
- gr7
- yl4

とにかく、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のバイパス

攻撃者がAWSの資格情報を入手し、EKSに対する権限を持っている場合。攻撃者が以前に説明したように自分自身の**kubeconfigを構成し(update-kubeconfigを呼び出さずに)、get-token**はCloudTrailにログを生成しません。なぜなら、AWS APIとはやり取りせずに(単にトークンをローカルで作成するだけ)。

したがって、攻撃者がEKSクラスタと通信するとき、cloudtrailはユーザーが盗まれ、アクセスされたことに関連するログを記録しません

EKSクラスタには有効なログが可能性があるが、デフォルトでは無効になっていることに注意してください。

EKSの身代金?

デフォルトでは、クラスタを作成したユーザーまたはロールは、クラスタに対して常に管理者権限を持っています。そしてそれがKubernetesクラスタに対してAWSが持つ唯一の「安全な」アクセスです。

したがって、攻撃者がFargateを使用してクラスタを侵害し、他のすべての管理者を削除し、かつクラスタを作成したAWSユーザー/ロールを削除した場合、攻撃者はクラスタを身代金に要求できる可能性があります

クラスタがEC2 VMを使用している場合、ノードから管理者権限を取得し、クラスタを回復することができる可能性があります。

実際、クラスタがFargateを使用している場合、EC2ノードにアクセスしてノード内のトークンにアクセスすることで、EC2ノードにすべてを移動させるか、EC2にすべてを移動させてクラスタを回復することができます。

htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

最終更新