Pelo quarto ano consecutivo, conseguimos fazer uma edição histórica do Pwn2Win. O esforço aumenta exponencialmente a cada ano, pois temos o dever de superar o evento anterior, honrar nosso rating no CTFTime e trazer inovação e desafios únicos aos times que já estão acostumados com essa nossa característica. Dessa vez, o tempo de organização foi de 5 meses, começando em Junho.
Este ano, além de todos os motivos citados acima, ainda tínhamos o dever de classificar um Top Team para um dos CTFs que mais premiaram na história, o Pro CTF. A última edição desse evento teve um prize pool de US$ 100 000. Mesmo com essa vaga em jogo, não sentimos uma adesão massiva de Top Teams, como esperávamos, e o evento acabou novamente com 7 desafios sem solves, como no ano passado. 🙁
Como de 2017 pra cá, utilizamos a NIZKCTF Platform, porém sem o tradicional Provisionador. Devido a motivos que serão relatados abaixo (em Infraestrutura), decidimos não ter mais desafios isolados no evento.
APOIO INSTITUCIONAL
Assim como em 2017, tivemos apoio institucional da Pró-Reitoria de Extensão da UFSCar, por meio do processo ProEx nº 23112.108057/2019-11.
Temos muito a agradecer à UFSCar pelo apoio, pois desde 2017 disponibiliza sua cloud para utilizarmos nos servidores dos desafios, além de a usarmos como repositório principal dos arquivos que são disponibilizados para os players. Essa parceria é essencial para o sucesso do evento pois reduz grandiosamente os custos operacionais.
EQUIPE
Além dos membros do time, como de praxe alguns convidados participaram da organização, e somos muito gratos por isso. Abaixo, todos que contribuíram e suas funções:
Álisson “gnx” Bertochi – coordenação geral da equipe, gerenciamento da infra, criação da estória e de desafio de Networking+Miscellaneous, e divulgação;
André “andre_smaira” Smaira – criação de desafio de Cryptography+Reversing;
Caio Lüders – criação de desafio de Reversing+Networking;
Dan Borges – criação da ilustração da estória. Recomendamos fortemente o seu trabalho, veja seu portfólio aqui.
Éderson “edtsz” Szlachta – confecção dos certificados dos times vencedores;
Fernando “feroso” Dantas – criação de desafios de Exploitation;
Henrique “supitto” Marcomini – criação de desafio de Exploitation+Miscellanous;
Luan “herrera” Herrera – criação de desafios de Web Hacking;
Marcelo Samsoniuk e Matheus Victorello – suporte para o desenvolvimento do desafio de Hardware Hacking;
Matheus “abrasax” Vrech ft. Manoel Abreu Netto – criação de desafio de Web Hacking;
Matteus “n0one” Silva – criação de desafio Miscellaneous;
Paulo “dayrell” Dayrell – criação de desafio de Reversing+Miscellaneous;
Paulo “dr4kks” Klaus – criação de desafio PPC (Professional Programming and Coding);
Paulo “thotypous” Matias – criação de desafios de Reversing e Hardware Hacking;
Pedro “pedroysb” Barbosa – criação de desafios de Cryptography e Exploitation;
Saullo “n0ps13d” Carvalho – criação de desafio de Exploitation, tradução das descrições e homologação de desafios diversos;
Thiago “thnc” Cardoso – criação de desafio de Exploitation;
Vinicius “pdpano” Aurichio – criação do desafio quântico de Reversing e homologação de desafios diversos;
PRINCIPAIS DESAFIOS
GERENCIAMENTO DA EQUIPE
Gerenciar uma equipe tão grande é sempre o maior e mais estressante desafio da organização. Utilizamos o Trello para armazenar todas as informações do evento, como datas importantes, checklists de cada colaborador, ideias de challenges, descrições para traduzir, etc. O Google Calendar foi utilizado para todos saberem as deadlines e serem notificados com alguns dias de antecedência. O Telegram foi o meio de comunicação em realtime, e também utilizamos o Google Sheets para uma Planilha de Controle dos desafios.
INFRAESTRUTURA
Esse ano tivemos problemas de última hora em relação à infraestrutura, que nos geraram um grande estresse nas vésperas do evento. Na quinta-feira anterior ao grande dia, percebemos que os problemas de roteamento junto à RNP que a UFSCar e várias outras universidades do país estavam sofrendo poderiam deixar o CTF várias horas offline. Tomamos duas medidas emergenciais:
- Criação de uma VPN dentro da USP São Carlos, com o objetivo de ser um backup para que os players conseguissem chegar até a UFSCar (200.136.252.0/22 e 200.136.213.0/24) por meio da Rede Sanca em caso de downtime. O único problema dessa solução era que tínhamos apenas um range de IPs limitado (/24) para a rede. Agradecemos ao Fabio e ao Sirbone pelo auxílio na configuração dessa solução.
- Migração na noite anterior ao evento de quase todos desafios que possuíam servidores para a DigitalOcean. O único servidor que não foi migrado foi o do desafio Hardware Trojan, já que era uma placa FPGA ligada diretamente dentro do Data Center da UFSCar. Improvisamos uma placa backup dentro da USP, mas houve desligamento por mau contato e decidimos tirá-la de lá. Ela foi posteriormente ligada na casa do Paulo.
Com as medidas emergenciais acima foi possível “salvar o evento”, pois ficamos com dois servidores para cada desafio, o que estava na rede da UFSCar (situação instável, onde tudo poderia acontecer no dia do CTF) e mais um de backup na DigitalOcean.
Levando em conta a instabilidade da rede, e também com o intuito de darmos a possibilidade de todos os times resolverem qualquer um dos desafios a qualquer momento (sem antes precisar resolver um número X para desbloquear a VPN, que ficava exclusivamente na rede da UFSCar), decidimos acabar com os desafios isolados este ano.
No entanto, um dos desafios precisava de latência baixíssima para funcionar conforme o esperado. Em edições anteriores, esse problema era resolvido disponibilizando um jump server (wildcard box) dentro da rede da VPN. A solução este ano foi hospedar esse desafio em data centers de baixo custo, nos quais o próprio player poderia hospedar seu jump server caso necessário.
Seguem abaixo todas as tecnologias e serviços que utilizamos nessa edição.
- AWS Lambda: utilizado para CI (Continuous Integration) da plataforma;
- Azure: os challenges Windows (algo não tão convencional em CTFs) do feroso utilizaram algumas máquinas na Azure;
- Containers LXC: essa tecnologia foi usada para facilitar o deploy de containers dos desafios, e foi essencial para termos tempo hábil para a migração de última hora que fizemos para a DigitalOcean;
- Containers Docker: além dos containers LXC, alguns criadores de desafios optaram pelo docker para deploy, o que também facilitou muito nossa migração para os servidores de backup;
- CloudFlare: gerenciamento de DNS, proteção, cache e certificado SSL para o dashboard:
- DigitalOcean: hospedamos na DO as máquinas de backup para os desafios. Em alguns casos, como no challenge de PPC que precisava de latência baixíssima, e levando em consideração que não tínhamos mais provisionador e desafios isolados esse ano, utilizamos duas instâncias em regiões diferentes, passando as opções para o player (NY3 e AMS3). Dessa forma, poderiam subir uma instância na mesma região para tentar matar o desafio sem lag. Como elas ficaram ligadas de quinta à noite até domingo, gastamos US$ 12,58 em 3 dias:
- DreamHost: utilizamos como mirror para nossos files estáticos:
- GitHub: plataforma do game e dashboard no github.io;
- Namesilo: sempre utilizamos a namesilo.com para os domínios que figuram no evento. É o local mais barato, sem dúvidas;
- Nuvem UFSCar (OpenStack): utilizamos a nuvem da UFSCar para dois propósitos: repositório primário dos arquivos que foram disponibilizados para os players e para subir os servidores primários dos desafios que necessitavam de interação, além de hospedarmos a placa FPGA do challenge de Hardware Hacking no seu data center. Abaixo, imagens dos recursos utilizados nessa edição:
BONS CHALLENGES
Outro grande desafio é conseguirmos fazer ótimos challenges, atendendo aos paladares mais exigentes dos players que já estão acostumados com nossas principais características, que são a inovação e a criação de desafios únicos. Mais uma vez esse objetivo foi atingido com maestria, com a dedicação de toda equipe. Foi a primeira edição em que tivemos desafios envolvendo falhas 0day (zajebisty)!
RANKING GERAL
O Ranking desse ano contou com as maiores reviravoltas da história do Pwn2Win. Nas últimas horas de evento o placar ficou mudando a cada instante, foi realmente uma experiência muito excitante de acompanhar!
Contamos com dois brasileiros no Top 15:
- FireShell em 7º, primeiro lugar entre os times brasileiros;
- [USP]Ganesh em 12º, primeiro lugar entre os times acadêmicos brasileiros;
A perfomance do Ganesh realmente surpreendeu, é um time de muito potencial! Ambos representaram muito bem nosso #CTF-BR e estão de parabéns!
Além disso, vale menção especial ao time Shingeki no Chikungunya, formado por alunos da UFSCar, que alcançou o terceiro lugar brasileiro (e segundo entre os times acadêmicos brasileiros). A maioria dos alunos da UFSCar com experiência prévia em CTFs estava envolvida na organização do Pwn2Win e não podia jogar, motivo pelo qual a boa colocação dessa equipe de iniciantes surpreendeu.
O Campeão foi o OpenToAll, time internacional aberto para players do mundo inteiro, seguido pelo Balsn, campeão do ano passado, e do CL34R, desconhecido até o momento. Uma das características do Pwn2Win é atrair times que só jogam esse evento, mandam muito bem e depois somem:
GRÁFICO TOP 10
A evolução do Top 10 durante as 48 horas pode ser vista abaixo:
ESTATÍSTICAS
- Times inscritos na competição: 269
- Times com ao menos uma submissão correta: 220
- Evolução ao longo do tempo:
Países participantes (com base nos times que disponibilizaram essa informação):
- Total de países (registrados): 42
- Total de países (ao menos um solve): 39
- Países com mais times inscritos:
- us – 40
- br – 36
- jp – 15
- in – 12
- fr – 11
- Países com mais times pontuantes:
- us – 35
- br – 28
- jp – 13
- ru – 10
- in – 9
- Máximo de pontos por time/país (dentre os que exibiram seu país):
- tw – 3737
- pl – 3429
- us – 2810
- kr – 2699
- br – 2535
- Média de pontos por time/país (dentre os que exibiram seu país):
- tw – 1650
- pt – 1454
- kr – 1008
- it – 938
- pl – 885
Submissões corretas (agregado de todos os times):
- Total de submissões corretas: 577
- Submissões corretas por hora:
- Taxa de submissões corretas:
- Max: 1 a cada 1 segundos
- Média: 1 a cada 300 segundos
- Min: 1 a cada 3563 segundos
- Histograma:
Total de challenges: 27
Total de Solves e Autores:
- [Story] The Last Resort (Read First) – 217 solves, por gnx
- [Bonus] g00d b0y – 156 solves, por gnx
- [PPC] AstroBot – 1 solve, por dr4kks
- [Web] Baby Recruit – 26 solves, por abrasax e manoelt
- [Web] Calc – sem solves, por herrera
- [Web] Message Keeper – sem solves, por herrera
- [Pwn+Misc] Federated Sophia – 3 solves, por thnc
- [Pwn+Misc] Roots Before Branches – 12 solves, por supitto
- [Pwn] Future Message 1 – 22 solves, por feroso
- [Pwn] Future Message 2 – 15 solves, por feroso
- [Pwn] Future Message 3 – 10 solves, por feroso
- [Pwn] Future Message 4 – 4 solves, por feroso
- [Pwn] Random Vault – 18 solves, por n0ps13d
- [Pwn] Full tROll – 40 solves, por pedroysb
- [Hardware+Rev] Hardware Trojan – Part 1 – 1 solve, por thotypous
- [Hardware+Pwn] Hardware Trojan – Part 2 – sem solves, por thotypous
- [Crypto] Bilinear Evil – sem solves, por dfaranha
- [Crypto] real ec – 9 solves, por pedroysb
- [Crypto+Rev] matRoSkA – 1 solve, por pedroysb
- [Crypto+Rev] vamos pra RuSsiA – 4 solves, por pedroysb
- [Crypto+Rev] Random Crypto – 7 solves, por andre_smaira
- [Net+Misc] Botnet 2.0 – sem solves, por gnx
- [Net+Rev] I Shall Never Be Anything – 23 solves, por g3ol4d0
- [Rev+Misc] RMbellious – 1 solve, por dayrell
- [Rev] Inherit the Stars 2.0 – sem solves, por thotypous
- [Rev/Quantum] HARPA Hyper quantum Login System – sem solves, por pdpano
- [Misc] Cloud Admin – 7 solves, por n0one
CHAMADA PARA COMPROVAÇÃO DE TIMES ACADÊMICOS
Para conseguirmos fechar o placar e dar a premiação específica destinada aos times acadêmicos brasileiros, precisamos que todos os participantes que se encaixam nessa categoria (todos membros estudantes de qualquer nível) leiam esse post e sigam as instruções. Até o momento, o terceiro colocado dentre os times acadêmicos brasileiros ainda está indefinido.
AGRADECIMENTOS
Agradecemos grandiosamente à UFSCar por mais um ano de parceria. Apesar dos problemas que tivemos com a rede, é sempre bom contar com servidores hospedados em um data center com baixa latência para os players brasileiros. Agradecemos à Rede ANSP por disponibilizar à UFSCar uma grande quantidade de rotas logo no sábado de manhã, permitindo que a rede voltasse mais rapidamente à normalidade. Também agradecemos ao nosso Patrocinador anônimo por mais um ano proporcionar a premiação aos times internacionais e acadêmicos. Ainda há pessoas na comunidade que querem apenas ajudar, sem esperar nada em troca.
FEEDBACKS
Sempre estamos abertos a feedbacks para melhorias, então se você participou do evento e quer nos ajudar, responda as questões desse form.
CONCLUSÃO
Mais uma vez, através de um trabalho muito intenso e cansativo, conseguimos proporcionar uma experiência ímpar aos players do nosso cenário internacional de CTFs, colocando o Brasil definitivamente entre os principais organizadores do planeta. Um evento Tier 1 que não perde em nada para nenhum outro, e ainda tem características únicas de inovação e estória que o diferencia dos demais.
Conseguimos inovar com desafios como o Hardware Trojan (FPGA Exploitation), HARPA Hyper quantum Login System (continuando nossa série quântica, iniciada ano passado), Federated Sophia (utilizava uma falha 0day em uma biblioteca de Machine Learning), Calc e Message Keeper (desafios web client-side realmente complexos), Future Message (série de desafios de Windows Heap Exploitation), AstroBot (mais um PPC hardcore da nossa série de Games), entre tantos outros.
Temos a pretensão de fazer um grande evento com Final in loco no Brasil, trazendo os Top Teams classificados em uma qualificatória online. Já é algo que os times vêm pedindo ao longo dos anos, mas para isso precisaríamos que uma empresa muito grande comprasse essa ideia. Se você conhece ou trabalha em alguma que pode se interessar nesse projeto, entre em contato pelo e-mail elt at ctf-br.org.
Avante #CTF-BR, fazendo história rumo ao topo do mundo sempre!