Docker를 사용한 워게임/CTF 환경 구성
Docker란?
Docker는 LXC라는 Linux 커널의 컨테이너 기능을 쉽게 사용할 수 있도록 만들어진 기술로, Docker를 사용하면 마치 가상머신처럼 독립된 프로세스 공간, 네트워크 등을 가진 시스템에서 애플리케이션을 실행할 수 있습니다. 가상머신보다는 상대적으로 가볍고, 배포와 관리가 간편하다는 장점이 있습니다.
오늘은 CTF/워게임 실습 환경을 Docker로 구성하는 방법을 소개합니다. 직접 작성한 Dockerfile을 기반으로 하며, 사용 중인 운영체제에 Docker와 Docker Compose가 설치되어 있어야 합니다.
Docker/Docker Compose 설치
Docker 설치 방법은 운영체제에 따라 다릅니다. Windows/macOS는 Docker Desktop 프로그램을 공식 홈페이지에서 받아 설치하면 되고, Linux 계열은 커맨드라인을 통해 설치할 수 있습니다. 아래 사이트에서 사용 중인 운영체제에 맞게 설치하시기 바랍니다.
Get Docker | docker docs |
docs.docker.com/get-docker/ |
Docker Desktop을 설치하는 Windows/macOS의 경우 Docker Compose를 별도로 설치할 필요가 없습니다. Linux 계열의 경우 커맨드라인으로 따로 설치해 주어야 하는데, 아래 설치 페이지를 참고하시기 바랍니다.
Install Docker Compose | docker docs |
docs.docker.com/compose/install/ |
설치가 모두 끝난 후 커맨드라인에서 docker version과 docker-compose version을 실행했을 때, 각각 잘 보이면 성공입니다.
PS C:\Users\thegr> docker version
Client: Docker Engine - Community
Cloud integration: 1.0.7
...
PS C:\Users\thegr> docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
실습 환경 구성
제작한 실습 환경은 Ubuntu 18.04 이미지를 기반으로 하여 각종 편집기, 디버거, 분석 도구 등으로 구성되어 있습니다. 먼저 실습 환경을 구성할 경로에서 다음 Github 저장소를 clone합니다.
ctf18 | hack-rabbit |
github.com/hack-rabbit/ctf18 |
git clone https://github.com/hack-rabbit/ctf18
Clone한 경로에는 Dockerfile과 docker-compose.yml 파일이 존재합니다. Clone한 경로로 이동하신 후 docker-compose build 커맨드를 실행합니다. 이 커맨드는 한 번만 실행하면 됩니다.
docker-compose build
커맨드를 최초 실행 시 이미지 빌드에 약 10분~15분 정도가 소요됩니다. 앞서 말씀드린 대로 한 번만 실행하면 되는 커맨드이니 기다림은 한 번이면 충분합니다.
설치가 모두 완료된 경우 다음 커맨드로 컨테이너를 실행할 수 있습니다. root 계정을 사용하며, 홈 경로는 /root/ 입니다. 셸 화면(zsh)이 보이면 정상입니다. (기본적으로 oh-my-zsh이 적용되어 있습니다)
docker-compose run --rm ctf18
Ctrl+D 또는 exit 커맨드로 컨테이너를 종료할 수 있습니다. 참고로 컨테이너 안에서 작성한 파일은 재시작시 모두 삭제되니 이 점에 꼭 유의하시기 바랍니다. 또한 docker-compose run을 통한 컨테이너 실행은 Dockerfile과 docker-compose.yml이 존재하는 경로에서만 가능합니다.
파일 주고받기
실습 환경은 기본적으로 docker-compose run을 실행한 폴더의 내용물을 /root/pwd 경로로 복사하도록 설정되어 있습니다. 아래 사진을 보면 원래 존재하는 Dockerfile과 docker-compose.yml 파일이 /root/pwd 경로에 옮겨진 모습을 확인할 수 있습니다.
별도로 실행 후 파일을 전송하거나, 컨테이너로부터 파일을 옮겨오고 싶다면 docker cp 커맨드를 이용할 수 있습니다. 먼저 컨테이너가 실행 중인 상태에서 docker ps 커맨드로 컨테이너의 ID를 확인합니다. 아래 예제에서 ID는 "d4e..." 로 시작하고 있습니다. (ID는 매번 다릅니다)
PS C:\Users\thegr\temp> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4e86f619a41 ctf18_ctf18 "/bin/zsh" 12 seconds ago Up 11 seconds ctf18_ctf18_run_cbacbc97edf5
이후 다음과 같이 docker cp 커맨드를 사용해 호스트와 컨테이너 쌍방으로 파일을 주고받을 수 있습니다.
- 호스트에서 컨테이너로 파일 전송하기 (예제)
docker cp ./foo.txt d4e86f619a41:/root/foo.txt
- 컨테이너에서 호스트로 파일 전송하기 (예제)
docker cp d4e86f619a41:/root/foo.txt ./foo.txt
설치된 프로그램 목록
실습 환경에는 직접 만들다 보니 이것저것 프로그램과 패키지가 많이 설치되어 있습니다. 제가 작업용으로 사용하던 가상머신과 사실상 같은 환경인데, 혹시 어떤 프로그램들이 설치되었나 궁금하실 분들을 위해 적어 놓습니다.
- 편집기
- Neovim (+각종 테마 및 플러그인)
- C/C++, Python, Javascript 자동완성 탑재 (coc.nvim)
- Neovim (+각종 테마 및 플러그인)
- 컴파일러
- gcc
- 디버거
- gdb (버전 10.1, 소스코드에서 컴파일)
- pwndbg
- gdb (버전 10.1, 소스코드에서 컴파일)
- 분석 도구 및 프레임워크
- radare2, z3-solver
- pwntoos, rp-lin-x64, one_gadget