AWS - EKS Post Exploitation
Reading time: 6 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 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
EKS
자세한 내용은 확인하세요
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 머신의 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 역할 및 사용자에게 추가 권한을 부여하는 방법과 이를 악용하는 방법에 대한 자세한 정보는 privesc 이 페이지를 확인하세요.
또한 이 멋진 게시물을 확인하여 IAM -> Kubernetes 인증이 어떻게 작동하는지 알아보세요.
Kubernetes에서 AWS로
Kubernetes 서비스 계정에 대한 OpenID 인증을 허용하여 AWS에서 역할을 맡을 수 있도록 하는 것이 가능합니다. 이 페이지에서 이 작업이 어떻게 이루어지는지 알아보세요.
JWT 토큰에서 Api 서버 엔드포인트 가져오기
JWT 토큰을 디코딩하면 클러스터 ID와 지역을 얻을 수 있습니다. EKS URL의 표준 형식이 다음과 같다는 것을 알고 있습니다.
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
warning
& 를 교체하는 것을 잊지 마세요.
CloudTrail 우회
공격자가 EKS에 대한 권한이 있는 AWS의 자격 증명을 얻으면, 공격자가 이전에 설명한 대로 **update-kubeconfig
**를 호출하지 않고 자신의 **kubeconfig
**를 구성하면, **get-token
**은 AWS API와 상호작용하지 않기 때문에 CloudTrail에 로그를 생성하지 않습니다(로컬에서 토큰을 생성할 뿐입니다).
따라서 공격자가 EKS 클러스터와 대화할 때, cloudtrail은 도난당한 사용자와 관련된 어떤 것도 기록하지 않을 것입니다.
EKS 클러스터는 이 접근을 기록할 수 있는 로그가 활성화되어 있을 수 있습니다(기본적으로는 비활성화되어 있습니다).
EKS 랜섬?
기본적으로 클러스터를 생성한 사용자 또는 역할은 항상 클러스터에 대한 관리자 권한을 가집니다. 그리고 AWS가 Kubernetes 클러스터에 대해 가질 수 있는 유일한 "안전한" 접근입니다.
따라서, 공격자가 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 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.