취약점분석 (Blue Team)/Cloud

[k8s-goat] 8. NodePort exposed services

poiri3r 2026. 6. 25. 21:40

이번에는 8번째 NodePort exposed service입니다

K8s 클러스터에서 사용자가 어떤 서비스를 NodePort 방식으로 노출한 경우엔, 실행 중인 노드에서 방화벽과 같은 네트워크 보안 설정이 제대로 되어있지 않다면, 외부에서 인증 없이 서비스에 접근할 수 있을 수 있다는 뜻입니다.

k8s 노드에서 열려있는 포트를 확인하고, 인증되지 않았거나 권한 없이 접근 가능한 서비스가 있는지 확인해야 합니다.

K8s가 nodePort 서비스를 생성하면, 클러스터 설정에 정의된 30000~32767번 중 하나를 할당합니다.

 

NodePortㄱ ㅏ뭔지 먼저 보겠습니다.

https://kubernetes.io/ko/docs/concepts/services-networking/service/

 

서비스

외부와 접하는 단일 엔드포인트 뒤에 있는 클러스터에서 실행되는 애플리케이션을 노출시키며, 이는 워크로드가 여러 백엔드로 나뉘어 있는 경우에도 가능하다.

kubernetes.io

Pod에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 방법이라고 합니다.

https://s200928.tistory.com/6

 

[k8s] Kubernetes에서 서비스에 외부 접근 제공하기: NodePort, LoadBalancer, Ingress

Kubernetes 클러스터는 보안을 위해 외부 네트워크와 격리되어 있습니다. 클러스터 내부 서비스에 외부에서 직접 접근하는 것은 기본적으로 허용되지 않습니다. 그럼에도 불구하고 현실적인 서비

s200928.tistory.com

 

위에 블로그에도 아주 쉽게 잘 설명해줍니다.

NodePort는 클러스터 노드의 특정 포트로 트래픽을 라우팅하여 외부에서 접근할 수 있도록 합니다.

클러스터의 모든 노드에 동일한 포트번호를 할당하여, 외부에서 포트 번호와 IP주소를 통해 서비스에 접근할 수 있도록 해줍니다.

 

먼저 시나리오에 진입하기 위한 명령어부터 쳐보겠습니다.

kubectl get nodes -o wide

해당 명령어는 쿠버네티스 클러스터의 노드 정보를 자세히 보는 명령어입니다.

일단 내부에서 IP를 172.19.0.2번을 쓰는걸 확인할 수 있습니다.

 

kubectl get svc

위의 명령어는 쿠버네티스 클러스터에 있는 Service 목록을 보는 명령어입니다.

보면 익숙한 녀석이 한명 있습니다

NodePort로 열려있는 서비스가 하나 있는걸 확인 가능합니다.

30003번 포트가 사용중이니, 아까 확인한 IP를 통해

curl http://172.19.0.2:30003

으로 보내줍니다

근데 제 환경에선 계속 타임 아웃이 나고, 찾아보니 저번에오 ㅏ비슷한 이유로 제 환경이 kind 클러스터 위에 올라가 있기 때문입니다.

클러스터와 wsl 사이에 하나 컨테이너가 더 껴있기 때문에 한번 더 포워딩을 해야 합니다.

포트포워딩을 해준 뒤

curl을 진행하면 http://metadata-db에서 확인하라고 나옵니다.

metadata-db는 이전 문제 풀때 봤던건데 

근데 이후에 추가 진척이 없어서 제가 다른 풀이나 이런거를 찾아봤는데 여기까지가 끝이라고 하네요.

열린 포트를 찾고 nc나 curl로 해당 포트번호를 찾기만 하면 된다고 합니다.

 

NodePort가 뭔지, 그리고 원래 목적은 30000-32767 사이 포트 스캐닝을 통해 접근 가능한 포트를 알아내서 접근하는게 의도네요

다만 kind 위에서 동작하기떄문에 wsl에서 바로 접속이 안돼서 난항을 겪었던 것 같습니다.

 

읽어주셔서 감사하고 다음 포스팅에서 뵙겠습니다!