Pwn2Win CTF 2016 – Bastidores

História:

A história do Pwn2Win CTF começa em 2014. A ideia inicial era ser um evento pequeno, apenas com um servidor vulnerável passível de ser ownado em uma Feira local de tecnologia, chamada FACE. Na época, o Gustavo Ramiro Seitenfusdo Concas Hackerspace, ofereceu uma máquina seminova com processador Core 2 Quad como premiação, sendo que a competição rodaria nela mesma. Infelizmente, quando nos deparamos com a realidade, que nos remete a uma cultura praticamente inexistente de CTFs na época (fora o Hacking n’ Roll), acabamos desistindo da ideia da competição local, pois não teríamos competidores. Na ocasião, apenas realizamos uma palestra sobre o Maravilhoso Mundo dos CTFs, que futuramente seria ministrada como parte das atividades disponibilizadas pelo Projeto CTF-BR.

Com o servidor já configurado, e pensando em não perder todo o trabalho, pensamos em fazer essa mesma competição online, aberta a todo Brasil. Inicialmente teríamos apenas o servidor rodando, sem challenges jeopardy-style. O desafio inicial foi achar um lugar para reproduzir na nuvem a configuração, que tinha até kernel específico. O problema foi resolvido rapidamente quando descobrimos a maravilhosa Digital Ocean. Sem sombra de dúvidas o lugar mais barato e flexível para subir servidores na nuvem (VPSs). Sem muito esforço conseguimos instalar o kernel, pedir para o suporte bootar com ele, e fazer as demais configurações desejadas para o ambiente. Batizamos essa etapa de Etapa de Ataque. Com o ambiente pronto, surgiu a ideia de fazermos alguns challenges jeopardy para incluir na competição, e acabamos criando quase 40! Com certeza eram bem mais simples do que esses da edição  2016, mas como o público também era só nacional e mais leigo, acabaram vindo bem a calhar.

Além da máquina Core 2 Quad, tiramos um pouco de dinheiro do próprio bolso e conseguimos premiar o segundo e terceiro colocado também, com um Arduino Intel Galileo e um Arduino UNO.

A ideia inicial era fazermos apenas um evento, com o intuito de descobrimos de fato os verdadeiros leets brasileiros, e sem pretensão nenhuma de realizar outros.

Em 2015, depois de diversas reformulações da nossa line-up (ELT), e contrariando a ideia inicial, resolvemos que estava na hora de fazer mais um evento, desta vez bem mais técnico. Iria ser temático, mas não internacional. Decidimos ser o primeiro CTF brasileiro internacional, figurando no CTFTime, só depois de um bom tempo de planejamento.

Preparação:

A preparação do evento propriamente dita começou em Junho de 2015, com as primeiras reuniões e busca de patrocínios. Em julho conseguimos um patrocinador de São Paulo que não quis divulgação, por intermédio do membro Diego Mariano.

Foram 10 meses de trabalho árduo, pensando na história, em desafios de alto nível, principalmente quando fomos aprovados no CTFTime e ganhamos rating 30, algo realmente raro para um evento de primeira viagem. Tínhamos que corresponder às expectativas.

Um dos primeiros problemas foram os conflitos de datas. Inicialmente seria dia 18/03, mas conflitou com o 0CTF (do time chinês 0ops). Mudamos então para 25/03 (que caiu na Páscoa involuntariamente). Outro conflito ocorreu, com o CTF russo VolgaCTF. Desta vez não foi nossa culpa, pois adicionamos com uma boa antecedência para evitar isso, mas os admins do CTFTime só aprovaram um bom tempo depois, quando o conflito já estava gerado. Inclusive tínhamos criado uma thread no Reddit pedindo para os admins adiantarem a aprovação para evitarmos isso, mas não foi suficiente (o admin estava viajando e demorava a ver os e-mails).

Equipe:

Segue uma lista das poucas pessoas que dedicaram seu tempo para que essa competição fosse um sucesso. Alguns literalmente “deram o sangue”:

Álisson “gnx” Bertochi (ELT e TecLand Group): responsável pela coordenação da equipe, criação de challs (Etapa de Ataque, PPC, Forensics, Web Hacking, Networking, Crypto e Python Exploitation), história, divulgação e infraestrutura.

Anderson “DarkShymia” Tomkelski (ELT): criação de challs de eletrônica e reversing.

André “andre_smaira” Smaira (ELT): criação de challs de Física, Programação (PPC-M) e Forensics, traduções.

