Há alguns dias completamos um dos eventos mais emocionantes que tivemos o privilégio de realizar em nosso blog — um jogo online de hacking com a destruição de um servidor.
Os resultados superaram todas as nossas expectativas: os participantes não apenas se juntaram, mas rapidamente se organizaram em uma comunidade coesa de 620 pessoas no Discord, que tomou o desafio de assalto em dois dias sem parar para dormir.
E assim terminou:

Como tudo começou e do que se trata?
O jogo começou em 12 de agosto, quando publicamos no blog um vídeo em que um hacker disfarçado de crânio convida para jogar, destruir o servidor, causar um curto-circuito na sala (ou um mini-incêndio) e pegar o dinheiro restante no triturador.
Era uma caça ao tesouro online: começamos uma transmissão no YouTube de uma sala cheia de dispositivos IoT, com um servidor debaixo da cama (que deveria ser destruído), e acima do servidor havia um aquário com um peso pendurado. Para tornar o jogo mais emocionante, decidimos criar um prêmio de 200.000 rublos, que carregamos no triturador e programamos para ligar a cada 60 minutos. A cada hora, o triturador consumia 1.000 rublos — quanto mais cedo os jogadores o parassem, mais dinheiro poderiam ganhar.

Construir essa caça ao tesouro foi uma aventura em si — tivemos que nos alimentar de entregas e dormir apenas algumas horas por noite na mesma sala. Mas o mais surpreendente foi observar o fluxo de pensamentos dos jogadores e sua entrega emocional durante o processo.
Para ser sincero, a engenhosidade dos jogadores em resolver os enigmas superou em muito nossas modestíssimas ideias: a cada minuto livre, nós acompanhávamos o chat do Discord e, em alguns casos, literalmente chorávamos de rir ao descobrir o que os jogadores estavam fazendo e como eles brincavam durante o processo.
Sete pessoas trabalharam arduamente no projeto: um programador backend, um especialista em hardware, um verdadeiro produtor de cinema, um designer CG e dois co-produtores visionários.
Contaremos em postagens futuras como a caça ao tesouro foi realizada do ponto de vista técnico, e enquanto isso, eu compartilharei a solução: como exatamente hackear esta sala na transmissão. Também vamos recordar a cronologia dos eventos, além de todas as loucas teorias iluminadas do chat do Discord.
O que os jogadores tinham no início do jogo
Todos os itens na sala eram divididos em três categorias:
- Dispositivos IoT simples de gerenciar, não relacionados a jogos
- Dispositivos de jogo para completar a missão
- Ambientação

Colocamos 8 elementos muito simples de gerenciar: duas lâmpadas, uma guirlanda, cinco letras SOUZA, cada uma das quais poderia ter sua cor alterada. Tudo isso poderia ser ligado/desligado diretamente pelo site e o resultado podia ser visualizado na transmissão — nós os tornamos acessíveis a todos os jogadores, independentemente do nível de conhecimento técnico.

Tudo que podia ser facilmente ligado pelo site
Dos elementos importantes do jogo, que eram necessários para completar a missão e cujo acesso não era tão simples:
- Um servidor com a tampa aberta e um aquário em cima
- Um peso pendurado de forma a quebrar o aquário
- Megatron 3000 — um potente ponteiro laser direcionado para a corda que segurava o peso
- Um ventilador potente que era ativado sob carga no servidor
- Um flip chart onde estavam escritos o login e a senha do Megatron
- Um telefone para o qual se podia ligar e ver a chamada ao vivo
- Um triturador que consumia uma cédula de mil rublos por hora
Como a missão foi desvendada
Deixe-me dizer: a solução era bem simples.
O objetivo do jogo era parar o triturador, causando um curto-circuito na sala. Para isso, era necessário quebrar o aquário, lançando o peso e inundando o servidor com água. O peso estava preso a um cordão, que era o alvo do Megatron. Ao assumir o controle do Megatron, a corda podia ser cortada. Isso era feito em 5 passos simples:
Passo 1. Aumentar a carga no servidor que estava na sala
Por exemplo, enviando pacotes com um comando.
ab -r -n 10000 -c 100 -s 280 -l https://ws.ooosokol.ru/captchaA dica era uma para .

Aquela mesma captcha que precisava ser atacada

