Pwn2Win CTF 2020 – Bastidores

E chega ao fim mais uma edição do Pwn2Win CTF, organizada pelo ELT. Dessa vez, com muitas novidades, e contando com um rating alto (>63), atraiu diversos Top Teams que até então nunca haviam participado do evento, o que deixou a disputa pelo podium muito acirrada e bonita de se assistir.

Essa edição bateu vários recordes. Entre eles, o maior número de times inscritos de todas edições, e também de times pontuantes. Além disso, outra marca a ser comemorada é que apenas 3 challenges terminaram sem solves, devido a qualidade dos times participantes.

A organização levou 5 meses, começando em janeiro de 2020, dois meses após a edição 2019, que ocorreu em novembro. A ideia de fazer no primeiro semestre foi pra tentar fazer com que mais times bons jogassem, tendo em vista que no final do ano vários Top Teams estão cansados ou com muitas finais para participar.

Equipe

Como sempre, além dos membros do time, vários amigos ajudaram na edição. Abaixo, uma lista com todos eles e suas funções:

Álisson “gnx” Bertochi – coordenação geral das equipes, criação da história, gerenciamento da infra e deploys, divulgação, criação de desafios de Miscellaneous, contribuição com o Healthchecker e auxílio em homologações.

André Smaira – criação de desafio de Crypto e PPC (Professional Programming and Coding), e auxílio em homologações.

Caio Lüders – criação de desafios de Web Hacking server-side.

Dan Borges – criação da ilustração da história. Recomendamos fortemente o seu trabalho, veja seu portfólio aqui.

Éderson “edstz” Szlachta – desenvolvimento do backend da nova interface web para a tradicional plataforma NIZKCTF, utilizando Cloud Functions da GCP e Firebase (websockets). Criação dos certificados para os times vencedores. Suporte e hotfixes durante o evento.

Fernando “feroso” Dantas – criação de desafio de Exploitation.

José “esoj” Luiz – criação de desafio de Exploitation.

Leonardo “pqatsi” Amaral – colaboração com a infraestrutura e consultoria em questões relacionadas a rede.

Lorhan Sohaky – desenvolvimento do frontend para a interface web da plataforma, usando VueJS e integração com a API do GitHub. Um vídeo do timelapse do desenvolvimento pode ser visto aqui. Suporte e hotfixes durante o evento.

Luan Herrera – criação de desafios de Web Hacking client-side.

Marcelo Samsoniuk – consultoria em telecom (desafio de dial-up).

Matheus “abrasax” Vrech – criação de desafio de Web Hacking server-side.

Matheus Back – colaboração na homologação da fila do bot de Continuous Integration.

Matteus “n0one” Sthefano – criação de desafio de Exploitation, aprimoramento do Healthchecker e criação de solução de monitoramento baseada em Grafana.

Paulo “thotypous” Matias – criação de desafios de Hardware + (Exploitation e Reversing), e Miscellaneous. Mentoria no desenvolvimento da nova plataforma. Suporte e hotfixes durante o evento.

Paulo Dayrell – criação de desafio de Exploitation.

Paulo Sergio Klaus – debug da plataforma para identificar um bug crítico e criação de desafio de Rev.

Pedro “pedroysb” Barbosa – criação de desafios de Crypto e Exploitation, e criação do Healthchecker.

Saullo “n0ps13d” Carvalho – criação de desafio de Exploitation e auxílio em homologações.

Vinicius “pdpano” Aurichio – criação de desafio de Crypto/Quantum, auxílio em homologações e traduções.

Times afiliados ao CTF-BR – colaboração na homologação da nova plataforma, identificando bugs e propondo melhorias.

Principais Desafios

Gerenciamento da Equipe

Esse sempre é o maior e mais estressante desafio. Fazer o CTF demanda meses e muito trabalho de pessoas que não ganham dinheiro com isso, fazem só pelo prazer de entregar uma competição alto nível para a comunidade. Muitas ferramentas foram utilizadas para o gerenciamento, como:

Git – controle de versão dos desafios (Infos, Attachments e Deploy).

Google Calendar – utilizado para lembrar as equipes das deadlines.

Google Meet – utilizado para reuniões para definições importantes e de acompanhamento do desenvolvimento da plataforma.

Google Sheets – utilizado para controle e status dos desafios.

Trello – utilizado para organizar as informações importantes, incluindo checklists, resumos de reuniões, ideias de desafios, etc.

Telegram – principal meio de comunicação entre as equipes responsáveis pelo evento e pela plataforma.

Infraestrutura

Depois de 4 anos utilizando como infraestrutura principal a OpenStack da UFSCar, esse ano tivemos que procurar uma parceria/patrocínio externo, pois a Universidade está migrando para outra solução.

Conseguimos um patrocínio do Google, na forma de um crédito de 500 dólares para utilizarmos na Google Cloud Platform. Além deles, ainda tínhamos os 300 dólares do Free Tier, que utilizamos para os testes antes de aplicarmos o cupom definitivo. A parceria caiu como uma luva, pois além das Instâncias de VMs para os desafios, também utilizamos o Firebase e as Cloud Functions para processar os PRs (Continuous Integration) do novo bot da plataforma.