Bruno “xmrbrz” Zanuzzo e Natan “natanjmai” Mai (Convidado): ajudaram na homologação de alguns challenges PPC.

Caio “g3ol4d0” Lüders (ELT): criação de challs de Steganography e Web.

Diego “dm_” Mariano (ELT): criação de challs de Cryptography.

Éderson “_edEr” Szlachta (TecLand Group): plataforma do game e contribuição em challs (Bathing and Grooming!).

Luca “Candy” Ottoni (Convidado): traduções.

Fernando “feroso” Dantas (ELT): criação de challs Web.

Paulo “thotypous” Matias (ELT): plataforma de programação para os challs de Física e PPC-M, traduções, infraestrutura, criação de challs (LKM pro Kernel Exploitation, Web Hacking, Reversing, Eletrônica) e homologação (Física e PPC-M), ideias em geral e todas as outras coisas realmente complexas que meros mortais não conseguiriam fazer. Geohot brasileiro!

Desafios:

1. Infraestrutura:

Nossa maior preocupação em fazer a competição em nível internacional foi em relação à infraestrutura. Estávamos realmente apreensivos, e uma das primeiras medidas que tomamos foi tirar o dash/scoreboard da DreamHost (shared hosting) e utilizar as soluções da Amazon. Mesmo no Tier Free de 1 ano tivemos recursos suficientes para rodar a plataforma do Game. As principais tecnologias utilizadas, foram:

AWS EC2 (Elastic Cloud Computing) – utilizada para a plataforma do game. Utilizamos o Tier Free (t2.micro) com Apache. A grande vantagem era que poderíamos fazer um upgrade rápido, caso necessário.

AWS RDS (Relational Database Service) – visando um banco de dados também escalável (caso necessário), e com boa latência, pois estaria na mesma rede da máquina (EC2), utilizamos o serviço de Banco de Dados Relacional da Amazon chamado RDS. Usamos a instância free com MySQL.

AWS S3 (Simple Storage Service) – utilizamos como mirror para os arquivos estáticos (static1.pwn2win.party) dos challenges. Preferimos usar como mirror pois eles cobram pelo tráfego usado, e não queríamos estourar o Tier Free.

AWS Elastic IP – um IP exclusivo para nossa instância EC2, evitando problemas caso precisássemos fazer upgrade.

DreamHost – utilizamos como repositório principal dos arquivos estáticos (static.pwn2win.party). Também utilizamos como repositório SFTP para guardar nossos challenges de forma organizada, preenchendo as informações contidas em um README (descrição, pontos, flag, hints…).

Cloudflare – visando trazer proteção aos servidores, utilizamos o plano free da Cloudflare, que atendeu muito bem a demanda, não só protegendo de ataques, mas também aliviando a Plataforma por conta do cache. A propagação praticamente instantânea de DNSs também ajudou muito.

Let’s Encrypt – utilizamos a Let’s Encrypt para geração de certificados SSL, deixando o game com SSL Full (strict) em relação à Cloudflare.

Digital Ocean criamos a imagem de todos challenges que precisavam de servidores e deixamos prontas para ligá-los próximo ao dia. No total, utilizamos 15 servidores simultâneos na DO (droplets básicas).

OpenStack da UFSCar – através de uma parceria com a Secretaria Geral de Informática da UFSCar, tivemos acesso a sua infraestrutura experimental de Cloud para criarmos máquinas (VPS) para o evento. Utilizamos para servidores que necessitavam de mais poder de processamento ou de menor latência de conexão, como a Plataforma dos challenges PPC-M e Physics, feita com nginx+luajit, e o challenge Bathing and Grooming. No final da competição, também utilizamos para criar instâncias próprias para todos times que desejassem uma “máquina exclusiva” para o challenge Secure Chat (Web). Para melhorar a latência para players brasileiros, para alguns challenges onde ela era fundamental (iMathze e PPC Challs), criamos alguns servidores na OpenStack também.

Scaleway – VPS ARM para a Etapa de Ataque.

HE Tunnel Broker – Infelizmente a Scaleway não tem IPv6 nativo ainda nas máquinas ARM, então usamos o magnífico e oldschool serviço da Hurricane Electric.

2. Coodernação da Equipe:

Outro grande desafio foi o gerenciamento da equipe. Para isso, foi utilizado o Trello, com checklists das tarefas de cada membro e todas as informações necessárias ao bom andamento da preparação, como datas de reuniões e brainstorms (bem como o log deles), repositório de ideias de challenges e links interessantes, etc. O Google Docs foi utilizado na reta final para adicionarmos colaborativamente as descrições e informações essenciais de todos os challenges, para posteriormente adicionarmos no dashboard.

