git을 이용한 파일 업로드를 위해서는 기본적인 Git 사용법의 숙지가 필요합니다.

SSH 공개키 등록하기

생성된 문제를 Git으로 접근하려면 먼저 SSH 키를 서버에 등록해야 합니다. SSH 키를 생성한 적이 없다면 다음 링크를 통해 자세히 알아볼 수 있습니다.

SSH 키는 마이 페이지 내 워게임 설정 항목에서 추가하거나 삭제할 수 있으며, 워게임 페이지 상단의 워게임 설정 버튼을 통해 바로 이동할 수 있습니다.

등록을 정상적으로 마쳤다면, 다음 쉘 명령어를 통해 SSH 키가 등록되었는지 확인할 수 있습니다.

$ ssh -T git@git.dreamhack.io
Welcome to DreamHack, @userid!

Repository clone하기

Repository clone하기

문제 생성을 통해 만들어진 서버 Repository를 복사합니다. Repository 복사는 다음 명령어를 통해 수행할 수 있습니다.

git clone git@git.dreamhack.io:[repository-name].git
Cloning into '[repository-name]'...

현재 git init을 통해 직접 생성한 Repository를 워게임 시스템에 복사해 넣는 것은 지원되지 않습니다.

문제 파일 구성하기

하나의 문제에는 다음과 같은 파일과 폴더를 필수적으로 업로드해야 합니다.

Repository Sample Download

  • Specfile
    • 문제에 대한 자세한 설정을 기술한 파일입니다.
    • 아래의 예제 파일을 복사하여 문제에 필요한 형태로 설정을 작성합니다.
  • Description.md
    • 문제에 대한 설명을 작성하는 파일입니다. Markdown 포맷으로 작성합니다.
    • 문제에 대한 정보나 문제를 해결하기 위해 필요한 단서를 기술하는 등의 문제와 관련된 내용을 적을 수 있습니다.
  • public/
    • 문제를 푸는데 필요한 파일들을 포함하는 폴더입니다.
    • 이 폴더의 파일들은 문제에 접근하는 모든 사용자가 자유롭게 다운로드할 수 있습니다.

만약 VM을 필요로 하는 문제라면 추가적으로 다음과 같은 파일을 필수적으로 업로드해야 합니다.

  • Dockerfile
    • Docker 컨테이너를 만들기 위한 설정을 기술한 파일입니다.
    • 자세한 내용은 Dockerfile Reference를 참조해 주세요.
    • Docker version을 명시할때는, FROM ubuntu:22.04 보다는
      FROM ubuntu:22.04@sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
      
      와 같이 sha256 hash 를 함께 명시해주는 것을 권장합니다.
    • sha256 hash는 docker inspect [Image Name] 이후 RepoDigests 값을 사용하면 됩니다.
      e.g) docker inspect ubuntu:22.04
    • libc file은 익스플로잇 과정에서 필요하다면 public/ 에 넣어주는 것을 권장합니다.

Specfile

모든 Specfile에는 [wargame] section이 필수적으로 포함되어야 하고, VM을 필요로 하는 문제라면 [vm] section이 추가적으로 포함되어야 합니다.

[wargame] section

[wargame] section에는 다음과 같은 속성들이 필수적으로 작성되어야 합니다.

  • title
    • 문제를 대표하는 제목입니다.
    • 정해진 서식이 없으며 자유롭게 설정할 수 있습니다.
  • flag
    • 문제를 해결한 뒤 획득 할 수 있는 Flag입니다.
    • 정해진 형식은 없지만 유추하기 어렵게 작성하는 것이 이상적입니다.
  • tags
    • 문제에 해당하는 분야를 태그합니다. 모든 문제는 하나 이상의 태그가 지정되어야 합니다.
    • 다음과 같은 태그들을 사용할 수 있으며, 이외에도 적절한 태그를 사용할 수 있습니다.
      • pwnable
      • reversing
      • web
      • crypto
      • forensics
      • cloud
      • misc

[vm] section

[vm] section에는 다음과 같은 속성들이 필수적으로 작성되어야 합니다.

  • os
    • VM에서 사용하는 운영체제의 종류를 지정합니다.
    • 다음과 같은 운영체제를 사용할 수 있습니다.
      • linux
  • memory
    • VM 인스턴스가 사용하는 최대 메모리 크기를 MB 단위로 지정합니다.
  • disk
    • VM 인스턴스가 사용하는 최대 디스크 크기를 MB 단위로 지정합니다.
  • ports
    • 외부에서 VM으로 접근할 수 있는 포트를 지정합니다.
    • comma(,)로 구분된 [port]/[protocol] 형태의 쌍 목록을 사용하여야 합니다.
      • protocol로는 tcpudp를 사용할 수 있습니다.
  • allow_outgoing
    • VM이 외부 네트워크에 접근할 수 있는지 여부를 지정합니다.
    • true 또는 false 의 값을 사용할 수 있습니다.
  • docker_compose
    • docker-compose를 활용하여 이미지를 빌드합니다.
    • 해당 옵션을 지정하는 경우 Dockerfile 이 아닌 docker-compose.yml 파일을 요구합니다.

필요한 메모리 및 디스크 크기는 실제로 Docker를 사용해 image를 생성하고 container를 실행하는 것으로 필요한 크기를 확인할 수 있습니다.
Image의 크기는 docker image 명령어를, 메모리의 크기는 docker stats 명령어를 통해 확인할 수 있습니다.

필요한 공간의 최소화를 위해 Base image는 slim 혹은 alpine 버전을 사용하는 것을 권장합니다. 빌드하는 시간을 단축시킬 수 있으며, 디스크 크기 문제로 인한 에러를 크게 줄일 수 있습니다.

예제

Docker Version

[wargame]

title = My challenge
flag = flag{my_challenge}
tags = web

[vm]

os = linux
memory = 128
disk = 256
ports = 80/tcp, 443/tcp
allow_outgoing = false
docker_compose = false

Docker Compose Version

[wargame]

title = Compose challenge
flag = flag{compose_challenge}
tags = misc

[vm]
os = linux
memory = 128
disk = 1024
ports = 5000/tcp
allow_outgoing = false
docker_compose = true

Commit, Tag, Push

문제에 필요한 파일들을 모두 준비한 뒤 이 파일들을 서버에 업로드하기 위해서는, 먼저 현재 상태를 commit해야 합니다.

Git의 기초 - 수정하고 저장소에 저장하기
https://git-scm.com/book/ko/v2/Git의-기초-수정하고-저장소에-저장하기

$ git add -A

$ git commit -m "commit message"
[master f2b6efd] commit message
(...)

commit이 만들어진 후, 해당 commit에 tag를 추가해야 합니다. 이 tag가 해당 문제의 버전 구분에 해당합니다.

$ git tag [tag-name]

tag한 결과물을 push하여 서버에 버전을 올릴 수 있습니다.

$ git push origin master --tags
Total 8 (delta 1), reused 0 (delta 0)
(...)
 * [new tag]         [tag-name] -> [tag-name]

문제 테스트, 배포