Abaixo seguem as tecnologias e serviços que utilizamos nessa edição cheia de novidades:

CloudFlare: proteção para a plataforma, SSL para alguns desafios web e servidor DNS para os desafios, que diferente dos anos anteriores, o link dos servers foi no passado nas descrições no formato nomechall.pwn2.win, permitindo a alteração rápida de IPs e adição de mais servidores para o round robin. Abaixo, as estatísticas do domínio pwn2.win:

Colocation no datacenter da UFSCar: O desafio Hardware Trojan que, em sua última etapa, envolvia invadir um dispositivo IoT com o processador comprometido pelo trojan, foi hospedado via colocation no data center da UFSCar.

Containers LXC e Docker: sempre são nossas tecnologias de containers preferidas para o deploy dos desafios.

DreamHost: usada como repo principal de arquivos servidos para os players:

GitHub: utilizamos para hospedar o repositório de submissões dos times e o github pages para o dashboard:

Google Cloud Plataform: utilizada para as VMs dos challs (uma por desafio, com configurações bem generosas), Cloud Functions para o bot de CI da plataforma, Firebase (Realtime Database) e armazenamento (bucket) secundário (mirror) para os arquivos dos desafios. Usamos também o recurso de LoadBalance com Grupo de Máquinas da GCP para os desafios nos quais percebemos que ele era mais interessante que uma distribuição de carga via DNS (round robin).

Máquinas
Máquinas
Máquinas
Máquinas
Grupo de Máquinas para o desafio Stolen Backdoor
Imagens das Máquinas
Bucket utilizado como Mirror
Estatísticas do Firebase
Balanceamento de carga

E por fim, o gasto total do Projeto na GCP:

Gasto do Projeto

Grafana: utlizado para monitorar o estado/saúde dos desafios. O Healthchecker era um script em python que rodava todos solvers dos desafios que utilizam servidores, e através de um servidor em flask, disponibilizava um json com o status de cada um (true para OK, false para PROBLEMA), que era consultado pelo Grafana para a geração dos gráficos.

Grafana utilizado para monitoramento
json utilizado pelo Grafana

Namesilo: todos domínios utilizados para o evento são comprados na namesilo, pois com certeza é o registrar mais barato.

Bons challenges

A inovação é historicamente uma das principais características do evento. Todos os anos trazemos desafios únicos para os players, e essa é uma missão que levamos muito a sério. Manter a qualidade já conhecida e esperada pelos players, bem como honrar o alto rating, é uma tarefa muito complexa. Com a dedicação ímpar da equipe, nessa edição entregamos pra comunidade alguns 0days e muitos desafios inovadores, explorando tecnologias diferentes, e outros realmente complexos.

Ranking Geral

Com a participação de diversos times Tier 1 que até então nunca tinham participado do evento, a disputa pelo Top 3 foi intensa. Aconteceram diversos plot twists durante a competição, o que deixou essa edição histórica ainda mais bonita. Foram 864 times inscritos, muito superior ao recorde anterior (529 em 2016), e 401 pontuantes (também maior que os 312 do recorde de 2016). A interface web feita pelo Lorhan e Éderson realmente deu um boost no evento!

No final da batalha, os vencedores foram o perfect blue (vários países), justCatTheFish (Polônia) e TokyoWesterns (Japão). Eles resolveram diversos desafios muito complexos, estão de parabéns pela incrível performance!

Gráfico Top 10
Top 10

Ranking Acadêmico Brasileiro

Entre os times acadêmicos brasileiros, que estavam disputando os certificados do evento (equivalente à medalhas), o Top 3 ficou assim:

(43º overall) imesec1337 – Equipe do IME (Instituto Militar de Engenharia), filiada ao CTF-BR.

(53º overall) IMEsec – Equipe do IME (Instituto de Matemática e Estatística) da Universidade de São Paulo (USP).

(56º overall) Shingeki No Covid – Equipe com alunos da Universidade Federal de São Carlos (UFSCar).

Parabéns a todos pela dedicação, vocês são o futuro do cenário brasileiro! 😀

Estatísticas

  • Times inscritos na competição: 864
  • Times com ao menos uma submissão correta: 401
  • Evolução ao longo do tempo:

Países participantes (com base nos times que disponibilizaram essa informação):

  • Total de países (registrados): 78
  • Total de países (ao menos um solve): 65
  • Países com mais times inscritos:
    • in – 113
    • us – 107
    • br – 55
    • ru – 46
    • kr – 36
  • Países com mais times pontuantes:
    • us – 56
    • in – 47
    • br – 28
    • ru – 25
    • jp – 18
  • Máximo de pontos por time/país (dentre os que exibiram seu país):
    • us/ru/ee/ca – 4862
    • pl – 4553
  • Média de pontos por time/país (dentre os que exibiram seu país):
    • ee – 4862
    • aq – 1446
    • pl – 1384
    • cg – 1199
    • ca – 654