Fazíamos uma reunião por mês, para acompanhar o andamento, e nos últimos meses, brainstorms todos os domingos para ideias de novos challenges.

Com certeza foi uma das tarefas mais difíceis e desgastantes da preparação. Contei muito com a ajuda do thotypous pra isso, que estava sempre presente dando ideias e ajudando em tudo que fosse possível, e isso não me deixou desfalecer!

3. Criação de bons challenges:

Com certeza criar bons challenges para um evento temático requer não só um bom conhecimento técnico, mas também criatividade para encaixar na história. Foi um desafio interessante, principalmente por tentar atender às expectativas geradas pelo rating 30 que nos foi concedido no CTFTime.

A competição:

A competição em si foi grandiosa, com 1061 players e 529 times inscritos, onde 312 pontuaram. Contamos com mais de 50 challenges de qualidade, e alguns permaneceram “intactos” até o final da competição. Tivemos a ideia de adicionar challenges de Física, Eletrônica e Programação (estilo Maratona) para ajudar a atrair todos os tipos de públicos, possibilitando um primeiro contato a todos com essa maravilhosa cultura dos CTFs.

Houve uma hegemonia Polonesa no ranking em boa parte da competição, onde o p4 Team realmente se destacou e liderou quase todo o tempo, seguido pelo Dragon Sector. Particularmente, estava apostando em outros times do Top 10 do CTFTime como favoritos para vencer, foi uma grande surpresa o resultado (em relação ao p4). Os poloneses mostraram que são completos e conseguem resolver todos os tipos de challenges, realmente verdadeiros leets! Virei fã!

Gostaria de deixar uma menção honrosa para o Samurai (EUA), que resolveu a Botnet (Networking), um dos meus challenges preferidos, e para o aleksey_ch, do time MV9rwGOf08 (Rússia), que conseguiu matar o iMathze – Impossible Mathematics Maze (PPC). Realmente impressionante, fiquei eufórico quando submeteram as flags!

Menção especial também ao único time brasileiro no Top 10, Hackiticos-UFCG, que terminou em 9º. Formado por Victor Andrade de Almeida, Harllan Andryê Bezerra Silva, Marianne Linhares Monteiro e Pedro Yóssis Barbosa. Decidimos que os times Top 3 BR também receberão certificados.

Ranking Final:

Disponível em pwn2win.party/game/scoreboard/.

Top10-Pwn2Win-2016

Estatísticas:

Players inscritos: 1061

Times inscritos: 529

Times pontuantes: 312

Submissões de flags: 6534 (menos que na edição anterior, que foi só nacional e com duração de 24 horas)

Países participantes: 71

Países com mais players:

  1. BRA – 403
  2. USA – 144
  3. KOR – 42
  4. POL – 42
  5. TWN – 36

Países com mais times:

  1. BRA – 122
  2. USA – 83
  3. KOR – 29
  4. RUS – 20
  5. TWN – 18

Máximo de pontos por time/país:

  1. POL – 2165
  2. JPN – 1600
  3. ESP – 1325
  4. HUN – 1195
  5. IRN – 1100

Média de pontos por time/país:

  1. HUN – 1195
  2. POL – 614,4
  3. SVK – 465
  4. UKR – 420
  5. MEX – 395

Tráfego gerado no repositório estático (static):

  • Dia 25/03: 12,60 GB
  • Dia 26/03: 10,23 GB
  • Dia 27/03: 3,38 GB

Requisições passando na Cloudflare:

requests-through-cloudflare

Total de challenges: 53

