Introduction

최근 홈서버 VPS 이사를 하면서 내 CTF 사이트 관련 컨테이너들을 이사했다. 근데 VPS이다 보니 홈서버에 비해 서버 성능이 만족스럽지 않아서 아낄 수 있는 자원은 최대한 아껴야했다.
근데 문제는 많은데 전부 ubuntu 이미지를 쓰다보니 너무 헤비했다. 해결책을 생각하다가 이전에 참여했던 해외 CTF에 참여했을때 봤던 경량화 Dockerfile이 생각나서 해당 파일을 참고해서 구축을 진행했다.

Dockerfile

FROM pwn.red/jail
COPY --from=ubuntu:23.10 / /srv
 
COPY ./flag /srv/flag
COPY ./einstein /srv/app/run

위 파일은 pwnme CTF에서 제공해준 einstein 문제 파일 안에 있던 Dockerfile이다.

pwn.red

FROM pwn.red/jail 이 부분을 처음 봐서 관련 자료를 좀 찾아봤다.

image

찾아보니 pwn.red/jail은 CTF 문제를 자동으로 안전하게 실행해주는 도커 이미지라고 한다.

해당 이미지로 만들어진 컨테이너가 실행되면 아래처럼 작동한다.

  • /srv/app/run 파일을 자동으로 실행
  • seccomp, user namespace, read-only filesystem, unshare, mount jail 같은 보안 격리 기능 활성화
  • 기본 5000번 포트로 리스닝

그냥 간단하게 유저가 쉘을 획득해도 플래그 읽기 빼고 아무것도 못하게 안전한 환경을 알아서 구축해둔 이미지라고 보면 될 것 같다.

Custom Dockerfile

# docker-compose.yml
services:
  prob:
    build: .
    ports:
      - "10002:10002"
    container_name: baby_bof
    privileged: true
    environment:
      - JAIL_PORT=10002
# Dockerfile
FROM pwn.red/jail
COPY --from=ubuntu:22.04 / /srv
 
COPY ./flag /srv/app/flag
COPY ./prob /srv/app/run

위 파일은 내가 사용하는 파일들이다.
- JAIL_PORT=10002은 기본 리스닝 포트를 컨트롤 할 수 있는 환경변수다.

Conclusion

원래 홈서버에서는 자원 걱정없이 맘대로 막 사용했었는데, 서버로 옮기자마자 자원을 아껴야하는 상황이 되어서 대책을 강구해냈다.
해놓으니까 생각보다 편할지도..?