우선, 주어진 문제 파일을 통해 이미지 빌드를 위한 dockerfile을 다운로드하여서 Desktop/ex-docker에 저장하자.
그러고 나서, 문제에서 주어진 도커 이미지를 pull 명령어를 통해 다운해 보자.
docker pull dreamhackofficial/blue-whale:1
user@user:~$ cd Desktop/ex-docker
user@user:~/Desktop/ex-docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hustoj latest 2488c09c943e 2 months ago 1.48GB
ubuntu 22.04 9d28ccdc1fc7 24 months ago 76.3MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
user@user:~/Desktop/ex-docker$ docker pull dreamhackofficial/blue-whale:1
1: Pulling from dreamhackofficial/blue-whale
6e3729cf69e0: Already exists
27795aba362d: Already exists
382b42bad09d: Already exists
957e6ff40500: Already exists
72d2dc9f485f: Already exists
cfff9de3e1e7: Already exists
a3ed95caeb02: Already exists
fb90d72728f2: Already exists
e0c144699be7: Already exists
Digest: sha256:6bcfd56d243ab37ede113aa8a6243eb3f274ae8971ff1eefc67796329c252fee
Status: Downloaded newer image for dreamhackofficial/blue-whale:1
docker.io/dreamhackofficial/blue-whale:1
user@user:~/Desktop/ex-docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hustoj latest 2488c09c943e 2 months ago 1.48GB
dreamhackofficial/blue-whale 1 87a96c7a8db0 6 months ago 152MB
ubuntu 22.04 9d28ccdc1fc7 24 months ago 76.3MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
그러면, dreamhackofficial/blue-whale 레포지토리의 docker image가 생성이 된다는 사실을 docker images 명령어를 통해 확인할 수 있다.
이제, 문제 파일의 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
위의 내용을 보면, deploy 디렉터리 안에 있는 flag 파일을 /home/chall/flag에 복사를 하고, touch 명령어를 통해./flag파일을 열어서 읽고 출력이 된 것을 파이썬 명령어로 실행하므로 flag 파일 내용(플래그)을 이름으로 갖는 파일이 생성된다는 사실을 알 수 있다.
하지만, 그다음의 명령어를 보면 현재 디렉터리인 home/chall 에 존재하는 모든 파일을 삭제하는 명령어인 RUN rm * 를 볼 수 있고, 문제에서 구하고자 하는 플래그를 찾기 위해서는 삭제가 되기 이전에 대한 정보를 얻어야 한다는 사실을 알 수 있다.
문제에서 힌트를 보면 docker 이미지를 분석하는 도구인 dive에 대한 설명이 있는데, dive를 우선 설치해 보자.
이제, dive [이미지 ID] 명령어를 실행해 보자.
user@user:~/Desktop/ex-docker$ dive 87a96c7a8db0
Image Source: docker://87a96c7a8db0
Fetching image... (this can take a while for large images)
Analyzing image...
Building cache...
그러면, 아래와 같은 화면이 출력된다.
이를 통해 도커 이미지를 분석할 수 있으며, 좌측 상단의 Layers 탭에서는 dockerfile에 명시된 명령어 한 줄씩 내려가며 각 layer를 분석할 수 있고, 우측 상단의 Current Layer Contents 탭에서는 해당하는 Layer의 콘텐츠(파일 목록)가 출력된다.
이를 통해 flag 파일이 삭제가 되기 이전의 Layer까지만 도커 이미지에 대한 정보를 확인해 보자.
/home/chall 에서 플래그를 얻었다.
하지만, 위의 화면은 숫자가 잘려있어서, font size를 줄여서 확인해 보면 찾고자 하는 플래그는 다음과 같다.
DH{b06cb27a502a831822f927562258c6f69b5996a9916206cdb8755cc90ebf3b9f}
'해킹 > Dreamhack WarGame' 카테고리의 다른 글
[Dreamhack] xss-1 문제 풀이 (0) | 2024.01.06 |
---|---|
[Dreamhack] Cookie 문제 풀이 (2) | 2024.01.04 |
[Dreamhack] phpreg 문제 풀이 (1) | 2023.11.28 |
[Dreamhack] ex-reg-ex 문제 풀이 (1) | 2023.11.28 |
[Dreamhack] Exercise: SSH 문제 풀이 (0) | 2023.11.20 |