Com a carga no servidor, sua temperatura aumentava e isso podia ser monitorado na tela aberta bem em frente à câmera. Em seguida, o ventilador era acionado, abrindo uma cortina leve no flip chart. Aí aparecia o login e a senha escritos no quadro de acesso à página do Megatron.
E a página de controle do Megatron podia ser encontrada ao verificar todos os certificados emitidos para o domínio ooosokol.ru.
No subdomínio A página de controle do Megatron estava acessível, mas não abria até que a energia primária fosse conectada ao Megatron.
Todos esses passos foram realizados quase imediatamente nos comentários da transmissão no YouTube. Em seguida, as tarefas foram mais difíceis, e os jogadores criaram o servidor Discord RUVDS Hack Room para continuar a discussão lá.
Passo 2. Conectar a energia primária ao Megatron
Todos os dispositivos inteligentes controlados pelo site (as mesmas luzes que os jogadores ligavam e desligavam incessantemente) tinham seus próprios identificadores.
Para conectar a energia primária ao Megatron e iluminá-lo ao mesmo tempo, era necessário encontrar e ativar um dispositivo oculto na página de controle do escritório.

Para isso, era preciso olhar os identificadores dos dispositivos e notar que, no total, havia 4 dispositivos, mas apenas 3 estavam disponíveis no site.

A página do Megatron se tornava acessível ao ativar o 4º dispositivo, e o próprio laser ficava iluminado. Mas nesse momento, não era possível disparar o laser, além de aparecer uma mensagem informando que o laser ainda não estava disponível e uma dica: o escritório teve um corte de energia, e era necessário ligar para a empresa de gestão e pedir a energização.

Dica sobre a empresa de gestão
3. Ligar para a empresa de gestão e pedir para reconectar a energia do Megatron
Por meio do LOR, o Megatron não poderia disparar porque o escritório teve um corte de energia. Somente a empresa de gestão poderia restaurar a energia, e era necessário ligar para eles e passar pela identificação como proprietário da LLC.
Encontrar o número da empresa de gestão foi fácil — nós o colocamos diretamente no rodapé.

Mas passar pela identificação foi muito mais difícil.
Ao ligar para o número +74991130688, uma operadora atendia e pedia, de maneira entediante, que fornecêssemos o CNPJ da empresa e o nome completo do proprietário. Sem essas informações, ela se recusava a restabelecer a energia, explicando que era apenas uma central de atendimento terceirizada, com 2000 clientes e escritórios, e que sem essas informações não conseguiriam localizar o necessário.
Para os jogadores, essa foi a etapa mais difícil. Eles levaram quase dois dias para encontrar o CNPJ e o nome correto do proprietário, enquanto eu (no papel da operadora da central) recebi mais de 400 chamadas nesse período. O telefone tocava a cada 2-3 minutos.
Os rapazes pesquisaram como puderam. Eles exploraram o código-fonte do site, pesquisaram o proprietário do site, Sokolov, e o buscaram nas redes sociais.
Eles procuravam o CNPJ de várias empresas.

Quase um esquema completo de busca
Em determinado momento, até ligaram com um número falsificado — como se fosse uma ligação do escritório da empresa Sokol, indicada no rodapé.
Então descobrimos quantas empresas carregam o nome Sokol. Praticamente cada uma dessas empresas era contatada pelos jogadores, mas isso não se comparava ao que o site viveu. , onde realmente compramos aquele Megatron cerca de um mês atrás.
Primeiro, o Discord atacou o suporte da Lasermasters.

Depois, conseguiram encontrar uma conta de alguém! Enquanto isso, o suporte da Lasermasters já havia se manifestado com mais clareza.
Cuidado, mantenha as crianças longe da tela


No final, decidiram simplesmente DDoS a Lasermasters e seu site caiu. O mesmo ocorreu com o site da Sokol, embora o tenhamos levantado rapidamente.
Durante a investigação, o pessoal do Discord até encontrou o ator cuja foto compramos de bancos de imagem para que ele interpretasse o principal antagonista, o proprietário da LLC, Andrei Sokolov. Descobriu-se que seu nome é Yuri e ele não tem ideia da confusão em que se envolveu.

Andrei Sokolov, personagem do jogo

Yuri, modelo
Se ele soubesse como fez 600 pessoas não dormirem por dois dias...)
Então começaram a investigar especificamente sobre mim, como o organizador do quest (o que poderia ter terminado em sucesso, se eles tivessem conseguido invadir meus canais de trabalho).

