Review of 2020 Defenit CTF

  

defenit_ctf4

Defenit에서 2020년 6월 5일 18시부터, 7일 18시까지 처음으로 CTF를 호스팅 하였습니다.
이번 대회는 사실 처음부터 예정에 있던 것이 아니었습니다.

defenit_ctf5

대회 운영금을 어떻게 구해야 할까 고민해 보았지만, 마땅한 답이 나오지 않았습니다.
사비를 내어 통해 최소한의 사이즈로 진행하려던 것이 처음 계획이었지만,
많은 분들의 후원 덕분에 높은 수준으로 진행될 수 있었습니다. 감사합니다.

Website Development

문제 출제에 앞서서 생각보다 준비해야 할 것들이 많았는데, 가장 신경썼던 것중의 하나는 플랫폼을 제작하는 것이었습니다.
CTFdmellivora 도 분명 훌륭한 플랫폼이지만, 장기적으로 보면 자체적인 플랫폼을 개발하여 운영하는 쪽이 나을 것이라고 판단했습니다.

개발은 제가 프론트엔드, 03sunf 님이 백엔드를 담당하여 작업하였는데
총 작업 기간으로 잡은 것은 두달이었지만
개인적인 사정으로 앞의 한달정도는 거의 하지 못했고
남은 한달의 기간동안 개발을 진행하게 되었습니다.
웹 사이트가 방문자들에게 주는 첫인상에 많은 영향을 끼칠 것이라는 생각에
양산형 CTF에서 느껴질 수 있는 저렴한 느낌을 최대한 배제하기 위해 신경 썼습니다.
결과적으로 레트로 스타일의 테마와, 무려 모바일과 PC 모두를 지원하고, 예쁜 스코어보드를 가진(!) 플랫폼이 완성되었습니다.

defenit_ctf3

Registering Event

아무래도 CTF를 개최하게 되면, 일반적인 팀으로서는 홍보할 곳이 마땅치 않습니다.
때문에 홍보를 CTFTime에 의존할 수 밖에 없는데
CTFTime에 이벤트 등록 시 필수적으로 들어가는 정보는
여기에 CTF명, 디스크립션, 로고, URL 입니다.

해당 정보는 등록된 후에도 수정이 가능한데
등록 신청을 하고 승인되기까지 이틀 정도가 소요되었습니다.

defenit_ctf6

Registering CTF

승인이 되고 나면, 이제는 이번에 개최할 이벤트의 상세 정보를 등록해야 합니다.
여러가지 정보와 더불어 ctftime 엔드포인트를 등록하는 란이 있어서
/api/ctftime 주소에 만들어서 등록했는데, 사실 별로 쓸모는 없었던 것 같습니다.
CTF 등록신청을 하고 승인까지는 다시 이틀 정도가 소요되었습니다.

defenit_ctf4

Weight

CTFTime 에서는 처음으로 진행되는 이벤트의 경우에는, 아무리 고득점을 받아도 Weight는 25점이 최대입니다.
19년도의 Hitcon의 레이팅이 92점이라는 것을 생각해보면, 아직 앞으로 갈 길이 먼것 같습니다.

Making Challenges

문제 출제는 상당히 매끄럽지 못했습니다
참가자 분들에게서 많은 칭찬을 받기도 했지만
사실은 교차 검증도 부족했고, 시간에 쫒겨가며 문제를 만들었습니다.

아무래도 출제자가 많다 보니 관리하는게 극도로 힘들었습니다.
와중에 플랫폼도 만들고 제 문제도 출제하면서
회사일에 주변에 부가적인 업무도 어쩐지 계속 생기는 터라
약간 어지러울 정도였는데, @Jsec이 많이 신경써줘서 이만큼 나왔던 것 같습니다.

분야별 문제 개수 배분도 좋지 못했습니다.
Rev, Pwn 은 괜찮은 수준이었지만
Misc + Osint 문제 수가 일반적인 CTF 와 비교하면 과도한 탓에
노력해 보았지만, 끝내 지적을 받고 말았습니다.

