CTF 대회 준비, 문제 출제하기

글을 시작하며 #

2022년 부터 KCTF 운영까지 1학년으로 동아리 회장을 역임하며 운영진분들께 많은 것들을 배웠습니다. 특히나 아래 있는 내용들도 대부분 운영진 분들께서 만들어주신 내용을 회고하며 작성한 내용입니다. 미리 감사인사 전합니다. 이소울 드림.

문제 출제 #

  1. 문제 상의
    • 분야와 난이도 조절을 상의한다.
  2. 문제 출제
    • 요즘은 워낙 좋은 Material이 많다.
    • 출제 능력이 떨어지면, 다른 ctf를 참고해도 좋다. 물론 배껴오는 것은 지양해야 한다.
  3. 문제 업로드
    • Write-up, Binary, Source가 포함된 문제를 업로드 한다.
    • 이 부분에서 Dockerfile도 생성해준다. (아래 참조)
  4. 문제 Cross Check
    • 이 부분이 가장 중요하다.
    • 적어도 2일 전에는 문제를 완성해서 Cross Check를 해서, 문제 발생 시 문제를 수정해야 한다. 대부분의 문제는 web, crypto, pwnable, reversing, misc 로 구성되고, 추가적으로 mobile, forensic이 있는 경우가 있다.

환경 구성 #

Docker #

문제 작성이 완료되면, Dockerfile과 docker-compose.yml를 작성한다. Maintainer를 docker-compose.yml 파일과 일치 시켜준다.

# --------------- EXAMPLE ---------------
FROM python:3.9

RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/
ENV DISPLAY=:99
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
# --------------- EXAMPLE ---------------
MAINTAINER ezxss

docker-compose.yml 파일에서 중요한 부분은 두가지이다. Maintainer를 맞춰주는것과 Expose 되는 포트를 맞춰주는것이다. 왼쪽 포트다 Expose되는 포트이고, 오른쪽 포트가 Internal Port이다.

version: '3.3'
services:
	ezxss:
		build: ./
		ports:
		- "40083:80"

서버에 SFTP로 업로드를 마치고, 폴더에 들어가서 docker-compose up --build 를 입력한다.

--build 를 추가해주는 이유는 이미 이미지가 빌드 되어있는 경우, 이미지를 그대로 사용하기 때문에 refresh 하기 위해 추가해준다.

Portainer를 설치하지 않은 경우, 아래 Docker 명령어들을 숙지하는 게 좋다.

  1. 현재 실행 중인 컨테이너를 확인하려면 docker ps 명령어를 사용한다.
  2. 현재 실행중인 컨테이너의 로그를 확인하려면 docker logs [container id] 명령어를 사용한다.

    Grafana Alert 설정 #

    Grafana에서 제공하는

대회 시작 직전 #

간단한 체크리스트를 작성해보았다. 운영진 다같이 모여서 초기 장애 대응을 하는것이 중요하다. 혼선이 없기 위해서는 한 명이 컨트롤 타워 역할을 하고 서버관리, 공지사항 등록 등을 지시해야 한다.

대회중 #

대회 중에는, Cross Check에서 미처 발견하지 못한 문제 에러나 flag 오류 등이 발생할수 있다. 이에 대응하기 위해 모든 출제자들이 Discord 방에 들어와서 계속 예의 주시해야한다. 문제에 최소한 1 solve는 나올 때까지 대기해야 한다.

Template #

Notion #

Discord #

채널 템플릿

권한 템플릿

tag: translation