2022년 OWASP에서 쿠버네티스 TOP10 위험을 공개했습니다. 이 글은 항목 중 9번째에 해당하는 kubelet미흡한 설정 위험을 설명하고 예제를 살펴봅니다.
이 글은 영상으로도 만나보실 수 있습니다.
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로 쉽게 시스템을 정보를 파악합니다.
참고자료
- 쿠버네티스 포트: https://kubernetes.io/ko/docs/reference/ports-and-protocols/
- 2022 OWASP kubernetes top10: https://owasp.org/www-project-kubernetes-top-ten/
- 유투브: https://www.youtube.com/watch?v=Hf5qRgxjPLQ
'연재 시리즈' 카테고리의 다른 글
EKS 스터디 - 7주차 flux 예제 (0) | 2023.06.04 |
---|---|
EKS 스터디 - 6주차 2편 - EKS pod가 IMDS API를 악용하는 시나리오 (2) | 2023.05.28 |
EKS 스터디 - 5주차 2편 - CPA (0) | 2023.05.21 |
EKS 스터디 - 5주차 1편 - VPA (2) | 2023.05.21 |
EKS 스터디 - 4주차 3편 - AMP에 EKS메트릭 저장 (0) | 2023.05.14 |