AWS - EKS Post Exploitation

HackTricks 지원하기

EKS

더 많은 정보는 다음을 확인하세요

AWS - EKS Enum

AWS 콘솔에서 클러스터 열거

eks:AccessKubernetesApi 권한이 있으면 AWS EKS 콘솔을 통해 Kubernetes 객체를 볼 수 있습니다 (자세히 알아보기).

AWS 쿠버네티스 클러스터에 연결

  • 쉬운 방법:

# 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 클러스터의 생성자는 항상 그룹의 kubernetes 클러스터 부분인 system:masters (k8s admin)에 접근할 수 있습니다. 이 글을 작성하는 시점에서 클러스터를 생성한 사람을 찾는 직접적인 방법은 없습니다 (CloudTrail을 확인할 수 있습니다). 또한 그 권한을 제거할 방법도 없습니다.

AWS IAM 사용자 또는 역할에 대한 K8s 액세스 권한을 부여하는 방법aws-auth configmap을 사용하는 것입니다.

따라서 aws-auth config map에 쓰기 액세스 권한이 있는 사람은 전체 클러스터를 침해할 수 있습니다.

동일한 계정 또는 다른 계정의 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

다음은 '두 문자' 및 '숫자'의 기준을 설명하는 문서를 찾지 못했습니다. 그러나 제가 직접 몇 가지 테스트를 해본 결과 다음과 같은 패턴이 반복되는 것을 확인했습니다:

  • 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

및 ****을(를) 교체하는 것을 잊지 마십시오.

CloudTrail 우회

공격자가 EKS에 대한 권한을 가진 AWS의 자격 증명을 획득한 경우, 공격자가 이전에 설명한대로 update-kubeconfig를 호출하지 않고 자체 kubeconfig를 구성하면 **get-token**은 AWS API와 상호 작용하지 않기 때문에 CloudTrail에 로그를 생성하지 않습니다(로컬에서 토큰을 생성하기만 합니다).

따라서 공격자가 EKS 클러스터와 통신할 때, cloudtrail는 사용자가 탈취되어 액세스하는 것과 관련된 어떤 로그도 기록하지 않을 것입니다.

EKS 클러스터에 로그가 활성화되어 있을 수 있음을 유의하십시오(그러나 기본적으로 비활성화됨).

EKS 랜섬?

기본적으로 클러스터를 생성한 사용자 또는 역할은 항상 클러스터에 대한 관리자 권한을 가지게 됩니다. 그리고 그것이 유일한 "안전한" 액세스 방법입니다.

따라서, 공격자가 fargate를 사용하여 클러스터를 침투하고 다른 모든 관리자를 제거하고 클러스터를 생성한 AWS 사용자/역할을 삭제하면, 공격자는 클러스터를 랜섬할 수 있었을 것입니다.

클러스터가 EC2 VMs를 사용하는 경우, 노드에서 관리자 권한을 얻고 클러스터를 복구할 수 있습니다.

실제로, 클러스터가 Fargate를 사용하는 경우 노드에서 토큰에 액세스하여 EC2 노드로 이동하거나 모든 것을 EC2로 이동하여 클러스터를 복구할 수 있습니다.

HackTricks 지원

Last updated