Total de solves:

  1. Skycast: 301
  2. Attack Step: 0 (concluída pelo Dragon Sector após o evento! Detalhes aqui.)
  3. [Bonus] g00d b0y: 216
  4. [Bonus] Give Feedback: 150
  5. [Forensics] Hidden in Plain Sight: 110
  6. [Forensics] Painel Message: 7
  7. [Forensics] Dump: 21
  8. [Forensics] Brazilian Eletronics Ballot Boxes: 0
  9. [Forensics] Brazilian Protests: 2
  10. [Forensics] QR Perfect: 0
  11. [Forensics] Image Snowing: 0
  12. [Forensics] Samuel Riff Breese: 2
  13. [Forensics] Coded Image: 0
  14. [Forensics] File Burning pt. 2: 0
  15. [Forensics/Networking] Botnet: 1
  16. [Steganography] d3lc1d10: 9
  17. [Networking] Access Code: 4
  18. [Networking/Steganography] File Burning pt.1: 6
  19. [Crypto] RSA Signature: 8
  20. [Crypto] Visual Criptography: 2
  21. [Crypto] Strings Criptography: 4
  22. [Crypto] Simple Criptography: 4
  23. [Crypto/Web] Bathing and Grooming: 1
  24. [Web] Command and Control Server: 0
  25. [Web] Secure Chat: 11
  26. [Web] Facebug: 1
  27. [Web] v0t3: 104
  28. [Web] Free Web Access: 6
  29. [Rev] Sleeper Cell: 30
  30. [Rev] Suspect Router: 0
  31. [Rev] Member Management System: 37
  32. [Crypto/Rev] QTH: 1
  33. [Rev] Auswählen: 1
  34. [Python Exploitation] Tokens: 62
  35. [Python Exploitation] Secret Accounts: 13
  36. [PPC] iMathze: 1
  37. [PPC] Sequences: 36
  38. [PPC] Magic Patterns: 5
  39. [PPC] QRGrams: 6
  40. [Eletronics] Eletronic Ballot Box Prototype: 8
  41. [Eletronics/Reversing] Timekeeper’s Lock: 0
  42. [PPC-M] Sum (Hello World Platform): 182
  43. [PPC-M] Files Flag: 0
  44. [PPC-M] How to Win: 12
  45. [PPC-M] Square Infinital Spiral: 28
  46. [PPC-M] Who Wins: 10
  47. [PPC-M] Ellection System: 6
  48. [PPC-M] Death Sequence: 12
  49. [Physics] Drone Fail: 5
  50. [Physics] Build Throw: 12
  51. [Physics] People Release: 12
  52. [Physics] Dizzness Ring: 3
  53. [Physics] Pseudo Accident: 0

Top flags nonsense:

  1. Challenge People Release: “AndréSmaira,BrunoZanuzzo,LucaOttoni” – Lançaram os colaboradores? haha
  2. Challenge Member Management System: “CTF-BR{Bolsomito}” – Podemos usar isso como flag universal, tipo 42!
  3. Challenge Hidden in Plain Sight: “CTF-BR{O recipiente não é grande o suficiente.}” – Parece que não era mesmo.
  4. Challenge Attack Step: “tomcr00se”700 pontos por colocar o nome do tomcr00se? 😀
  5. Challenge g00d b0y: “CTF-BR{PAPAI NOEL}”How How How!!
  6. Challenge Facebug: “CTF-BR{abuse@digitalocean.com}”LOL?

Parceiros:

Gostaríamos de agradecer a todos nossos parceiros, que ajudaram o evento direta ou indiretamente: Projeto CTF-BR, Blusol, Infobit, Hacking n’ Roll, URI Online Judge, Arsenal Criativo, Secretaria Geral de Informática da UFSCar.

Feedbacks:

Durante a competição, pedimos feedbacks para os times, valendo 25 pontos, e recebemos 150. Boa parte deles eram positivos, enaltecendo a competição e a qualidade dos desafios. Alguns times não gostaram dos challenges de Física e PPC-M (apesar de estar claro na descrição do evento que teríamos desafios destas categorias), já outros times elogiaram a presença dessas categorias. De forma geral, o evento agradou a maioria, mas como a velha máxima nos diz, “é impossível agradar a todos”.

Conclusão:

Com certeza o Pwn2Win CTF 2016 entrou para os anais da história do hacking brasileiro como a maior competição já realizada. A nível mundial, dificilmente veremos tão cedo outro evento tão completo em termos de categorias. Conseguimos inovar com challenges realmente complexos (Bathing and Grooming, Timekeeper’s Lock, Etapa de Ataque envolvendo Kernel Exploitation ARM-based, simulando um driver real), e vários outros verdadeiramente divertidos e exclusivos (Visual Criptography, QTH, Suspect Router, iMathze, Botnet, etc). O trabalho árduo valeu a pena e estamos muito satisfeitos. Temos certeza que estamos aptos a participar das categorias “CTF: Most Innovative”, “Challenge: Most Difficult” e “Challenge: Best Crypto” do Golden Flag Awards de 2016.

Antes que nos perguntem sobre novas edições, não podemos descartar essa possibilidade, mas creio que a prioridade atual do time é voltar a jogar e se consolidar como um dos Top Teams.

Enfim, o #CTF-BR foi lançado ao mundo em grande estilo, avante! \o/

2 respostas para “Pwn2Win CTF 2016 – Bastidores”

Deixe um comentário

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