연재 시리즈

EKS 스터디 - 6주차 1편 - 미흡한 kubelet 인증/인가 설정의 위험

악분 2023. 5. 27. 13:08
반응형

2022 OWASP에서 쿠버네티스 TOP10 위험을 공개했습니다. 글은 항목 9번째에 해당하는 kubelet미흡한 설정 위험을 설명하고 예제를 살펴봅니다.

출처: https://owasp.org/www-project-kubernetes-top-ten/

 

이 글은 영상으로도 만나보실 수 있습니다.

https://youtu.be/88c2iXZBm7w

 

kubelet API 인증과 인가

kubelet kube API server 통신하기 위해 10250포트를 오픈합니다. kube API server 오픈된 10250포트를 사용하여 kubelet API 호출합니다. kubelet API kubectl run, exec 등이 있습니다.

 

kubelet API 누구나 호출이 가능하면 악용될 여지가 있습니다. pod 목록 조회, pod안에서 명령어 실행 해거가 좋아하는 명령어가 가득합니다. 그래서 특정 쿠버네티스 버전이상을 설치하면 누구나 호출하지 못하도록, kubelet 인증/인가 설정이 되어 있습니다.

 

대부분 kubelet API는 문서화되어 있지 않습니다. 소스코드는 공개되어 있어서 소스코드로 API를 확인할 수 있을 것 같습니다.

 

kubelet 인증/인가 설정 살펴보기

kubelet 인증/인가 설정은 kubelet설정파일에 있습니다. 특정 쿠버네티스 버전 이상부터 익명사용자는 kubelet API 사용하지 못하도록 인증설정이 되어 있습니다. 그리고 인가는 webhook 사용합니다.

cat /var/lib/kubelet/config.yaml

 

인증/인가 설정이 올바르게 되어 있으면, kubelet API 호출할 마다 401, 403에러가 발생합니다. 아래 예제는 pod목록을 조회하는 API호출 결과입니다. 권한이 없어 401에러가 발생했습니다.

curl -k https://127.0.0.1:10250/pods; echo

 

오래된 쿠버네티스 버전들은 kubelet 인증/인가 설정이 미흡하게 설정되어 있습니다.

cat /var/lib/kubelet/config.yaml

 

인증/인가 설정이 모두 허용이기 때문에 누구나 kubelet API 호출 있습니다.

curl -k  https://127.0.0.1:10250/pods | jq | more

 

kubeletctl

kubeletctl 도구는 kubeletAPI 쉽게 사용하도록 도와주는 도구입니다. kubeletctl github 공개되어 있습니다.

 

설치는 kubeletctl 바이너리를 다운로드 받기만 하면 됩니다.

wget https://github.com/cyberark/kubeletctl/releases/download/v1.9/kubeletctl_linux_amd64 && chmod a+x ./kubeletctl_linux_amd64 && mv ./kubeletctl_linux_amd64 /usr/local/bin/kubeletctl

 

예를 들어 kubelet pod API kubeletctl pods 사용하여 쉽게 호출합니다.

 

무서운 명령어는 scan rce입니다. scan rce pod안에서 명령어를 실행할 있는지 확인합니다.

kubeletctl scan rce

 

kubeletctl exec 또는 run명령어로 취약한 pod내부로 명령어 실행이 가능합니다.

kubeletctl exec "명령어" -n {namespace} -p {pod이름} -c {컨테이너 이름}

 

해킹 시나리오

kubelet 인증/인가설정이 미흡하면 어떤 위험에 노출될 있는지 시나리오를 통해 체험합니다.

 

해커의 목표는 데이터베이스 데이터 탈취입니다. 해커는 이미 192.168.25.0/24 네트워크 대역에 침입을 성공했다고 가정합니다.

 

해커는 첫번째로 하는 행동은 정보 탐색입니다. IP스캔을 하여 192.168.25.0/24대역에 host목록을 했습니다.

 

다음, IP스캔으로 얻은 host 대상으로 포트 정밀스캔을 했습니다. 192.168.25.163 host 10250포트가 열려있는 것을 발견했습니다.

 

해커는 kubeletctl 사용하여 192.168.25.163 kubelet 인증/인가 설정이 미흡하다는 것을 알았습니다.

 

pods API 사용하여 pod목록을 조회하여 유의미한 정보를 확인했습니다. calico CNI 메트릭을 수집하는 프로메테우스, gitops도구인 argocd 사용하는 것을 알았습니다. 특히 눈에 띄는 pod mariadb 데이터베이스입니다.

 

해커는 rce스캔을 하여 mariadb pod 명령어를 실행 가능하다는 것을 확인했습니다.

 

곧바로 해커는 mariadb 쉘을 획득했습니다.

 

mariadb pod 쉘에 진입한 mariadb 인증정보를 찾았습니다. mariadb 컨테이너 인증정보는 환경변수로 노출하기 때문에, 환경변수를 찾으면 인증정보를 쉽게 찾을 있습니다.

 

mariadb 컨테이너는 로컬에서 mariadb 접속하는 mysql client 있습니다. 아래 그림은 환경변수에서 찾은 인증정보를 조합하여, root계정으로 mariadb 콘솔에 접속했습니다. 이제 해커는 mariadb 저장된 데이터를 탈취할 있습니다.

 

마치며

스터디를 통해 쿠버네티스 취약점을 처음으로 공부한 계기가 되었습니다. OWASP가 쿠버네티스 취약점도 관리하는 것에 놀랐습니다. 이 글에서 다룬 미흡한 kubelet 인증/인가 설정은 최신 버전 쿠버네티스에 해당하지 않아, 쿠버네티스도 기본 보안설정을 매우 신경쓰고 있다는 것을 느꼈습니다.

 

이 글에서 생각한 시나리오는 데이터 탈취에 집중했습니다. 악성코드 실행, 리버스 쉘 등을 통해 2차 공격으로 이어질 수 있습니다.

 

kubelet 미흡한 설정 위험은 쿠버네티스에 어떤 pod를 실행했는지 정보노출입니다. 해커가 가장 많이 시간을 투자하는 부분이 탐색인데, 해커가 쿠버네티스를 잘 안다면 kubelet API로 쉽게 시스템을 정보를 파악합니다.

 

참고자료

반응형