AWS - EKS Post Exploitation

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

EKS

더 많은 정보는 확인하세요

pageAWS - 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 클러스터의 생성자는 항상 그룹의 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 서버 엔드포인트 가져오기

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 Ransom?

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

따라서, 공격자가 fargate를 사용하여 클러스터를 침투하고 다른 모든 관리자를 제거하고 클러스터를 생성한 AWS 사용자/역할을 삭제하면, 공격자는 클러스터를 몸값을 요구할 수 있을 수도 있습니다r.

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

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

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법:

最終更新