Olá pessoal, sou
Nikita Kurtin , curadora da Escola Superior Israelense de TI e segurança
HackerUA Checkpoint , empresa israelense líder em segurança da informação, publicou uma série de testes cibernéticos neste verão.
As tarefas foram divididas em seis categorias:
• lógica
• Web
Programação
Rede
• Reversão
Surpresa
Duas tarefas para cada direção. Neste post, vou contar como passei em apenas quatro testes, nos próximos três outros:
O Checkpoint já havia conseguido ganhar respeito e interesse de minha parte, então decidi aceitar esses desafios. No entanto, devido ao emprego, fui capaz de realizar apenas 8 de 12 tarefas (de quatro categorias diferentes). E eu consegui resolver 7 deles.
O desafio terminou oficialmente até o final de setembro de 2018.

Portanto, agora, com a consciência limpa, posso lhe contar passo a passo sobre como eu comecei a resolver os seguintes problemas:
• Desafio lógico "PNG ++"
• Desafio na Web “Os robôs estão de volta”
• Desafio na Web "Galeria Diego"
• Tarefa de programação "Etapas cuidadosas"
• A tarefa de programar "Puzzle"
• Desafio de rede “Ping Pong”
• Protocolo de desafio de rede
Desafio: PNG ++
Descrição:
Esta imagem (link para o arquivo PNG criptografado)
foi codificada usando uma cifra personalizada.
Conseguimos ler a maior parte desse código aqui (link para código python).
Infelizmente, alguém derramou café lentamente em todo o key_transformator.py.
Você poderia nos ajudar a decifrar esta imagem?Código Python:

A lógica de criptografia é a seguinte:
1. Defina o comprimento da chave (tamanho da chave) para 4 bytes
2. Leia os bytes do arquivo "flag.png" na variável "img"
3. Adicione preenchimento ao arquivo, ao primeiro múltiplo mais próximo de quatro. Preenchimento é igual ao número de bytes ausentes. Por exemplo, se o comprimento do arquivo for 29 bytes (3 ausentes), adicione três bytes com o valor decimal 3 (ASCII 0x03). Ou, em outras palavras, os bytes de preenchimento não podem estar vazios (ASCII 0x00), porque seu valor decimal é zero, o que não implica em preenchimento.
4. Defina a tecla de partida com quatro letras maiúsculas aleatórias ([AZ]).
5. Faça o mesmo com todos os bytes do arquivo, criptografando cadeias de quatro bytes por vez
a. Cada byte no arquivo é discutido por byte da chave
b. A chave é constantemente convertida em outra chave, key_transformator.transform (key) é responsável por isso
c. Bytes criptografados são adicionados ao enc_data
6. Digite enc_data (bytes criptografados) em encrypted.png
Para começar, verifiquei o cabeçalho do formato PNG e descobri que os oito primeiros bytes são os seguintes:
[137, 80, 78, 71, 13, 10, 26, 10]
Peguei os oito primeiros bytes do arquivo criptografado e os torci com esses oito bytes:

A chave do primeiro bloco ficou assim:
[85, 80, 82, 81]
E o segundo bloco - assim:
[86, 81, 83, 82]
Como cada chave subseqüente é gerada dinamicamente usando a chave anterior (key = key_transformator.transform (key)), entendi o algoritmo: adicione um a cada byte na chave anterior:
85 -> 86
80 -> 81
82 -> 83
81 -> 82
E então percebi que o nome do desafio escondia uma dica doentia.
Eu escrevi duas "funções auxiliares":
• "nextKey", que restaura a próxima chave com base na última
• “nextChar”, que restaura a próxima letra e, na maioria dos casos, simplesmente aumenta em um se cair dentro dos limites de bytes (255)

Eu converti os 4 bytes originais [85, 80 82, 81] em letras: "UPRQ" e executei o algoritmo de volta

O sinalizador foi especificado no arquivo descriptografado:
Desafio: O retorno dos robôs
Descrição:
Os robôs são legais, mas acredite: o acesso deles deve ser limitado! Confira (link)
Após seguir o link, você vê uma determinada página dedicada aos robôs. Basicamente, tudo sugere que você deve verificar a presença do arquivo "robots.txt".

Adicionando ./robots.txt ao URL, obtemos o seguinte:

Eu verifiquei ./secret_login.html e me deparei com uma página de registro

