-
CTF 사이트 만드는 방법 / How to make CTF siteCTF/KNOWLEDGE 2021. 2. 12. 17:53
Background 제작 동기
CTF를 하다보면 PS와는 달리 수많은 저지 사이트가 존재하고, 각각에 등록된 문제 수도 적다는 점에 어려움을 겪을 때가 많다. 이는 과거의 문제들을 실제 대회와 같은 환경으로 구성해서 풀어보는 - 흔히 셋 돈다고 표현하는 - 연습 방법을 주로 사용해왔던 나로서는 불편한 일이었다. 그래서 원하는 문제를 등록해서 풀 수 있는 사설 사이트를 만들어보고자 했다.
Tools 도구
GCP 시작하기
위의 링크를 타고 구글 클라우드 플랫폼으로 들어가면 다음과 같은 창을 만날 수 있다.
무료로 시작하기를 누르고 결제 수단과 거주지 등 관련 정보를 입력하면 된다.
가입이 완료되었으니 Compute Engine -> VM 인스턴스 에 들어가자.
1분간 기다리면 위의 만들기 버튼이 활성화 된다.
리전과 영역을 아시아로 변경하고, 부팅 디스크를 Ubuntu로 변경해준 뒤 방화벽을 모두 허용해주었다.
위와 같이 내부, 외부 ip가 생성되었는데 외부 ip는 임시 주소이므로 이를 고정해줘야 한다.
VPC 네트워크 -> 외부 IP 주소 로 진입해 유형에서 임시를 고정으로 변경해주자. 이름을 아무렇게나 정하고 예약을 누르면 다음과 같이 외부 ip가 고정된다.
CTFd 시작하기
VM 인스턴스 -> 연결 에서 브라우저 창에서 열기를 클릭하면 새로운 창이 열린다.
위와 같은 에러가 발생하고 연결이 잘 안된다면 OS 로그인 사용 중지를 따라해보자.
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade curl -fsSL http://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" sudo apt-get update apt-cache policy docker-ce sudo apt install docker-ce git clone https://github.com/CTFd/CTFd.git cd CTFd vi docker-compose.yml
위의 명령어를 순서대로 하나씩 실행하면 다음과 같은 창이 나온다.
i를 눌러 편집 모드로 진입한 뒤 environment에 SECRET_KEY=<아무 값>을 집어넣은 뒤 Esc를 누르고 :wq를 입력해 저장하고 빠져나오자.
sudo apt install docker-compose sudo docker-compose up -d sudo docker-compose start
docker-compose up을 실행한 이후 수 분 정도의 시간을 기다린 뒤, start 명령어를 실행하고 위에서 생성한 외부 ip를 주소창에 입력해 접속하면 된다. 만약 잘 되지 않을 경우 stop을 실행한 이후 다시 start를 입력해보자.
초기 설정을 마치면 다음과 같이 CTF 사이트가 생성된다.
도메인 등록하기
위 사이트에서 원하는 도메인을 1년 단위로 구매할 수 있다.
나는 ctf-archive.com을 18,000원 정도에 등록하였다.
도메인 정보 변경에 들어가면 내가 구매한 도메인을 관리할 수 있다. 도메인 이름을 클릭해 관리 페이지로 들어가 네임서버 설정 버튼을 누르자.
위와 같이 1차부터 4차를 구글 네임서버로 등록해야 한다. 일단은 입력하지 말고 계속 진행해보자.
GCP에서 네트워크 서비스 -> Cloud DNS 에 들어가 영역 만들기를 클릭해주자.
DNS 이름에 위에서 구매한 도메인 이름을 적어넣으면 아래와 같은 상태가 된다.
NS 유형으로 4개의 네임서버가 등록되어 있는데, 이를 아까 띄워둔 네임서버 설정 창에 가서 입력해주자.
레코드 세트 추가를 선택하고 IPv4 주소에 GCP 인스턴스의 외부 ip 주소를 적어넣으면 포워딩 설정을 완료할 수 있다.
이제 ctf-archive.com으로 접속해도 위에서 만든 사이트에 자동으로 연결이 된다.
HTTPS 설정
medium.com/csictf/self-hosting-a-ctf-platform-ctfd-90f3f1611587
해당 문단은 위 링크를 참고해 작성하였고, nginx와 CTFd에 대한 이해가 부족한 상태로 진행하였기 때문에 내용에 오류가 있을 수 있다.
certbot.eff.org/lets-encrypt/ubuntufocal-nginx
certbot을 이용해 사이트에 HTTPS 연결이 사용되게 할 것이다.
sudo apt update sudo apt install nginx vi /etc/nginx/sites-available/ctf-archive.com (본인의 도메인 명으로 대체)
/etc/nginx/sites-available/[도메인명] 이란 파일을 만든 뒤 아래와 같이 작성해준다.
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; limit_conn_zone $binary_remote_addr zone=addr:10m; server { server_name ctf-archive.com; (본인의 도메인 명으로 대체) limit_req zone=mylimit burst=15; limit_conn addr 10; limit_req_status 429; client_max_body_size 8M; location / { proxy_pass http://localhost:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
sudo ln -s /etc/nginx/sites-available/ctf-archive.com /etc/nginx/sites-enabled/ctf-archive.com
위 명령어를 실행해 작성한 파일을 링크해준 뒤 certbot을 이용해 인증서를 발급받을 것이다. 만약 자신의 VM 인스턴스가 ubuntu 20.04가 아니라면 소제목 아래의 certbot 링크에 접속해 발급 방법을 알아보자.
certbot을 실행하기에 앞서 서버를 잠시 멈추고, CTFd 폴더에 있는 docker-compose.yml 파일을 수정해주자.
cd CTFd docker-compose down vi docker-compose.yml
nginx: image: nginx:1.17 restart: always volumes: - ./conf/nginx/http.conf:/etc/nginx/nginx.conf ports: - 80:80 depends_on: - ctfd
이처럼 nginx로 된 부분이 있을텐데, 이 부분을 아예 지워버렸다.
sudo snap install core; sudo snap refresh core sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot sudo certbot --nginx docker-compose up -d --build
그리고 나서 위의 명령어를 실행하면 인증서를 발급받을 수 있고, docker-compose로 서버를 실행시키면 https://ctf-archive.com으로 접속이 됨을 확인할 수 있다.
'CTF > KNOWLEDGE' 카테고리의 다른 글
Memory Mitigation 메모리 보호기법 (0) 2021.01.19 Assembly Language 어셈블리어 (0) 2021.01.14