AWS - EKS ポストエクスプロイテーション
Reading time: 10 minutes
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
EKS
詳細については、以下を確認してください
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>
で トークンを取得できる が、クラスター情報を取得する権限(describeCluster)がない場合、あなた自身の ~/.kube/config
を 準備する ことができます。しかし、トークンを持っていても、接続するための url エンドポイント が必要です(ポッドからJWTトークンを取得できた場合は こちら を読んでください)と クラスターの名前 が必要です。
私の場合、CloudWatchログでは情報を見つけられませんでしたが、LaunchTemplatesのuserData と EC2マシンの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
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クラスターの作成者は、グループ**system:masters
(k8s管理者)のkubernetesクラスター部分に常にアクセスできることになります。この文書作成時点では、クラスターを作成した人を見つける直接的な方法はありません**(CloudTrailを確認できます)。また、その特権を削除する方法もありません。
AWS IAMユーザーやロールにK8sへのアクセスを付与する方法は、configmap **aws-auth
**を使用することです。
warning
したがって、config map aws-auth
に書き込みアクセスを持つ人は、クラスター全体を危険にさらすことができます。
同じまたは異なるアカウントで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
ドキュメントで「2文字」と「数字」の基準を説明しているものは見つかりませんでした。しかし、自分でテストを行ったところ、以下のものが繰り返し現れることがわかりました:
- 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
warning
& を置き換えることを忘れないでください。
CloudTrailのバイパス
攻撃者がEKSに対する権限を持つAWSの資格情報を取得した場合、攻撃者が前述のように**update-kubeconfig
を呼び出さずに独自のkubeconfig
を設定すると、get-token
**はCloudTrailにログを生成しません(AWS APIと対話せず、トークンをローカルで作成するだけだからです)。
したがって、攻撃者がEKSクラスターと通信すると、cloudtrailはユーザーが盗まれてアクセスしていることに関連するログを記録しません。
EKSクラスターにはこのアクセスを記録するログが有効になっている可能性があることに注意してください(デフォルトでは無効になっていますが)。
EKSの身代金?
デフォルトでは、クラスターを作成したユーザーまたはロールは常にクラスターに対して管理者権限を持つことになります。そして、それがKubernetesクラスターに対するAWSの唯一の「安全な」アクセスです。
したがって、攻撃者がFargateを使用してクラスターを侵害し、他のすべての管理者を削除し、クラスターを作成したAWSユーザー/ロールを削除すると、攻撃者はクラスターを身代金にすることができた**。
tip
クラスターがEC2 VMを使用している場合、ノードから管理者権限を取得し、クラスターを回復することが可能です。
実際、クラスターが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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。