K8S-Goat Container escape to the host system
매번 공부를 미루던 k8s에 대한 찍먹을 위해 k8s-goat 프로젝트를 통해 찍먹을 진행한다. 해당 goat 프로젝트에서는 k8s 환경에서 발생할 수 있는 misconfigurations, 취약점, 보안 문제를 의도적으로 취약하게 구성되어있으며 이를 통해 공격을 진행하며 학습한다.
4번 시나리오는 k8s 또는 컨테이너 환경에서 일반적으로 잘못된 구성으로 발생할 수 있는 Container Escape와 관련된 시나리오로 주어진 컨테이너 환경에서 호스트 시스템에 대한 엑세스 권한을 얻는데 초점을 둔 시나리오이다.
이번 시나리오를 시작하려면 http://127.0.0.1:1233 에 접근하여 확인할 수 있다.
목표 : 호스트 시스템에 대한 액세스 권한을 획득하고 노드 수준의 kubeconfig을 탈취하여 k8s 노드에 쿼리한다.
시나리오에서 제공하는 URL로 접근하면 아래와같이 GoTTY 터미널이 보인다. 주어진 리눅스 쉘은 root 권한의 컨테이너로 확인된다.
위에서 루트 디렉터리에 host-system
디렉터리가 보이며 확인해보니 호스트 시스템 전체가 마운트된 것처럼 보인다.
호스트 시스템 전체가 마운트되어 컨테이너에서 호스트 시스템의 kubeconfig
를 확인할 수 있다.
capsh --print
명령을 통해 현재 컨테이너의 capability를 조회하니 chroot
를 확인할 수 있다.
chroot를 통해 호스트 시스템에 액세스한다.
1
chroot /host-system bash
✈️ 여기서부터 EKS환경에서 잦은 에러로 minukube를 통해 다시 구축한 로컬 쿠버네티스 환경에서 진행됨
호스트 시스템 전체가 마운트되어있어 chroot
명령을 통해 로컬 시스템 리소스에 액세스가 가능한 것을 확인할 수 있다.
1
docker ps
k8s 노드 설정은 기본 경로를 통해 찾을 수 있다.
1
cat /var/lib/[노드명]/kubeconfig
확인된 kubeconfig
를 사용하여 다른 리소를 탐색할 수 있으며 유틸리티를 사용하거나 다운로드하여 더 많은 기능을 활용할 수도 있다.
- kubeconfig를 통해 k8s 전체 리소스 확인
1
kubectl --kubeconfig /var/lib/[노드명]/kubeconfig get all -n kube-system
- kubeconfig를 통해 k8s 클러스터에서 사용가능한 노드 목록 확인
1
kubectl --kubeconfig /var/lib/[노드명]/kubeconfig get nodes
이번 시나리오에서는 잘못된 마운트 구성으로 인해 발생할 수 있는 Container Escape에 대해서 알아봤다!