Pelo terceiro ano consecutivo conseguimos fazer uma competição internacional temática insana, extremamente inovadora e com muitos challenges complexos. Diferente dos anos anteriores, onde a organização como um todo, desde a primeira reunião, levou cerca de 10 meses, esse ano fizemos tudo em 8, começando as atividades em março. Para a criação dos challenges, usamos especificamente os meses de outubro e novembro.
O lado negativo desse evento foi conflitar com as Finals do Real World CTF, a competição que mais premiou na história (200k USD). Esse fato acabou tirando 20 Top Teams do páreo, e o Pwn2Win 2018 terminou com um recorde de 7 desafios sem solves.
Novamente utilizamos nossa plataforma NIZKCTF, o provisionamento de instâncias exclusivas por meio de containers LXC, e uma rede VPN para os times que se qualificassem resolvendo 6 desafios previamente. Diminuímos esse “trigger” para a VPN, em relação ao ano passado, pois os challenges estavam mais complexos.
APOIO INSTITUCIONAL
Como nos anos anteriores, utilizamos a Cloud da UFSCar para a competição, e só assim conseguimos o provisionamento necessário para escalar as máquinas e suprir a demanda de recursos.
EQUIPE
Como de praxe, além dos membros do ELT, sempre são convidados alguns amigos do time para compor a equipe de criação dos desafios. A ideia principal é sempre trazer inovação e originalidade. Mais uma vez, realizamos essa tarefa com maestria! Abaixo, os responsáveis e suas funções:
Álisson “gnx” Bertochi (ELT) – gerenciamento geral da equipe, divulgação, criação da estória e dos challenges que fizeram parte da Attack Step;
André “andre_smaira” Smaira (ELT) – criação de challenges de PPC, PPC-M e Reversing;
Caio Lüders (ELT) – criação de challenges Misc e Net/For;
Diego Aranha (ELT) – criação de challenge de Criptografia;
Éderson “edtsz” Szlachta (convidado) – confecção dos certificados dos times vencedores;
eremitah (convidado) – ideias e revisão da estória;
Fernando “feroso” Dantas (ELT) – criação de challenge de Exploitation;
Gabriel “spooks” Alves (ELT) – tradução e revisão das descrições e Plataforma;
José “cabeça” Teixeira Silva Junior (convidado) – criação dos challenges de Reversing e PPC usando a arquitetura da Manchester Dataflow Machine;
Luan “herrera” Herrera (ELT) – criação de challenges Web;
Lucas “whoisroot” Magalhães (convidado) – Provisionador do Game e Plataforma;
Marcio “pimps‘ Almeida (convidado) – criação de challenges Web e Forensics;
Manoel Netto (ELT) – criação de challenge Web;
Paulo “dr4kks” Klaus (convidado) – criação de challenge PPC;
Paulo “thotypous” Matias (ELT) – criação de challenges de Reversing e Crypto. Gerenciamento da Infraestrutura e Plataforma PPC-M;
Pedro “pedroysb” Barbosa (ELT) – criação de challenges de Crypto e Exploitation;
Thiago “thnc” Cardoso (ELT) – criação de challenges de Exploitation;
Vinicius “pdpano” Aurichio (ELT) – criação do challenge quântico de Criptografia/Reversing;
PRINCIPAIS DESAFIOS
Gerenciamento da Equipe
Como nos anos anteriores, talvez esse seja o maior desafio de todos. Gerenciar uma equipe de 17 pessoas não é nada fácil. Para comunicação em realtime, utilizamos um grupo no Whatsapp e o IRC. O Trello foi usado para checklists e centralização das informações mais relevantes que todos deveriam ter acesso. Um repositório SFTP para as armazenar as informações e files dos desafios prontos, e o Google Docs com uma planilha de gerenciamento e acompanhamento do status e progresso de cada chall em particular. O Google Meet foi usado para reuniões com áudio/vídeo.
Infraestrutura
Praticamente as mesmas tecnologias do ano passado foram utilizadas nessa edição. Esse é o ponto mais crítico de qualquer Capture the Flag, ainda mais em um como o nosso, com VPN e máquinas provisionadas exclusivas para cada time.
Abaixo, um resumo das tecnologias e serviços utilizados no evento:
- AWS Lambda: utilizado para CI (Continuous Integration) da plataforma;
- Azure: o challenge Windows (algo não tão convencional em CTFs) do feroso utilizou novamente uma instância na Azure;
- Bitbucket: utilizamos um repositório privado no Bitbucket para armazenarmos códigos de challenges mais complexos;
- Containers LXC: essa tecnologia foi usada para os challenges “isolated“, onde foram provisionadas máquinas únicas, exclusivas e isoladas para cada time que resolvesse 6 desafios, recebendo assim as credenciais para a rede VPN;
- CloudFlare: gerenciamento de DNS, proteção, cache e certificado SSL para o dashboard:
- DreamHost: utilizamos a DH como mirror para nossos files estáticos;
- GitLab: deixamos o GitLab de prontidão, caso ocorresse algum problema no GitHub e precisássemos migrar “on the fly“;
- GitHub: plataforma do game e dashboard no github.io;
- Nuvem UFSCar (OpenStack): utilizamos para todas instâncias (máquinas para os challenges) e repositório principal dos files estáticos (via Swift). Segue uma imagem com o total de recursos utilizados na Nuvem UFSCar (OpenStack) ao final do evento. Alguns desafios eram bastante pesados, como o TPM 2.0 (que usava virtualização nested) e o Message Board (que usava um servidor de aplicação em Java), então nas horas finais do evento redimensionamos algumas das instâncias para 128GB de RAM e 40 vCPUs, para evitar lentidão.
- Namesilo: sempre utilizamos a namesilo para os domínios que figuram no evento;
Plataforma e Provisionamento
A plataforma utilizada foi criada “from scratch”, e é baseada em provas não-interativas de conhecimento zero. Mais informações podem ser encontradas no nosso artigo arXiv:1708.05844, que foi aceito para publicação na IEEE Security & Privacy em uma edição especial sobre segurança no Brasil que deve ser impressa em breve. Apesar de ser um pouco mais “complexa” para instalação e utilização, levando em conta as plataformas baseadas em web tradicionalmente utilizadas, que são totalmente user-friendly, a nossa proporciona segurança e auditoria que as outras não proporcionam.
O Provisionamento da VPN para os desafios isolados foi integrado com a plataforma, que monitorava a quantidade de desafios resolvidos pelas equipes, e quando atingisse o limiar de 6 desafios, subia os containers para o time e mandava as informações para configurar a VPN com o script “setup-vpn” através de news privadas e encriptadas. Mais detalhes podem ser encontrados no artigo que publicamos na Trilha de Ferramentas da SBSeg 2017.
Segue uma imagem da infraestrutura utilizada para os desafios isolados:
Bons Challenges
Apesar de termos começado a organização do evento em março, fizemos todos os desafios em apenas 2 meses (outubro e novembro). O objetivo foi alcançado com maestria e trouxemos muita inovação e challenges brutais.
RANKING GERAL
Tivemos a grata surpresa de pela primeira vez em edições internacionais do evento, vermos um time do #CTF-BR figurar no Top 3. Parabéns Fireshell Security Team!
GRÁFICO TOP 10
A evolução do Top 10 pode ser vista abaixo:
ESTATÍSTICAS
Número de times
- Times inscritos: 206
- Times pontuantes (ao menos uma submissão correta): 163
- Times provisionados na VPN (resolveram ao menos 6 desafios): 22
- Evolução ao longo do tempo:
Países participantes (com base nos times que disponibilizaram essa informação)
- Total de países (registrados): 44
- Total de países (ao menos um solve): 37
- Países com mais times inscritos:
- us – 25
- br – 25
- ru – 10
- in – 10
- pl – 7
- Países com mais times pontuantes:
- us – 20
- br – 18
- ru – 8
- pl – 7
- jp – 7
- Máximo de pontos por time/país:
- tw – 4462
- ca – 3840
- br – 2711
- pl – 2286
- ro – 2222
- Média de pontos por time/país:
- tw – 2496
- ua – 1201
- gb – 1168
- at – 1126
- tn – 913
Submissões corretas (agregado de todos os times)
- Total de submissões corretas: 545
- Submissões corretas por hora:
- Taxa de submissões corretas:
- Max: 1 a cada 2 segundos
- Média: 1 a cada 5 minutos
- Min: 1 a cada 110 minutos
- Histograma:
Total de challenges: 25 avulsos + 5 que compõe a Attack Step
Total de Solves e Autores:
- [Story] A Segregated New World (Read First) – 162 solves, por gnx
- [Bonus] g00d b0y – 115 solves, por gnx
- [Muitas] Attack Step (First Flag) – 1 solve, por gnx
- [Muitas] Attack Step (Second Flag) – sem solves, por gnx
- [Web] BavBin – sem solves, por herrera
- [Web] Berg’s Club – 8 solves, por Manoel
- [Web] Message Board (First Flag) – 7 solves, por pimps
- [Web] Message Board (Second Flag) – 2 solves, por pimps
- [Web] Message Board (Third Flag) – 2 solves, por pimps
- [Web] Trick or Treat – sem solves, por herrera
- [Pwn] EMETaCrazy – 5 solves, por feroso
- [Pwn] Minishell, 22 solves, por pedroysb
- [Pwn] Super Storage – 5 solves, por pedroysb
- [Pwn/Crypto] TPM 2.0 – 1 solve, por pedroysb
- [Crypto] Recovery of the Master Key, sem solves, por dfaranha
- [Crypto] GCM – 8 solves, por pedroysb
- [Rev] Inherit the Stars – sem solves, por thotypous
- [Rev] MDFM Flag Verifier – 2 solves, por cabeça
- [Rev] Too Slow – 7 solves, por andre_smaira e thotypous
- [Rev/Crypto] Back to Bletchley Park – 1 solve, por pdpano e thotypous
- [Forensics] Message Board (Fourth Flag) – 1 solve, por pimps
- [PPC] Noizy Maze, sem solves, por andre_smaira
- [PPC] Super Gravitron Leet Edition (SGLE) – sem solves, por dr4kks
- [PPC-M] Russian Polygons, 18 solves, por andre_smaira
- [PPC-M] Sum (Hello World Platform) – 127 solves, por thotypous
- [PPC-M] The Bavarian Hierarchy, 33 solves, por andre_smaira
- [Misc] Ultramegapolyglot – 18 solves, por g3ol4d0
TASKS SEM SOLVES VALENDO PREMIAÇÃO
Decidimos fazer uma chamada pública, pós-evento, oferecendo até 2 moneros (XMR) e a possibilidade de entrar no nosso Hall da Fama pra quem conseguir resolver alguns dos desafios sem solves do evento.
A Parte 1, postada no Reddit, conta 2 desafios: [Rev] Inherit the Stars e [Crypto] Recovery of the Master Key.
Em breve lançaremos a parte 2, com os challenges do herrera.
AGRADECIMENTOS
Nossa principal parceira, à qual devemos um agradecimento mais que especial, é a UFSCar, pois sem sua cloud OpenStack, não seria possível fazer a competição com tanta qualidade e estabilidade. Usamos muitos recursos pois tivemos que escalar várias máquinas de challenges isolados, como a TPM 2.0 que usava QEMU nos containers LXC, e a Message Board, que usava Java.
FEEDBACKS
Os feedbacks estão sendo muito positivos até o momento, tanto no nosso formulário, quanto no CTFTime.
Ainda não conseguimos cumprir o pedido do ano passado, de fazer uma classificatória online com finais presenciais no Brasil, pois é extremamente difícil conseguirmos patrocínio por aqui (mas realmente tentamos esse ano!). Se você conhece alguma empresa grande que possa se interessar em embarcar nessa ideia conosco, contate-nos (elt at ctf-br dot org).
CONCLUSÃO
Com certeza entramos pra história como um dos melhores CTFs que o mundo já viu. A originalidade pode ser vista em challenges como o Quântico, o TPM 2.0, challenges de web client-side do herrera, que terminaram sem solve, challenges usando MDFM (arquitetura nunca explorada anteriormente em desafios), Inherit the Stars (provavelmente o desafio de MIPS mais difícil lançado até hoje), Attack Step, challenges Web “Real World” do pimps, SGLE (PPC extremamente inovador), um Windows Pwnable realmente complexo (primeiro a ter que bypassar EMET), entre outros.
Como “cereja do bolo”, também mostramos a força do cenário com um time brasileiro ficando no famigerado Top 3!
Avante #CTF-BR, rumo ao topo do mundo!!