Kubernetes 서비스 침투 테스트
Reading time: 7 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을 제출하여 해킹 트릭을 공유하세요.
Kubernetes는 인터넷에 노출되었거나 하나의 포드를 침해한 후 내부 네트워크에서 발견할 수 있는 여러 특정 네트워크 서비스를 사용합니다.
OSINT를 통한 노출된 포드 찾기
한 가지 방법은 crt.sh에서 Identity LIKE "k8s.%.com"
을 검색하여 Kubernetes와 관련된 서브도메인을 찾는 것입니다. 또 다른 방법은 GitHub에서 "k8s.%.com"
을 검색하고 해당 문자열을 포함하는 YAML 파일을 찾는 것입니다.
Kubernetes가 서비스를 노출하는 방법
Kubernetes가 서비스를 공개적으로 노출할 수 있는 방법을 이해하는 것이 유용할 수 있습니다:
Exposing Services in Kubernetes
포트 스캐닝을 통한 노출된 포드 찾기
다음 포트는 Kubernetes 클러스터에서 열려 있을 수 있습니다:
포트 | 프로세스 | 설명 |
---|---|---|
443/TCP | kube-apiserver | Kubernetes API 포트 |
2379/TCP | etcd | |
6666/TCP | etcd | etcd |
4194/TCP | cAdvisor | 컨테이너 메트릭 |
6443/TCP | kube-apiserver | Kubernetes API 포트 |
8443/TCP | kube-apiserver | Minikube API 포트 |
8080/TCP | kube-apiserver | 안전하지 않은 API 포트 |
10250/TCP | kubelet | 전체 모드 접근을 허용하는 HTTPS API |
10255/TCP | kubelet | 인증되지 않은 읽기 전용 HTTP 포트: 포드, 실행 중인 포드 및 노드 상태 |
10256/TCP | kube-proxy | Kube Proxy 헬스 체크 서버 |
9099/TCP | calico-felix | Calico의 헬스 체크 서버 |
6782-4/TCP | weave | 메트릭 및 엔드포인트 |
30000-32767/TCP | NodePort | 서비스에 대한 프록시 |
44134/TCP | Tiller | Helm 서비스 리스닝 |
Nmap
nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16
Kube-apiserver
이것은 관리자가 일반적으로 kubectl
도구를 사용하여 통신하는 API Kubernetes 서비스입니다.
일반 포트: 6443 및 443, 하지만 minikube에서는 8443, 비보안으로는 8080도 사용됩니다.
curl -k https://<IP Address>:(8|6)443/swaggerapi
curl -k https://<IP Address>:(8|6)443/healthz
curl -k https://<IP Address>:(8|6)443/api/v1
다음 페이지를 확인하여 이 서비스와 대화하여 민감한 데이터를 얻고 민감한 작업을 수행하는 방법을 알아보세요:
Kubelet API
이 서비스는 클러스터의 모든 노드에서 실행됩니다. 이 서비스는 노드 내의 포드를 제어합니다. kube-apiserver와 통신합니다.
이 서비스가 노출된 경우 인증되지 않은 RCE를 발견했을 수 있습니다.
Kubelet API
curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods
응답이 Unauthorized
인 경우 인증이 필요합니다.
노드를 나열할 수 있다면 다음을 사용하여 kubelets 엔드포인트 목록을 가져올 수 있습니다:
kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check also for etcd
done
kubelet (읽기 전용)
curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods
etcd API
curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
Tiller
helm --host tiller-deploy.kube-system:44134 version
이 서비스를 악용하여 Kubernetes 내에서 권한을 상승시킬 수 있습니다:
cAdvisor
메트릭을 수집하는 데 유용한 서비스입니다.
curl -k https://<IP Address>:4194
NodePort
모든 노드에서 NodePort를 통해 포트가 노출되면, 동일한 포트가 모든 노드에서 열리며 선언된 Service로 트래픽을 프록시합니다. 기본적으로 이 포트는 30000-32767 범위에 있습니다. 따라서 새로운 확인되지 않은 서비스는 이러한 포트를 통해 접근할 수 있습니다.
sudo nmap -sS -p 30000-32767 <IP>
취약한 잘못된 구성
Kube-apiserver 익명 접근
익명 접근은 kube-apiserver API 엔드포인트에 허용되지 않습니다. 그러나 일부 엔드포인트를 확인할 수 있습니다:
ETCD 익명 접근 확인
ETCD는 클러스터 비밀, 구성 파일 및 기타 민감한 데이터를 저장합니다. 기본적으로 ETCD는 익명으로 접근할 수 없지만, 항상 확인하는 것이 좋습니다.
ETCD에 익명으로 접근할 수 있다면, etcdctl 도구를 사용해야 할 수도 있습니다. 다음 명령어는 저장된 모든 키를 가져옵니다:
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
Kubelet RCE
Kubelet 문서에 따르면 기본적으로 익명 액세스가 서비스에 허용됩니다:
Kubelet 서버에 대한 익명 요청을 활성화합니다. 다른 인증 방법에 의해 거부되지 않은 요청은 익명 요청으로 처리됩니다. 익명 요청은 사용자 이름이
system:anonymous
이고 그룹 이름이system:unauthenticated
입니다.
Kubelet API의 인증 및 권한 부여가 어떻게 작동하는지 더 잘 이해하려면 이 페이지를 확인하세요:
Kubelet Authentication & Authorization
Kubelet 서비스 API는 문서화되어 있지 않지만, 소스 코드는 여기에서 찾을 수 있으며 노출된 엔드포인트를 찾는 것은 실행하는 것만큼 쉽습니다:
curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'
Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").
모두 흥미롭게 들립니다.
Kubelets 및 그 엔드포인트와 상호작용하기 위해 Kubeletctl 도구를 사용할 수 있습니다.
/pods
이 엔드포인트는 파드와 그 컨테이너를 나열합니다:
kubeletctl pods
/exec
이 엔드포인트는 어떤 컨테이너 안에서든 코드를 매우 쉽게 실행할 수 있게 해줍니다:
kubeletctl exec [command]
note
이 공격을 피하기 위해 kubelet 서비스는 --anonymous-auth false
로 실행되어야 하며, 서비스는 네트워크 수준에서 분리되어야 합니다.
Kubelet (읽기 전용 포트) 정보 노출 확인
kubelet 읽기 전용 포트가 노출되면, 권한이 없는 당사자가 API에서 정보를 검색할 수 있게 됩니다. 이 포트의 노출은 다양한 클러스터 구성 요소의 공개로 이어질 수 있습니다. 포드 이름, 내부 파일의 위치 및 기타 구성을 포함한 정보는 비판적이지 않을 수 있지만, 그 노출은 여전히 보안 위험을 초래하며 피해야 합니다.
이 취약점이 어떻게 악용될 수 있는지에 대한 예는 원격 공격자가 특정 URL에 접근하는 것입니다. http://<external-IP>:10255/pods
로 이동함으로써 공격자는 kubelet에서 민감한 정보를 검색할 수 있습니다:
References
Kubernetes Pentest Methodology Part 2
Threats & Research Archives - F-Secure Blog
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을 제출하여 해킹 트릭을 공유하세요.