개인적으로도 CTF 플랫폼에 너무 힘을 줬기 때문에, 출제에 별로 힘을 쓰지 못했습니다.
3문제를 실제로 출제한 기간은 2주 정도였고, 덕분에 많은 언인텐 풀이가 있었습니다.

웹 문제는 총 5개였고, 그 중 4개를 출제했는데 사실 여기에는 비하인드 스토리(…)가 존재합니다.
대회 +24h 까지만 해도 웹 문제는 4개였는데, babyjs 를 출제하고 나서
터무니없이 간단하게 언인텐이 발생하였기 때문에

대회가 22시간 남은 시점부터 새로운 문제를 만들게 되었고
다행스럽게도 +32h 릴리즈 타임에 출제가 가능했습니다.
네, 이게 Adult JS 입니다.

이전에 교차 검증을 철저히 했으면 이런일이 없었을 테지만, 다들 시간에 쫒기는 탓에
제대로 점검하지 못했습니다. 이것은 고쳐야 할 점이겠지요.
내년에는 준비기간을 2배 이상 늘릴 생각입니다.

defenit_ctf8

Scoring

36c3의 스코어링 방식을 채택했고 만족스럽게 동작했습니다.
survey 문제에 한정해서 스태틱 방식의 스코어링이 이루어졌으면
더 좋았을 거라고 생각되어 내년 적용을 생각하고 있습니다.

Period

48시간 대회를 기획했고 KST(+9) 기준으로
금요일 오후 6시부터 일요일 오후 6시까지 진행했습니다
그러나 대회 시작 시간과, 기간 모두 적절하지 못했다고 생각합니다.

저희에게 금요일 오후 6시였지만 일부 유럽에서는
그 시작 시간이 목요일 아침이었기에, 참여가 굉장히 어려웠으리라 뒤늦게 알게 되었습니다.
내년에는 다른 타임존까지 고려해서, 온전히 주말에만 진행될 수 있도록 할 생각입니다.

시간도 아마 36h쪽이 더 적절했을 것이라고 생각합니다.

Server Management

서버를 어떻게 구성할지에 대한 고민을 많이 했습니다.
최근에 털렸던 여타 서버와 같은 일이 벌어지지 않도록
최대한 안전한 시스템을 만들고자 했고
따라서 모든 문제에 도커를 적용하도록 강제했습니다.

분명 도커 사용에 익숙하지 않은 팀원이 있었지만,
결과적으로는 모든 문제 서버에 적용했고
덕분에 해당 출제자가 부재중이더라도, 간단한 서버 관리가 가능했습니다.

Web서버와 Osint서버도 기본적으로는 같지만
포트스캐닝을 통해서 문제가 릴리즈 전에 노출되는 상황을 방지하기 위해서
리버스 프록시 용도로 Nginx 를 두어 호스트 기반 검증을 거쳤습니다.

대회 중에 서버가 사망하는 일이 종종 있는데
최대한 빠르게 대처할 수 있도록 15초마다 동작하는 헬스체크 봇을 만들어
문제 발생시, 서버에 대한 정보를 메일로 받아볼 수 있게 하였습니다.

이는 확실히 도움이 됐지만, 메일보다는 디스코드 봇 쪽이 더 좋았을 것이라고 생각합니다.
아무래도 메일은 알림을 끄기 쉽지 않고, 소통 채널이 분할되어 버리니까요.

Server Allocation

각 서버당 최소 1문제 ~ 4문제 정도를 수용하도록 했습니다.
성능 문제로 이상이 생기는 것을 최대한 회피하고자
요구치보다 다소 높은 서버를 사용 하였고
가격 절감을 위해 Aws / GCloud 가 아닌 Vultr 을 이용하였습니다.

141.164.47.140

  • Configuration

    • Linux / 2 Core CPU + 4GB RAM + 80GB SSD
  • Purpose

    • CTF Website Production Server

141.164.59.78

  • Configuration

    • Linux / 2 Core CPU + 4GB RAM + 80GB SSD
    • 문제 유출 가능성을 없애기 위해, 화이트리스트 방식으로 차단을 수행하였습니다.
  • Purpose

    • CTF Website Development Server

