☆ Beginner - blue whale ☆
[1] 문제
♣ blue-whale 문제는 Dreamhack CTF Season 3 Round #4 (Div2)에 출제된 문제이다.
♣ 위 문제는 Dockerfile을 dive라는 도구를 활용하여 이미지를 분석하고 플래그를 획득하는 문제이다.
[2] 풀이
♣ 제공되는 문제 파일인 Dockerfile을 다운로드하여 리눅스(Ubuntu22.04)에 옮겨준다.
♣ 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가 힌트로 주어졌다.
♣ 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}
♣ 제출 결과
'정보보안 > Dreamhack' 카테고리의 다른 글
[Dreamhack Wargame] Beginner - phpreg (0) | 2024.12.04 |
---|---|
[Dreamhack Wargame] Beginner : ex-reg-ex (0) | 2024.12.02 |
[Dreamhack Wargame] Beginner - Exercise : Docker (0) | 2024.11.28 |
[Dreamhack Wargame] Beginnger - Exersice : SSH (0) | 2024.11.26 |
[Dreamhack Wargame] Beginner - Exercise : Welcome-Beginners 문제 풀이 (0) | 2024.11.25 |