Submissões corretas (agregado de todos os times):

  • Total de submissões corretas: 772
  • Submissões corretas por hora:

Taxa de submissões corretas:

  • Max: 1 a cada 16 segundos*
  • Média: 1 a cada 223.73929961089493 segundos
  • Min: 1 a cada 3280 segundos

* Essa taxa de 1 a cada 16 segundos foi por conta da fila que foi implementada nessa edição. O bot processava um PR por vez. No começo da competição, por causa da flag bônus, a fila sofreu um flood e estava demorando bastante pra processar as submissões. Esse problema foi resolvido com um hotfix que implementamos para que as submissões repetidas, que estavam sendo enviadas para o bot por players que achavam que o envio anterior não tinha funcionado, fossem removidas.

  • Histograma:

  • Total de challenges: 24
  • Total de Solves e Autores:
    1. [Bonus] Transcendence Rebellion (Read First) – 393 solves, por gnx.
    2. [Web] A Payload to rule them all – 65 solves, por caioluders.
    3. [Web] Dr Manhattan – 19 solves, por caioluders.
    4. [Web] Watchers – 2 solves, por abrasax.
    5. [Web] Matrona – 6 solves por herrera.
    6. [Web] Matrona v2 – 1 solve, por herrera.
    7. [Web] Quasi-scriptless – 3 solves, por herrera.
    8. [Rev] IP Protection – 7 solves, por thotypous.
    9. [Rev+Crypto] S1 Protocol – 18 solves, por pedroysb.
    10. [Hardware+Rev] Hardware Trojan v2.0 – Part1 – sem solves, por thotypous.
    11. [Hardware+Pwn] Hardware Trojan v2.0 – Part2 – sem solves, por thotypous.
    12. [PPC] Sound Maze v2.0 – 20 solves, por andre_smaira.
    13. [Misc] Dial-up Interception – sem solves, por thotypous
    14. [Misc] Oldschool Adventures – 3 solves, por gnx ft. andre_smaira.
    15. [Misc+Rev] Private Backdoor – 6 solves, por gnx ft. pauloklaus.
    16. [Pwn] At Your Command – 27 solves, por n0ps13d.
    17. [Pwn] Butcher BMC – 8 solves, por pedroysb.
    18. [Pwn OmniTmizer – 6 solves, por feroso.
    19. [Pwn] Stolen Backdoor – 1 solve, por esoj.
    20. [Pwn Trusted Node – 12 solves, por n0one.
    21. [Pwn] Tukro – 19 solves, por dayrell.
    22. [Crypto] Lost qKeys – 16 solves, por pdpano.
    23. [Crypto] Androids Encryption – 108 solves, por andre_smaira.
    24. [Crypto] Omni Crypto – 32 solves, por pedroysb.

Agradecimentos

Além de todos os membros do ELT, que deram o sangue para que essa edição fosse realizada, agradecemos a todos amigos que ajudaram, principalmente ao Lorhan e ao Éderson, que trabalharam duro para nos proporcionar essa excelente plataforma para o game. Além disso, agradecemos muito ao Google/GCP pelo patrocínio da Infra, que também foi essencial para o sucesso do evento.

Últimas atualizações

Se você jogou essa edição e deseja dar seu feedback, por favor, utilize esse formulário. Estamos em constante evolução e todos feedbacks são levados muito a sério pela nossa equipe. Também pedimos ajuda pra mantermos nosso rating alto no CTFTime. Esse é um grande fator de motivação para o time, visto que quanto mais alto, mais times Tier 1 terão vontade de participar e resolver nossos desafios, que não são simples e são feitos pra esse público alvo.

Além disso, o desafio Hardware Trojan v2.0, que terminou sem solves, está com uma premiação especial para quem conseguir dar First Blood. A pessoa entrará no Hall da Fama do CTF-BR, além de ganhar 1 XMR. O Special Prize é válido até dia 07 de Junho, e as informações podem ser vistas na página do Hall da Fama. Após a deadline, seu write-up será publicado no repositório de challenges do evento, onde já se encontram outros códigos-fonte e write-ups oficiais.

Conclusão

Pelo quinto ano consecutivo, conseguimos fazer história com um CTF de altíssimo nível e extremamente original, onde vários challenges entrarão para os anais da história. A participação de diversos Top Teams nos fez sentir a sensação de dever cumprido e de esforço recompensado. Continuaremos evoluindo a cada ano, através do feedback dos players/times, e trazendo edições cada vez mais épicas para a cena (se é que isso é possível). Ainda estamos procurando um grande patrocinador para fazermos uma edição in loco no Brasil, trazendo os Top Teams que se classificarem em uma qualificatória online. Essa ideia é antiga e não desistimos nem desistiremos dela.

Avante #CTF-BR, o topo do mundo já é nosso! 🇧🇷🎉❤

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *