본문 바로가기
정보보안/Dreamhack

[Dreamhack Wargame] Beginner - blue whale

by 용오동 2024. 11. 29.
반응형

☆ Beginner - blue whale ☆


[1] 문제

♣ blue-whale 문제는 Dreamhack CTF Season 3 Round #4 (Div2)에 출제된 문제이다.

♣ 위 문제는 Dockerfile을 dive라는 도구를 활용하여 이미지를 분석하고 플래그를 획득하는 문제이다.

드림핵 워게임 - blue-whale / 출처 : Dreamhack


[2] 풀이

♣ 제공되는 문제 파일인 Dockerfile을 다운로드하여 리눅스(Ubuntu22.04)에 옮겨준다.

드림핵 워게임 - blue-whale / 출처 : Dreamhack

 

♣ cat 명령을 통해 Dockerfile의 내용을 확인한다.

 

FROM ubuntu:22.04@sha256:27cb6e6ccef575a4698b66f5de06c7ecd61589132d5a91d098f7f3f9285415a9

ENV user chall
ENV chall_port 31337

RUN apt-get update
RUN apt-get install -y python3

RUN adduser $user

COPY ./deploy/flag /home/$user/flag

RUN chown -R root:$user /home/$user

WORKDIR /home/chall
RUN touch `python3 -c "print(open('./flag', 'r').read())"`
RUN rm *

WORKDIR /home
USER $user
EXPOSE $chall_port

 

* Dockrfile 설명

 # FROM ubuntu:22.04@sha256:~

  • 생성할 이미지의 기반이 되는 베이스 이미지(Ubuntu 22.04)를 특정 SHA256 해시값으로 고정하여 사용한다.
  • 해시를 통해 해당 이미지를 명확하게 지정함으로써, 다른 태그로 인해 이미지가 변경되지 않도록 보장한다.

# ENV user chall

# ENV chall_port 31337

  • ENV 명령은 환경 변수를 설정하는 명령이다.
  • user 변수 : 사용자 이름을 chall로 설정한다.
  • chall_port 변수 : 서비스가 노출할 포트를 31337로 설정한다.

# RUN apt-get update

# RUN apt-get install -y python3

  • RUN 명령은 이미지를 빌드할 때 실행할 명령어를 작성한다.
  • apt-get update : 패키지 목록을 업데이트한다.
  • apt-get install -y pytnon3 : Python3을 설치한다.

# RUN adduser $user

  • chall이라는 새 사용자를 생성한다. 사용자명은 미리 지정한 환경변수 ENV user에서 참조된다.

# COPY ./deploy/flag /home/$user/flag

  • 로컬 디렉터리 ./deploy 디렉터리의 flag 파일을 /home/chall/flag에 복사한다.

# RUN chown -R root:$user /home/$user

  • /home/chall 디렉터리 및 그 하위 파일의 소유권을 소유자는 root로 그룹은 chall로 변경한다.

# WORKDIR /home/chall

  • 현재 작업 디렉터리를 /home/chall로 설정한다.(리눅스의 cd 명령과 유사하다.)

# RUN touch `python3 -c "print(open('./flag', 'r').read())"`

  • flag 파일의 내용을 읽어 touch 명령어로 파일을 생성한다.
  • 이 명령어는 flag 파일 내용을 파일 이름으로 사용해 새 파일을 생성한다.

# RUN rm *

  • 현재 디렉터리 내의 모든 파일을 삭제한다.

# WORKDIR /home

  • 작업 디렉터리를 /home으로 이동한다.

# USER $user

  • 명령을 수행할 사용자를 chall로 변경한다.

# EXPOSE $chall_port

  • 컨테이너에서 포트 31337을 외부로 노출시킨다.

 

※ 'RUN rm *' 명령으로 인해 /home/chall에 존재하는 모든 파일이 삭제된다. 즉, 해당 도커 파일을 빌드하게 되면 플래그 파일이 삭제되어 플래그 값을 확인할 수 없게 된다.

 

♣ 문제의 Hint로 주어진 링크로 들어간다.

Docker 이미지를 분석할 수 있는 도구인 dive가 힌트로 주어졌다. 

https://github.com/wagoodman/dive

 

  dive를 설치한다.

snap install dive

 

# Dive

  • Dive는 Docker 이미지를 계층(Layer)별로 탐색하여 작업을 수행할 수 있는 CLI 도구이다.
  • 수행할 수 있는 작업

         1. 이미지 분석 : Docker 이미지의 각 레이어에서 변경된 파일과 디렉터리를 확인

         2. 효율성 점수 제공 : 이미지의 크기를 최적화하고 중복된 데이터를 식별

        3. 컨테이너 파일 시스템 탐색 : 이미지 내부 파일의 구조를 시각화

        4. 사용량 분석 : 불필요하게 큰 레이어나 불필요한 파일을 쉽게 식별

 

♣ Docker Hub에 저장되어있는 dreamhackofficial/blue-whale:1 도커 이미지를 다운받는다.

docker pull dreamhackofficial/blue-whale:1

 

♣ docker images 명령으로 이미지 ID를 알아낸 후 아래와 같은 명령으로 dive를 실행한다.

dive 87a96c7a8db0
더보기

[dive 실행 에러 발생 시 해결 방법]

 

명령 : dive 87a96c7a8db0

결과 :

Image Source: docker://87a96c7a8db0
Fetching image... (this can take a while for large images)
Handler not available locally. Trying to pull '87a96c7a8db0'...
cannot fetch image
cannot find docker client executable

# 1
systemctl status docker
Active: active (running) since Thu 2024-11-28 23:57:12 KST; 4min 16s ago
(docker 데몬이 꺼져있을 때 : systemctl start docker)
-----------------------------
# 2
which docker
/usr/bin/docker
(경로가 없거나 잘못된 경우 : export PATH=$PATH:/usr/bin)
-----------------------------
# 3
ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 11월 28 23:31 /var/run/docker.sock
(root:docker이면 정상)
-----------------------------
# 4
groups $USER
(파일의 소유자가 Docker 그룹에 속하지 않은 경우 : usermod -aG docker $USER)
systemctl restart docker
apt-get update
apt-get install --only-upgrade docker-ce
(로그아웃 후 재접속)
-----------------------------
# 5(1-4를 해도 실행되지 않는 경우)
# dive 명령을 실행할 때마다 Docker 컨테이너 내에서 dive 도구를 실행할 수 있도록 설정하는 명령을 사용)
alias dive="docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive"
dive [이미지ID]

 

♣ 종전에 다운받아 확인한 Dockerfile의 'RUN rm *' 이전 레이어를 확인한다.

♣ /home/chall에 있는 flag 파일을 확인하면 플래그 값을 찾을 수 있다.

  • Layers : Dockerfile에 작성되어있는 명령어를 한 줄씩 분석할 수 있는 탭이다.
  • Current Layer Contents : 선택한 명령어(Layer)의 파일 목록이 출력되는 탭이다.

DH{b06cb27a502a831822f927562258c6f69b5996a9916206cdb8755cc90ebf3b9f}

 

♣ 제출 결과


 

반응형