Em seguida, verifiquei o código fonte do formulário para encontrar a confirmação da senha e vi este Javascript:

Parece que quando o valor é confirmado, ele é enviado para a função de autorização, que decodifica o valor passado usando a função btoa (função de decodificação base64 em Javascript) e o compara com a string: “SzMzcFQjM1IwYjB0JDB1dA ==”.
Decodifiquei esta linha

Eu inseri o valor resultante na string da senha. Bingo!
Desafio: Diego Gallery
Descrição:
Recentemente, comecei a desenvolver uma plataforma para gerenciar as fotos do meu gato e proteger meu flag.txt. Por favor, verifique meu sistema (link para o formulário de inscrição).
Para evitar batentes no sistema de segurança, como a capacidade de incorporar código SQL, criei meu próprio esquema.
Sua breve descrição está disponível aqui (link para o diagrama)Formulário de Inscrição:

Circuito predefinido:

Depois de definir o nome de usuário e a senha do teste, obtive acesso à galeria pública do gato "Diego".
Desde que me registrei como usuário regular, achei que talvez fosse necessário encontrar uma maneira de escalar os privilégios do PE (escalonamento de privilégios). Examinando o esquema para usuários registrados, vi que a diferença entre o usuário comum e o administrador está na terceira seção do esquema, separada por três traços.
Tendo calculado que se o primeiro valor (nome de usuário) se refere à primeira seção e o segundo (senha) se refere à segunda, a função é atribuída pelo sistema imediatamente após a entrada do usuário com os direitos atuais.
Por exemplo:
INÍCIO ||| Primeiro valor ||| Segundo valor ||| usuário (Adicionado pelo serviço da web) ||| END
Minha carga útil foi a seguinte:
• Primeiro valor: "niki ||| niki ||| admin ||| END \ nSTART ||| outro"
• Segundo valor: "outro"
Isso provavelmente gerou as seguintes linhas de log:
INÍCIO ||| niki ||| niki ||| admin ||| END
INÍCIO ||| outro ||| outro ||| usuário ||| END
Depois disso, consegui fazer login como administrador e obter todos os direitos:

Pressionar os botões apenas ativa um aviso de que a bandeira está segura.
No entanto, dentro da URL, você pode ler:
35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php ? view = log.txt
Que alude muito explicitamente ao
LFI (inclusão de arquivo local) via URLEu tentei:
35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php?view=flag.txtE a bandeira era minha.
Desafio: etapas cuidadosas
Descrição:
Este (link do arquivo) é um monte de arquivos que encontramos. Temos certeza de que a bandeira secreta está oculta em algum lugar dentro deles.
Temos certeza absoluta de que os dados que estamos procurando estão ocultos na seção de comentários de cada arquivo.
Você poderia ir com cuidado entre os arquivos e encontrar a bandeira?
Boa sorteApós extrair o arquivo, você obtém um diretório chamado "archives" com dois mil arquivos dentro, intitulado "unzipme. [Number]".

Eu usei o programa binwalk para verificar o primeiro arquivo. E aqui está o que o programa me deu:

Sim, então, na seção de comentários, temos letras e números. Dicas de novo?
No começo, pensei em conectar as letras aos índices fornecidos nesse arquivo zip e verificar o próximo arquivo já com o índice 245.
Mas aqui veio uma surpresa: o segundo arquivo não estava em zip, mas em formato rar.

Portanto, eu tive que "anrarn" para chegar aos comentários:

Minha lógica era executar o arquivo no binwalk e, se eu encontrar um RAR, descompacte-o para obter os comentários. Caso contrário, visualize diretamente a seção de comentários para entender outras ações.
Meu primeiro palpite: o número é o índice de arquivos (cada um foi numerado de 0 a 1999). No entanto, descobri que alguns números são negativos, o que significa que não podem ser um índice.
Segunda suposição: o número é um salto, que pode muito bem ser negativo. Para cada número, eu precisava de um salto para o próximo arquivo. Eu sabia que se meu código pular constantemente para o próximo arquivo calculado, isso poderá criar uma pequena interceptação na forma de um ciclo e meu código ficará preso em um loop infinito. Então, eu escrevi um código python com um limite de conta. E depois de vários testes, descobri que o número 120 seria suficiente:

E a bandeira era minha:

Os outros três que descrevi no próximo post, leia, tente, ficarei feliz em seus comentários