Fiquei um pouco preocupada quando mencionaram meu sobrenome e até meu CPF. Mas relaxei quando, durante o processo de telefone quebrado, de repente tive um irmão mais velho, que inesperadamente era o diretor técnico do Habra.
Meu querido irmão, que também se envolveu

Enquanto isso, as suposições se tornavam cada vez mais inacreditáveis

E chegaram até teorias iluminati.

As teorias da conspiração mais suculentas envolviam Bob Esponja, Harry Potter e o piscar de uma cordas de LED chinesa que colocamos dentro da unidade central.
De onde Bob Esponja e Harry Potter, você pergunta? Colocamos seus endereços na página de contatos da Sokol e isso gerou uma série de suposições na comunidade do Discord. Embora só quiséssemos homenagear nossas obras favoritas da infância.

Aquela referência na página ""
E como resultado





Descobriu-se que na série realmente existem documentos do Bob Esponja. Eles eram chamados de CPF

Uma das teorias mais complexas era de que a piscadela da guirlanda chinesa continha uma mensagem em código Morse.
As piscadelas foram gravadas e tentaram ser decifradas.



Das teorias mais simples — o pessoal tentava entender se havia alguma dica escondida nos mapas.

No caminho, nos comparavam com — uma avaliação injustamente alta, mas ainda assim agradável.


Os jogadores tentaram ao máximo a engenharia social. Recebi ligações se passando pela FSB, bombeiros, pelo próprio Sokolov, sua ex-esposa e um segurança que supostamente estava em nosso andar. Diziam que havia um incêndio, alguém estava preso no elevador, e a história mais comovente era de que em um escritório em chamas, supostamente estava o cachorrinho do interlocutor.

Houve também tentativas de suborno.
Gradualmente, começaram a aparecer memes próprios no chat.
Aqui estão alguns.



Enquanto isso, as fábricas estavam paradas.





Dica
O dinheiro no triturador estava diminuindo. Para que o vencedor recebesse algo, decidimos fazer uma dica. Além disso, seguindo as regras de design de jogos, aumentamos a tensão pouco antes da grande final.
Separadamente, publicamos um vídeo no blog. No início, inserimos um trecho do Clube da Luta — como uma referência a Tyler Durden, que pensava em inserir o 25º quadro nos filmes enquanto trabalhava em cinemas.
Decidimos aplicar essa mesma mecânica e inserimos a dica como o 25º quadro, como o CPF e o nome completo do proprietário.


Depois disso, o pessoal conseguiu desvendar rapidamente.
Passo 4. Disparar a laser em modo não letal.
Quando a energia foi fornecida pela empresa de gerenciamento e após a ativação dos fusíveis, o Megatron era ligado e podia disparar em modo de teste. Na forma de entrada, um token para o disparo de teste já estava inserido.

A cada 25 segundos, um novo token era gerado, podendo ser usado para ativar o laser por 10 segundos na potência 10/255.
Em seguida, o laser esfriava por 1 minuto e durante esse minuto estava indisponível, não aceitando novos pedidos de disparo.
Essa potência era totalmente insuficiente para cortar a corda, mas qualquer jogador podia disparar o Megatron e ver o feixe de laser em ação.
A reação da comunidade foi mais do que efusiva.

Mas todos rapidamente se acalmaram e entenderam que ainda não era o fim do jogo.

Depois disso, a comunidade começou a descobrir como iniciar o modo de combate.
Tempestade de ideias.


Fake news apareceram no Discord.
Não sabíamos que havia algo escrito na perna da mesa durante a transmissão.
A comunidade chegou ao passo 4. Descobrir como os tokens são gerados: encontrar o gist e gerar um token que inclua o laser em modo de combate.
O modo de combate do Megatron é 100% da potência do laser em 3 W. Isso é mais do que suficiente por 2 minutos para queimar a corda que segurava o peso, quebrar o aquário e inundar o servidor com água.
Deixamos algumas dicas em : nomeadamente o código de geração de tokens, pelo qual se podia entender que os tokens de teste e de combate eram gerados com base em um único contador. No caso do token de combate, além do valor do contador, também é utilizada uma 'sal' que foi quase totalmente mantida no histórico de alterações deste gist, exceto pelos dois últimos caracteres.

Como todos rapidamente adivinharam, isso era 42.
Nos comentários do gist, havia uma troca de mensagens entre Andrei Sokolov e o desenvolvedor ('o sábio desenvolvedor', como o chamaram os caras do Discord).
Na conversa, Andrei enviou um dos tokens de combate e o desenvolvedor respondeu que esse token foi inicializado com o valor do contador 42.

