| by munsiwoo | 29 comments

2019 Christmas CTF Platform

tl;dr

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

다이나믹 랭킹 이슈

Christmas CTF 운영 당시 랭킹 페이지에서 이슈 하나가 있었는데
지금은 랭킹을 쿼리 한번으로 가져와 보여주지만 이전 구현 방식은 임시 테이블을 하나 생성하고 PHP로 팀당 점수를 계산한 뒤, 일일이 다 INSERT하고 다시 꺼내와 유저에게 보여주는 방식이었다. 왜 그렇게 구현했었는지 모르겠지만.. 암튼 오버헤드가 엄청 컸고 거기에 DDoS까지 들어와 엎친데 덮친 상황 발생

초당 들어오는 패킷도 어마어마 했는데 랭킹 구현 방식도 서버 터지는데 한몫한 거 같다.
들어오는 패킷 분석해서 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 추가

Leave a Reply