Continuando a série iniciada no começo do ano, com o Manual CTF-BR #1, que abordava o assunto “Como criar bons challenges“, vamos dar prosseguimento dando algumas dicas sobre Como organizar um bom CTF. Um bom ponto de partida pra entender os desafios e dificuldades em organizar um evento de qualidade, é ler os posts de Bastidores das quatro edições passadas do Pwn2Win aqui no site:
Abaixo vamos compilar o essencial para os interessados conseguirem organizar um bom evento. Basicamente será um resumo do que já foi utilizado na organização do Pwn2Win ao longo dos anos e que pode ser lido com detalhes nos posts acima.
As dicas aqui apresentadas têm como foco principal a realização de competições internacionais.
1 – Boas Ferramentas de Gerenciamento:
O responsável por gerenciar a equipe precisa de boas ferramentas para manter o “trem na linha”. Seguem algumas dicas:
Trello – utilize-o para anotar todas as informações relevantes do evento, bem como para fazer checklists das atividades, anotar resumos de reuniões (pra quem eventualmente não conseguiu participar), ideias de challenges, challenges que precisam de homologação e tradução, etc.
GitLab – um repositório privado no GitLab é uma excelente maneira de gerenciar a criação dos desafios. A vantagem do GitLab é não ter limite de membros em repositórios privados. Use e abuse!
Calendar – faça reuniões mensais com a equipe para saber o andamento das atividades. O Google Calendar é uma boa opção para agendar as reuniões e emitir alertas conforme a data se aproxima.
Meet e whereby: duas boas opções para as reuniões em vídeo da equipe.
A melhor dica nessa seção é: crie deadlines, as pessoas só costumam trabalhar sob pressão! 🙂
2 – Data:
A escolha da data também é essencial para um evento bem-sucedido. Se você quer um bom público, busque fazer no início do ano, pois os times costumam estar bem ocupados no final. Consulte o CTFTime e veja se não vai conflitar com outros eventos importantes. Caso ocorra algum conflito após a inclusão do evento lá, fale com o kyprizel e altere-a.
3 – Bons Challenges:
Se você não leu o Post do Manual #1, comece por lá. Bons challenges são de primordial importância para um evento ser bem sucedido. Os players esperam ser desafiados, e você, como organizador do evento, tem que mantê-los entretidos durante o período de duração do CTF. Mire o público mais hardcore, dessa forma você nivela por cima e todos os outros públicos serão atendidos. Se quiser, faça alguns desafios nível “baby” pra que todos possam pontuar, mas não os priorize. E claro, lembre-se da regra básica: “a dificuldade do desafio tem que estar na implementação da solução, não em entender o que fazer com as informações dadas”.
4 – Infraestrutura Robusta:
Uma boa infra para o dashboard e para os desafios que necessitam de servidores é um ponto crítico a ser pensado na organização. Vamos falar sobre eles abaixo.
Veja esse post para se manter atento aos perigos de não dar a devida atenção à Infra.
4.1 – Plataforma (Dashboard):
A plataforma do dashboard precisa ser robusta. O Pwn2Win 2016, primeira edição internacional do evento, utilizou uma plataforma própria, mesma utilizada nos CTF-BR Universities, porém ela se mostrou não ser otimizada o suficiente para eventos internacionais. Por esse motivo, a plataforma foi migrada para uma solução (NIZKCTF) utilizando infraestrutura pública (GitHub + Continuous Integration) atrás da CloudFlare, que ajuda muito protegendo de ataques e fazendo cache do conteúdo. Não deixe de usar a CloudFlare, diversos CTFs atuais já sofreram com ataques DDoS.
Você não precisa usar a NIZKCTF para ter um bom desempenho no dashboard, e também não precisa “reinventar a roda” tentando usar uma plataforma própria (que provavelmente não será otimizada o suficiente). Uma opção viável é optar pelo famoso CTFd, porém é importante fazer alguns testes de benchmark, hardening e tuning, para ter certeza que vai atender bem a demanda e não vai “engasgar” na Hora H. Evite plataformas pesadas e cheias de frescura, como a do Facebook. Nem eles mesmos a usaram no Facebook CTF 2019, então definitivamente não é uma boa ideia.
4.2 – Servidores dos desafios:
Se o evento for internacional, pense na questão de latência dos servers dos desafios (em desafios de PPC, essa questão é importante). É uma boa ideia ter servidores no Brasil, para players brasileiros, e no exterior, para os demais (utilizando empresas boas e baratas, como Vultr, DigitalOcean ou Scaleway (ARM)). Faça servidores de mirror, pra que quando os admins estiverem ausentes, nenhum desafio fique offline. Sempre utilize containers (LXC ou Docker, por exemplo), pois agiliza o deploy e mantém o servidor host seguro (caso os serviços estejam atualizados, obviamente).
4.3 – Arquivos para os players:
Faça mirror para as opções de armazenamento dos arquivos dos desafios que serão baixados pelos players. Muitos CTFs hospedam os arquivos nos seus países, e isso é uma péssima prática. Opte por dois lugares onde a velocidade de download será alta independentemente da região do player. Coloque o hash do arquivo no nome dele, por exemplo nome_do_chall_hash_sha256.tar.gz, para que a pessoa possa saber se foi baixado corretamente, caso ocorrer algum problema na hora de descomprimi-lo.
4.4 – Health Checker:
Outra prática recomendada é fazer um script de Health Check, para testar os servidores dos desafios constantemente, bem como se seu solver (solução) está funcionando como esperado. Caso algum fique offline ou esteja corrompido, você pode configurar para emitir um alerta, ou até mesmo fazer o próprio script reiniciar ou rebuildar o serviço ou container do desafio.
5 – Suporte Responsivo:
Um bom suporte na hora do evento é extremamente importante para o sucesso do mesmo. Escolha um meio de comunicação de fácil acesso, como um canal no IRC, e certifique-se que sempre terá alguém da equipe online enquanto a competição estiver rolando. É importante a Staff conhecer os desafios dos outros criadores, para conseguir tirar dúvidas (não técnicas, claro, mas funcionais) caso os respectivos admins não estiverem disponíveis. Lembre-se: todos querem vencer, então é importante que tudo funcione perfeitamente até o fim, sem que ninguém seja prejudicado por downtimes ou outros bugs que possam aparecer.
Conclusão:
Com essas dicas, esperamos dar um pequeno norte aos que desejam se aventurar na complexa missão de fazer um bom CTF. Em caso de dúvidas, peça invite para nosso grupo no Telegram, teremos prazer em ajudá-lo!
Avante #CTF-BR! 🙂
Update (24 de dezembro de 2019)
Eduardo Vela, integrante da Staff do Google CTF, postou um link super completo para organizadores de CTFs se basearem. Diversos tópicos são abordados, vale a leitura:
Design guidelines for CTF authors and organizers
Além dele, há mais dois interessantes:
The Many Maxims of Maximally Effective CTFs
Suggestions for running a CTF (do PPP)