Sabendo desses dados, era possível descobrir os 2 últimos caracteres da sal e, de fato, descobrir que para isso foram utilizados números de Lost, convertidos para o sistema hexadecimal.
Depois, os jogadores só precisavam capturar o valor do contador (analisando o token de teste) e gerar o token de combate, usando o próximo valor do contador e a sal que foi descoberta no passo anterior.
O contador simplesmente era incrementado a cada disparo de teste e a cada 25 segundos. Não mencionamos isso em lugar algum; deveria ser uma pequena surpresa no jogo. Os caras rapidamente perceberam isso e ativaram o Megatron em modo de combate.
Passo 5. Quebrar a corda com o laser.

Como isso foi feito
Aqui já era tudo simples. O envio do token de combate ativava o laser em modo de combate, e a sala mudava para o 'modo de catástrofe', como chamamos no cenário geral:
- Todas as luzes da sala se apagavam.
- Os botões dos dispositivos IoT no site tornavam-se indisponíveis.
- A luz intermitente e o som da sirene eram ativados.
- O peso vermelho era iluminado.
- Na tela da televisão, iniciava a contagem regressiva para ativar o laser em modo de combate.
Demos um contagem regressiva de uma hora e meia para que todos os participantes conseguissem ligar a transmissão e assistir à final. E não era em vão: enquanto eu aguardava com o coração acelerado pelo som do impacto e o estilhaçar do vidro do quarto ao lado, toda a equipe que estava construindo o desafio, sem combinar, começou a voltar à base para ver a final com seus próprios olhos. Eles simplesmente entravam na sala e começavam a se abraçar.
Enquanto isso no Discord


Após o término da contagem regressiva, o laser foi ativado e, em dois minutos, cortou a corda — o peso voou diretamente para o aquário. Antes do impacto, na tela, uma capivara enlouquecida gritou, levantando as pequenas patas em pânico.
Como toda a equipe estava reunida lá, gravamos uma pequena mensagem para todos que lutaram pela final no Discord por dois dias e fomos abrir o champanhe:

Como calculamos o tempo de início dos comerciais e o voo do peso?
Após uma dezena de testes de corte da corda com o laser, percebemos que era uma construção muito instável — a corda parcialmente cortada ficava mais fina, sob o peso do peso se esticava, mudava de posição e o laser já não conseguia cortá-la completamente.
Então, seguimos outro caminho: duplicamos o corte, enrolando a corda com um fio de nichromo. A corrente passava pelo fio, que esquentava até o vermelho e cortava a corda em aproximadamente 2 segundos — isso nos dava uma noção exata de quando ativar a capivara gritando, parar o cronômetro e iniciar o comercial:

O que não conseguimos realizar?
Na final, uma fumaça densa deveria sair da unidade central, como se fosse um incêndio — preparamos bombas de fumaça, acendemos elas da mesma forma, mas por algum motivo elas não funcionaram (provavelmente por causa da água).
Quem é o vencedor?
O vencedor foi Arkadiy Alekseev de São Petersburgo — foi ele quem gerou o token de teste primeiro e ganhou o restante do dinheiro no triturador, totalizando 134.000 rublos.
Uma breve entrevista com Arkadiy.
Fale um pouco sobre você, o que você faz no trabalho?
Sou formado em segurança, terminei o BIT na ITMO. Trabalho como desenvolvedor web full-stack em outsourcing. Fui um estudante olimpíada na escola, incluindo em programação e matemática.
Como você soube do jogo?
Entrei no Habr apenas para ler, vi um artigo e fiquei interessado.
Quantas horas você jogou, quando se juntou?
Entrei na noite do dia em que o artigo foi publicado (ou seja, um dia antes do término). Passei a noite e boa parte do dia seguinte.
O que você gostou e o que não gostou?
No geral, gostei de tudo (afinal, eu ganhei)), mas o momento das ligações foi um pouco estressante. Tipo, ligar e verificar cada versão não foi muito legal, no mínimo, foi meio constrangedor — eu entendia que havia várias outras pessoas ligando, metade delas fazendo piadas e tentando engenharia social.
Como você entendeu como encontrar o token de combate para o Megatron?
Quando entrei, já tinham enviado spam para o servidor, mexido nos interruptores, encontrado a senha do painel de controle do laser, vários subdomínios e páginas.
Também foi fácil encontrar o perfil no GitHub e o gist com os comentários. A partir daí, o processo de geração do token e seu segredo se tornaram óbvios. Em tais quests, não é preciso ser muito inventivo, pois você pode se perder em diversas possibilidades; assim, é necessário seguir a direção que o criador da quest indica.
Levando em conta os outros subdomínios e o site de teste na Tilda, ficou claro que, após fornecer energia ao laser, seria necessário escolher um token. Assim, na mesma noite, esbocei uma solicitação aproximada para ativar o laser (com base em 4 formulários disponíveis: 1 no site ativo e 3 no teste/antigo) e tentei fazer brute force com os tokens ativos começando pelo 42 (só por via das dúvidas — talvez tudo já estivesse ligado e a página de envio do token só abrisse após fornecer o CPF e o nome completo).
Não tenho certeza se a solicitação estava correta, pois não houve tempo para verificar (afinal, só era possível checar a ativação do laser), mas já me preparei para o brute force do token com antecedência.
Além disso, havia uma lógica óbvia com os websockets e o controle de dispositivos no arquivo app.js. Havia uma sugestão forte sobre o dispositivo a9, que falhava ao enviar power: true. Tentei enviar várias coisas para ele — quem sabe, poderia haver um dispositivo adicional para desvendar o CPF, mas sem sucesso.
Depois, pesquisei outros IDs próximos àqueles dez, mas em todos estava como dispositivo desconhecido. Tentei pesquisar várias coisas, acessei chsokolow@gmail.com, enviei mensagens na página de preços, investiguei o lasermasters, mas tudo sem sucesso. No dia seguinte, fiquei no chat, pesquisando várias coisas, então surgiu o tema estego e consultei uma pessoa sobre estegsolve para imagens e GIFs (mas logicamente entendia que 99% não haveria nada, pois isso seria demais + contradiziria a linha principal da missão).
Mas, no final, também passei algumas horas analisando todas as imagens e GIFs. Liguei algumas vezes com diferentes opções de CNPJ, mas nada. Então, decidi deixar pra lá, mas lá postaram uma dica — e ficou claro que em breve o CNPJ seria encontrado, o que ocorreu. Depois, ou eu ou alguém mais (não é óbvio) enviou power: true para o dispositivo A9 e o laser funcionou, embora possa não haver relação e ele tenha simplesmente funcionado após o CNPJ. Enfim, entrei na área administrativa do laser e fiquei bastante surpreso, já que o servidor enviava o token automaticamente (e eu já estava me preparando para fazer um brute force). Ficou óbvio que o token era de teste, pois a transmissão + o bom senso + eu o verifiquei.
No código havia uma lógica para enviar o token de trabalho a algum lugar como notificação, mas, aparentemente, ou era um código incorreto, ou era necessário para outras partes do sistema. Eu escrevi um script para obter o token de trabalho atual a partir do teste e fiquei atualizando a página, tentando enviá-los — isso foi problemático, pois todos estavam constantemente apertando o botão de envio, mudando assim o token. Depois, o site caiu, o contador reiniciou, mas não importa — depois de um tempo, enviei o token de trabalho. Teoricamente, o contador estava em 58 e o token era 449a776938f7ce4cf19f8603045dca0f no momento da ativação, se não me engano. Na verdade, é isso.
Depois, eu ainda fiquei um pouco irritado com comentários como "ah, isso é tudo trivial, que sorte apenas". Bem, se você entrar na página, pensar por um minuto, escrever um script em poucos minutos, verificá-lo — então sim, é trivial. Mas eu fiz isso em 10 a 20 segundos, e depois simplesmente não consegui enviar o token por vários minutos.
Claro, poderia ter tentado escrever uma lógica para captura e envio automático, mas isso levaria mais tempo e teria um grande risco, além de que provavelmente a nuvem começaria a reclamar. A questão que realmente me favoreceu foi a última etapa — alguns algoritmos para velocidade + tempo de resposta, isso é bem a minha praia. Se houvesse uma tarefa diretamente de pentest, provavelmente eu não seria o primeiro.
Mas isso ainda não é o fim
Mal posso esperar para contar a vocês sobre toda a equipe incrível que construiu esta missão e todas as soluções de engenharia que ela encontrou. Mas este post já ficou muito longo — portanto, haverá artigos separados sobre isso, então fiquem ligados e se inscrevam no nosso blog no Habr.
Fonte: habr.com