141.164.60.123

  • Configuration

    • Linux / 4 Core CPU + 8GB RAM + 160GB SSD
  • Purpose

    • Warmup (Pwn)
    • Base64 Encoder (Pwn)
    • ORVVM (Pwn)
    • Persona (Pwn)

141.164.60.159

  • Configuration

    • Linux / 4 Core CPU + 8GB RAM + 160GB SSD
  • Purpose

    • Variable Machine (Pwn)
    • Error program (Pwn)
    • BitBit (Pwn)

141.164.39.92

  • Configuration

    • Linux / 8 Core CPU + 32GB Ram + 640GB SSD
  • Purpose

    • Input Test Driver (Pwn)

141.164.60.163

  • Configuration

    • Linux / 4 Core CPU + 8GB RAM + 160GB SSD
  • Purpose

    • Highlighter (Web)
    • Fortune Cookie (Web)
    • Tar Analyzer (Web)

45.63.124.33

  • Configuration

    • Windows Server 2016 / 2 Core CPU + 4GB RAM + 80GB SSD
    • 한국 Vultr 리전에서는 지원하지 않으므로 유일한 일본 서버입니다.
  • Purpose

    • Babyjs (Web)

141.164.59.254

  • Configuration

    • Linux / 4 Core CPU + 8GB RAM + 160GB SSD
  • Purpose

    • Puzzle (Misc)
    • QR Generator (Misc)
    • Executor (Misc)

141.164.60.154

  • Configuration

    • Linux / 4 Core CPU + 8GB RAM + 160GB SSD
  • Purpose

    • Minesweeper (Misc)
    • Dodge (Misc)
    • Hack The C2 (Osint)

141.164.60.138

  • Configuration

    • Linux / 4 Core CPU + 8GB RAM + 160GB SSD
  • Purpose

    • Simple SPN (Crypto)
    • Hash Chungdol (Crypto)
    • What Browser do I use (Forensic)

Website

react + backend api 형태로 개발된 플랫폼은
높은 성능을 보여주었지만, 400팀에서 1000팀 정도를 상정한 스트레스 테스트를 통해
scoreboard 엔드포인트에서 엄청난 부하가 걸리고 있다는 것을 깨달았습니다.
이후에 캐시를 사용하도록 패치를 수행하였고
1000팀 접속에도 견딜 수 있는 플랫폼을 완성할 수 있었습니다.

본래라면 플래그 인증 후에 폭죽이 터지는 등의 효과를 넣으려고 했지만
여유가 없어서 구현하지 못하고, alert으로 대체해버린 점 아쉽게 생각하고 있습니다.

defenit_ctf7

Challenges

babyjs

본래 30솔브 정도를 예상했지만,
언인텐에 처참히 무너져 47솔브를 기록했습니다, 반성하고 있습니다. 😥

본래 15솔브 정도를 예상했고, 정확히 15솔브를 기록했습니다.
친숙한 이름 덕분에 가장 쉬워 보였던 건지
이 문제와 관련한 질문이 가장 많이 들어왔고 힌트 요청 또한 정말정말 많이 들어와서
정신적인 스트레스 요인이었습니다.

Highlighter

3솔브를 예상했고, 4솔브를 기록한 문제입니다.
예상보다 상위권 팀들이 열심히 풀어준 덕분인 것 같습니다.
이것도 솔브수에 비해 언인텐이 좀 있어서 아쉽지만, 나름 괜찮았습니다.

AdultJS

babyjs 언인텐에 충격받고 급하게 제조하게 된 문제입니다.
당초에는 1솔브 정도를 예상했는데, 남은 16시간 중 8시간이 지나도록 소식이 들리지 않아서
결국 분석 난이도를 대폭 감소시키고 힌트 폭탄을 던졌습니다.
덕분에 Highlighter 보다 높은 5 솔브를 기록하였습니다.

여러 기업에 후원 요청을 넣었고
Theori, ENKI에서 응답해 주셨습니다.
덕분에 30/10/5 에 불과하던 상금을 100/30/10으로 대폭 상승시킬 수 있었습니다.
또한 약간은 부담스러운 후원 요구에도 도움을 준 zer0pts 팀에도 감사합니다.