진단 실습 가정 및 환경
Docker는 Client - Server 구조를 갖기 때문에 Client가 원격으로 REST API를 통해 Docker를 이용할 수 있습니다. 그러나 관리자의 Container에 대한 접근 제한 미비 등 안전하지 않은 설정(Misconfiguration)으로 인해 악의적인 공격자는 REST API를 이용하여 Container ID 뿐 아니라 원격에서 Container 실행 뿐 아니라 종료, 로그 또한 남길 수 있습니다.
원래는 Attacker 환경, Victim 환경을 따로 구성해야하지만, 본 실습에서는 Victim에서 REST API 서비스 포트를 임의로 지정한 후, 공격자가 이를 찾아냈다는 가정 하에 하나의 Victim 가상환경에서 공격자 입장으로 여러 명령을 실행해보도록 하겠습니다.
실습 환경은 다음과 같습니다.
- VMware Workstation 17 pro
- Ubuntu 18.04
Docker 설치
1. Docker 설치를 위한 repository 등록
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
2. 설치 가능한 docker-ce 버전 확인 및 설치
$ sudo apt-get update
$ apt-cache madison docker-ce
# 최신 버전 설치
$ sudo apt-get install docker-ce containerd.io
# 특정 버전 설치
$ sudo apt-get install docker-ce=[VERSION_STRING] coontainerd.io
3. Docker 버전 확인 및 테스트
$ sudo docker version
$ sudo docker run hello-world
4. docker compose standalone 설치 및 실행 퍼미션 설정 & 링크 생성
$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose --version
5. docker compose 실행 퍼미션 설정
Docker REST API 설정
설치 환경에 따라 환경 설정 파일의 위치가 상이하기 때문에 아래 명령어로 Docker 서비스 환경 설정 파일을 찾습니다.
systemctl cat docker
다음은 실습에서 사용할 Docker REST API의 서비스 포트를 지정합니다. 환경 설정 파일(/lib/systemd/system/docker.service)의 아래 내용을 변경 후 저장합니다.
실제로 공격자는 Docker REST API의 서비스 포트를 모르기 때문에 Proxy를 통해 일일이 테스트해나가면서 접속점을 찾는 과정을 수행하게 됩니다. 저희는 임의로 2376 포트 번호를 지정하도록 하겠습니다.
From
To
아래 명령으로 Docker 서비스를 재구동합니다.
설정된 Docker REST API 서비스 포트를 확인합니다.
원래라면 공격자가 외부 환경을 통해 접속을 실행하겠지만, 이번 실습에서는 공격자가 다른 터미널에서 curl 명령을 통해 접근한다고 가정하겠습니다.
python3 -m json.tool 명령은 앞의 curl을 통해 반환된 json 값을 가시화 해줍니다.
curl -s http://127.0.0.1:2376/version | python3 -m json.tool
이제 공격자는 Docker REST API 동작을 확인했습니다.
Docker REST API를 통해 Container 실행
일반 사용자는 docker run 명령으로 alphine을 실행하고, echo hello world 명령을 실행할 수 있습니다.
하지만 공격자는 앞서 찾은 Docker REST API 서비스 포트와 curl 명령을 통해 Image가 alphine이고 hello world를 echo한 docker run 실행할 수 있습니다. 실제로 공격자는 Cmd에 Victim의 /etc/passwd 파일이나 열린 포트들을 확인할 수 있는 명령어를 요청하게 됩니다.
curl -s -H "Content-Type: application/json" -d '{"Image": "alpine", "Cmd": ["echo", "hello world"]}' -X POST http://127.0.0.1:2376/containers/create | python3 -m json.tool
반환값으로 전달되는 Id는 생성한 Container Id로 공격자는 이를 복사에서 저장해놓고 있습니다.
Docker REST API를 통한 Container 시작
공격자는 앞서 찾은 Docker REST API 서비스 포트와 Container ID로 curl 명령어를 구성하여 컨테이너를 시작할 수 있습니다.
curl -s -X POST http://127.0.0.1:2376/containers/ae1a4f0a1943da89b96728dd52f0e9aa5c21d3629d6f2effcb06152e352ba451/start
'보안 > Docker' 카테고리의 다른 글
[Docker] 호스트와 컨테이너의 파일시스템 연결 (0) | 2023.04.29 |
---|---|
[Docker] 개념과 명령어 (0) | 2023.04.29 |