Pentesting Kubernetes Services

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

HackTricks를 지원하는 다른 방법:

쿠버네티스는 여러 특정 네트워크 서비스를 사용하며, 이 서비스들은 인터넷에 노출되어 있거나 한 개의 파드를 침투한 후 내부 네트워크에서 찾을 수 있습니다.

OSINT를 사용하여 노출된 파드 찾기

한 가지 방법은 crt.sh에서 Identity LIKE "k8s.%.com"을 검색하여 쿠버네티스와 관련된 서브도메인을 찾는 것입니다. 다른 방법은 github에서 "k8s.%.com"을 검색하고 해당 문자열을 포함하는 YAML 파일을 찾는 것일 수 있습니다.

쿠버네티스가 서비스를 노출하는 방법

쿠버네티스가 서비스를 공개적으로 노출하는 방법을 이해하는 것이 유용할 수 있습니다:

pageExposing Services in Kubernetes

포트 스캐닝을 통해 노출된 파드 찾기

다음 포트는 쿠버네티스 클러스터에서 열릴 수 있습니다:

포트프로세스설명

443/TCP

kube-apiserver

쿠버네티스 API 포트

2379/TCP

etcd

6666/TCP

etcd

etcd

4194/TCP

cAdvisor

컨테이너 메트릭스

6443/TCP

kube-apiserver

쿠버네티스 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

다음 페이지를 확인하여 민감한 데이터를 얻고 이 서비스와 대화하여 민감한 작업을 수행하는 방법을 알아보세요:

pageKubernetes Enumeration

Kubelet API

이 서비스는 클러스터의 각 노드에서 실행됩니다. 이 서비스는 노드 내부의 파드를 제어합니다. 이는 kube-apiserver와 통신합니다.

이 서비스가 노출되어 있다면, 인증되지 않은 RCE를 발견했을 수 있습니다.

Kubelet API

curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods

만약 응답이 Unauthorized이면 인증이 필요합니다.

노드 목록을 나열할 수 있다면 다음과 같이 kubelet 엔드포인트 목록을 얻을 수 있습니다:

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

틸러

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인 요청입니다.

Kuebelet API의 인증 및 권한 부여 방식을 더 잘 이해하려면 이 페이지를 확인하세요:

pageKubelet 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/").

모두 흥미로워 보입니다.

Kubeletctl 도구를 사용하여 Kubelet 및 그 엔드포인트와 상호 작용할 수 있습니다.

/pods

이 엔드포인트는 포드와 그 컨테이너 목록을 표시합니다:

kubeletctl pods

/exec

이 엔드포인트를 사용하면 어떤 컨테이너 내에서 코드를 매우 쉽게 실행할 수 있습니다:

kubeletctl exec [command]

이 공격을 피하려면 kubelet 서비스를 --anonymous-auth false로 실행하고 서비스를 네트워크 수준에서 격리해야 합니다.

Kubelet (읽기 전용 포트) 정보 노출 확인

kubelet 읽기 전용 포트가 노출되면, 미인가된 당사자가 API에서 정보를 검색할 수 있게 됩니다. 이 포트의 노출은 다양한 클러스터 구성 요소가 노출될 수 있음을 의미합니다. 정보는 팟 이름, 내부 파일 위치 및 기타 구성 요소를 포함할 수 있지만, 이러한 정보가 중요하지 않더라도 노출은 보안 위험을 초래하므로 피해야 합니다.

이 취약점이 어떻게 악용될 수 있는지 예시는 원격 공격자가 특정 URL에 액세스하는 것을 포함합니다. http://<external-IP>:10255/pods로 이동하여 공격자는 kubelet에서 민감한 정보를 검색할 수 있습니다:

참고 자료

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

HackTricks를 지원하는 다른 방법:

最終更新