2019 Christmas CTF Platform

tl;dr

1. 재작년 초에 만들어서 얼마 전 Christmas CTF까지 수정해서 잘 사용했던 CTF 플랫폼 공개
2. 소스는 https://github.com/munsiwoo/christmas-ctf-platform
3. 이 글에서는 다이나믹 랭킹 구현 이슈 정리

다이나믹 랭킹 구현 이슈

Christmas CTF 운영 당시 랭킹 페이지에서 이슈가 하나 있었는데
지금은 랭킹을 한번의 Query로 가져오고 있지만 이전 구현 방식은 임시 테이블을 하나 생성하고
PHP로 팀당 점수를 계산한 뒤, 일일이 다 INSERT 해주고 보여주는 방식이었다.
그렇기에 오버헤드가 엄청 컸고 거기에 디도스까지 들어와 엎친데 덮친 상황 발생

당시 초당 들어오는 패킷도 어마어마 했지만, 랭킹 구현 방식도 서버 터지는데 한몫한 거 같다.
들어오는 패킷 패턴 분석해서 fail2ban, iptables로 다 차단 박고 랭킹 페이지를 로그인해야 볼 수 있는 방식으로
바꾸고 나서야 서버가 터지는 걸 방지할 수 있었다는..

지금은 구현 방식을 아예 바꿨다. → /src/classes/Render.class.php#L92

SELECT u.teamname teamname, ifnull(sum(p.point), 0) point, ifnull(max(s.auth_date), min(u.reg_date)) last_auth FROM mun_users u LEFT OUTER JOIN mun_solves s ON BINARY u.username=s.username LEFT OUTER JOIN mun_probs p ON s.prob_no=p.no WHERE BINARY u.username!='{$admin_username}' GROUP BY BINARY u.teamname ORDER BY point DESC, last_auth

앞으로의 방향

- 취약점 나오면 패치
* 취약점 찾고 알려주시는 분께 감사의 표시로 소정의 선물을 드립니다.

- 최적화

- 기능 구현
1. 문제 업로드에서 파일 첨부 기능 추가
2. 지정해놓은 문제만 원하는 시간에 자동으로 오픈되는 기능 추가
3. URL 라우터 직접 만들어서 적용

후기

처음부터 끝까지 혼자 완성해낸 나 자신이 기특하다.

Timeline

2020.01.16 : 오픈 소스로 공개
2020.01.20 : docker-compose 추가